DitherGlyph
A picture whose dither is the data
DitherGlyph posterises a photograph and hides a payload inside the arrangement of the dither itself. Text, a voice clip, a 3D mesh, a face capture, any file — several at once, all lossless, all in the browser.



I kept coming back to the same idea from a different angle. Lumiglyph put data in a picture; LumiCode made it scannable. But both of them add something to the image — a frame, finders, a layer riding on top. I wanted the picture to be the file, with nothing bolted on.
If you hide data in an image, you usually have to mark where it is. That mark is the ugly part, and it's also the fragile part. I wanted no frame, no finder squares, no calibration swatch — and still a decoder that can walk in cold and read the file.
The image is posterised to a palette, and every cell gets dithered between its two nearest colours. How many pixels are bright is fixed by the picture, so the picture survives. Which pixels are bright is free — and that freedom carries the payload. Every cell describes itself: the count gives the value, luminance separates the two colours. So the decoder reads the palette out of the pixels and needs no frame at all.
Byte-exact round trip through a PNG, about 0.3 bits per pixel on an ordinary photo — 65 to 105 KB in a 2 MP picture. Three modes shipped: pure, deep at roughly sixteen times the capacity, and sealed with a passphrase. It is deliberately not camera-scannable; re-save it as a JPEG and the payload is gone. The file itself is the artifact.
Devlog
live from git- Sealed glyphs: passphrase encryption (DGCR wrapper)
- Lite feasibility harness: camera sim PASSES at >=6 px/module
- Deep mode: Lumiglyph-class density under the dither (format v2)
- Port Lumiglyph's real capabilities onto the container
- Site polish: block-level drop zones, drop pixelated rendering on downscaled canvases
If you have a format problem — something that has to survive a hostile round trip, or carry more than it looks like it carries — that's the kind of puzzle I like most.