~/tool · image to ascii

Convert an image to ASCII art, live

Drop a photo and copy plain-text ASCII. Tune it live; nothing leaves this tab or gets uploaded.

$ semaphore --charset detailed --cols 120 --color green
~/output — waiting for source – □ ✕
[ what_the_controls_do ]

What does each converter control do?

The converter samples your image on a local canvas, reduces each grid cell to one perceptual brightness value, and picks the character at that brightness's position in a ramp ordered by ink coverage. Everything below changes either how the grid is measured or which characters it can choose from. Nothing is uploaded at any point, so the whole loop runs at the speed of your own machine.

converter controls, with the range each one accepts
controlrangedefaultwhat it changes
charset 6 presets detailed Which characters the output may use. This is the single biggest lever on how the result reads — see the comparison on the home page.
columns 40–240 120 Width of the output grid in characters. Row count follows from it and the source proportions, so this alone sets the resolution.
brightness -100 … +100 0 Shifts every cell along the ramp before a character is chosen. Raise it when a dark photo collapses into solid ink.
contrast -100 … +100 0 Spreads mid-tones apart. The usual fix when an image converts to visual mush: the ramp is being used, but only its middle.
invert on / off off Flips the ramp. Off assumes light characters on a dark ground; turn it on when the output is destined for a white page.
dither on / off on Braille only. Applies Floyd–Steinberg error diffusion so each of the eight dots per cell is decided against its neighbours rather than in isolation.
color green · gray · original green Affects the on-screen render and the PNG export only. Clipboard and .txt output are always plain characters.
where the output is going, and the charset and width that survive there
destinationcharsetcolumnswhy
README banner blocks or standard 60–80 Inside a fenced code block. Around 60 columns fits a phone-width README without sideways scrolling.
SSH MOTD standard 40–80, 64 to be safe Plain 7-bit characters render in every terminal font; 64 leaves margin inside an 80-column window.
code comment header standard or minimal 40–60 Leaves room for the comment prefix inside an 80-column line.
plain-text email standard 60–72 Mail clients wrap between 72 and 78 characters; anything wider comes out as rubble.
avatar or small logo minimal 40–80 A long ramp turns to speckle at small sizes; five steps hold the shape.
photo, chat or forum post braille 100–160 Eight dots per cell keep a face readable; needs a font with braille glyphs, which every modern OS ships.
print or poster detailed 200–240 The 240-column ceiling exists for paper: export the .png and let the printer handle the resolution.

cells are not square

A monospace cell is about three parts wide to five parts tall, so the converter emits roughly three rows for every five columns. At 120 columns a square photo comes out 72 rows deep. Paste into a font with different metrics and the picture stretches — the characters are right, the grid is not.

columns beat every other setting

A sixty-eight step ramp needs enough characters before its shades read as shading. Below about sixty columns the detailed ramp turns to speckle and a shorter one — minimal or blocks — will hold the shape better than any amount of contrast.

what leaves the tab

Nothing. Production ships connect-src 'none', so the page cannot open a fetch, XHR or WebSocket even if its code tried. Only your charset and color choice are remembered on the device; image bytes never are. See privacy.