image-to-ascii — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited image-to-ascii (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Convert an image file to ASCII art from the command line — to stdout, a .txt file, or a rendered .png/.svg — using shape-aware glyph matching. The converter is scripts/image_to_ascii.py: Pillow-only, pure-Python, Python 3.9+.
(" .:-=+*#%@"). That is nearest-neighbour downsampling — every cell is treated as a pixel, so edges come out jagged and curves look like staircases.
6D shape vector (six staggered sampling circles in a 2×3 grid) and matches the glyph whose shape is closest. A diagonal edge picks / or \, a top bar picks "/^, a base picks _. Edges stay crisp because shape, not just average brightness, drives the choice.
match reflects the real ink — and png/svg output draws with that same font, so the rendered image is self-consistent with the text.
@, #), which looksright as text on a light background (a README, a .txt). For light-on-dark output (terminal style, e.g. white-on-black), add --invert.
For the full technique — circle geometry, the contrast-enhancement formulas, the luminance coefficients, caching — read references/technique.md.
The converter needs Pillow (nothing else):
python3 -m pip install PillowThe monospace font ships in assets/DejaVuSansMono.ttf (with its license), so output is deterministic on any machine. No system fonts are required.
# Print 80-column ASCII to stdout
python3 scripts/image_to_ascii.py photo.jpg --cols 80
# Save a .txt for a README
python3 scripts/image_to_ascii.py logo.png --cols 100 --out logo.txt
# Render a PNG, white text on black (terminal look — note --invert for correct tones)
python3 scripts/image_to_ascii.py photo.jpg --cols 120 --invert \
--format png --fg white --bg black --out photo.png
# Sharper edges on a high-contrast logo / 3D render
python3 scripts/image_to_ascii.py render.png --cols 100 --contrast 4 --directionalRun from the skill directory, or pass an absolute path to the script. Batch a folder with a shell loop over the files, reusing the same flags.
| Flag | Default | What it does |
|---|---|---|
--cols / --width | 80 | Output width in characters (rows follow from image aspect) |
--contrast | 1.5 | Global contrast exponent (1 = off); separates light/dark |
--directional | off | Sample neighbours too, to sharpen hard edges (see below) |
--directional-exp | 2.0 | Exponent for directional contrast |
--invert | off | Map bright pixels to dense glyphs (light-on-dark output) |
--charset | printable ASCII 32–126 | Glyph set to match against |
--cell-aspect | from font (~1.94) | Character height/width; the default keeps the picture undistorted |
--out | stdout | Output file (format inferred from extension) |
--format | txt (or from --out) | txt, png, or svg |
--fg / --bg | #000000 / transparent | Colors for png/svg (name or #hex) |
--color | off (mono) | Colorize each cell with the image's average color |
--font | bundled DejaVu Sans Mono | Override the .ttf |
--font-size / --line-height | 14 / 1.0 | png/svg rendering size and line spacing |
txt (the default), default polarity. Keep --cols ≤ thewidth you can display; 80–120 is typical.
png. Use --invert --fg white --bg black for a terminalaesthetic, or default --fg dark on a light --bg for print.
svg (vector, themeable later via the font-family).--contrast first (e.g. 4),then add --directional. Directional contrast mainly helps hard colour boundaries; on soft photos it can over-sharpen, so it is off by default.
txt to stdout (terminal only — saved .txtstays clean), and per-glyph colors for png/svg.
textmode-js.
converts pictures.
The shape-vector technique is from Alex Harri's "ASCII characters are not pixels". The circle geometry and contrast math are ported from the MIT-licensed ascii-img-react package. The bundled font is DejaVu Sans Mono (license in assets/DejaVuSansMono-LICENSE.txt).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.