Nature ↔ computation. Art ↔ data.
Dither is Milo's signature behaviour: the visible moment where the raw becomes the interpreted. Printmaking, scientific imaging and museum conservation, not glitch.
Original → pixels → dither → channels → interpretation → data, in 1.4 seconds, from a cached final frame.
- 01original
- 02pixels emerge
- 03dither spreads
- 04channels separate
- 05interpretation resolves
- 06data layer appears
1.4 s, print easing. Under prefers-reduced-motion the final frame is drawn at once. Frames are computed from a cached final; nothing is recomputed at rest.
Every primitive, rendered here, now.
Eighteen effects and seven matrices, each run live on one image and timed on this machine.
One nature image, 320px working width, each effect timed on this machine. Effects are adjustable, reusable, non-destructive and config-driven; the playground exposes every parameter.
A recipe is a plain object.
Tokens resolve the colours; the engine renders the same pixels in the browser and in Node.
The engine takes the config unchanged. Tokens resolve colours before the engine sees them, so the same object renders the same pixels in the browser, in a worker and in Node, where every derivative in this package was produced.
The example config from the brief
{
"effect": "tritone-dither",
"shadow": "#0B0C09",
"midtone": "#758C3A",
"highlight": "#F04A24",
"matrix": "bayer8",
"strength": 0.68,
"grain": 0.08
}
Fast enough to be invisible.
Tens of milliseconds per recipe at derivative width; nothing recomputes at rest.
Node, single thread, ≤1200px working width, 60 art and nature originals:
Node benchmark, all recipes
| recipe | n | mean ms | min | max |
|---|---|---|---|---|
| archive | 60 | 33 | 8 | 76 |
| paint | 40 | 63 | 29 | 168 |
| national-park | 60 | 52 | 15 | 105 |
| nous | 60 | 36 | 9 | 79 |
| field-study | 20 | 52 | 16 | 99 |
Browser timings appear next to each effect above and in the transition readout. Working width is capped at 1600px; previews at 720px; results cached per image, recipe and size; OffscreenCanvas used for decode where available.
- Cyberpunk glitching
- VHS tracking
- Random distortion
- Continuous recompute at rest
- Ordered, error-diffusion, halftone
- Plate separation, registration
- Edge extraction, grid sampling
- Controlled, seeded distortion