All work
Tools

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.

v1.0.0
DitherGlyphDitherGlyph
The hero glyph — an ordinary portrait of Benjamin carrying a written message inside its grain. Nothing rides on top of the picture; the arrangement of the dither is the payload.
DitherGlyph interface
The maker: drop a photo, choose a look from fine to riso, pick pure or deep, then add text, voice, a face, a 3D model or any file — the capacity meter measures the picture as you go.
The itch

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.

The hard part

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.

How I built it

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.

Where it landed

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
  1. Sealed glyphs: passphrase encryption (DGCR wrapper)
  2. Lite feasibility harness: camera sim PASSES at >=6 px/module
  3. Deep mode: Lumiglyph-class density under the dither (format v2)
  4. Port Lumiglyph's real capabilities onto the container
  5. 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.

It's the version of this idea I'd been circling for months. Nothing added to the picture, and the picture still says what it was always going to say.

Let’s build something