I wanted one image to become fifty. Not fifty edits โ fifty decisions, made fast enough that I could see the shape of the space I was working in.
So I built a tool that does one thing: take a plate, map its brightness onto colour, and let me press a button until something lands. This is the plate everything below came from.
It had contrast, grain, RGB split, pixel sort โ everything you'd expect. And every output looked like the original wearing a hat. I kept telling myself it was working. It wasn't.
The actual problem was stupid: there was no contrast control at all. Nothing could ever crush. Flat in, flat out. I'd also picked palettes that were black-to-beige โ greyscale wearing a hat, same problem one layer up.
The fix wasn't more effects. It was fewer, and harder. Posterize down to three levels, crush the contrast past 90, map those levels onto colours I actually chose. The image got a structure instead of a coating.
Glitch โ RGB split, pixel sort, block displacement, scanlines. Killed three separate times before it stayed dead. It read as digital corruption when everything I liked was reading as print.
Halftone โ flattened the engraving's cross-hatching into a uniform screen and threw away the exact thing that made the plate worth using.
Mosaic โ rebuilt the image from squares, bars and triangles. Well built, and it looked like software. Every other tier reads as something that could happen to real ink on real paper.
Annotation โ bounding boxes and confidence scores stamped over the image. It was the original idea for the whole project, and it kept pulling attention off the colour.
Every single thing I cut made it better. Ten tiers of colour is what was left standing.
The tiers aren't "more intense." Each one breaks an assumption the tier below it depends on. Same plate, all ten.
Colours available in a single frame goes 3 โ 8 โ 256 โ 65,536 as you climb. T1 is a colour decision. T5 is a colour field. T10 is complete chaos โ every operator firing at once, and no two presses alike.
I spent a long time blaming the tool for speckly results. It was the source, and I had the rule backwards.
My first instinct was that clean, flat, graphic sources would work best. They don't โ not here. If a plate's brightness clusters in one place, most of the palette never appears: the bands land empty and you get two colours out of a six-colour scheme.
| SOURCE PLATE | BANDS REACHED | LARGEST BAND |
|---|---|---|
| white-paper line art | 4 / 8 | 75% |
| flat gradient sky | 5 / 8 | 79% |
| toned-paper engraving | 7 / 8 | 36% |
Half the palette invisible, on plates that looked perfectly good.
To be clear โ you can still make work you'd hang off a flat graphic plate. Two colours and a hard silhouette is a poster, and some of my favourite results are exactly that. It just isn't using the instrument. The tiers past T3 have nothing to grab, so you're running a ten-tier tool at two.
What unlocks the whole thing is toned paper, cross-hatching at several densities, deep blacks and bright highlights all present.
The squint test: if you see roughly even amounts of black, dark grey, mid grey, light grey and white, every band will fire.
Pure RGB randomness gives you brown. The generator works in hue-saturation-lightness under harmony rules โ mono, analogous, complement, split, triad โ with a hard floor on how close the three tones may sit in brightness. Break that floor and the image collapses into a shapeless blob.
Then I measured what it could actually reach. Chopping the space into 300 buckets: 264 reachable, 36 impossible. Mid-lightness greys and near-white vivids simply could not be produced, because the mid tone had a saturation floor and every palette was forced dark-to-light.
Two changes โ a tonal key control, and dropping the saturation floor to zero โ took it to 300 / 300.
The obvious move is rotating the hue. It looks like a screensaver. I built five motions and threw away four.
What survived is boil: each frame nudges every pixel slightly before quantising, so pixels sitting near a band edge land on the other side and change ink. Flat interiors barely move โ those pixels sit in the middle of a band. All the churn concentrates in the transition zones. Solid shapes hold while their boundaries crawl.
Two problems surfaced immediately. Per-pixel noise is invisible on flat areas, so the noise had to become clumped โ a coarse cell field moving as patches, with fine noise breaking up their edges.
And the same setting behaved completely differently depending on the tier: 12% movement on a two-tone image, 67% on a seven-band one, because more bands means narrower bands. Normalising the jitter against band width closed that gap from 57 points to 0.2. One setting now means one thing everywhere.
| LEVEL | PIXELS CHANGING INK | PATCH SIZE |
|---|---|---|
| ANIMATE | 5% | 15px |
| hard | 10% | 12px |
| HARD | 18% | 9px |
| harder | 32% | 6px |
| HARDER | 57% | 3px |
Ten tiers exist. The images worth keeping came from three or four of them. The loud ones only land because most of the set stays quiet โ and four whole features had to die for the rest to work.
Every time I had a hunch about why something looked wrong, counting pixels settled it faster than staring did. The plate ranking, the gamut gaps, the boil calibration โ all of it came from counting, not taste. Taste decided what to build. Counting decided whether it worked.
It makes the space visible, so you can walk around in it and pick.