essentialism
44 editions · fully on-chain · Tezos · 2026
In November 2022 I worked through Andy Haskell’s tutorial Convert images to mosaics in p5.js and kept going with it, randomizing the dot size and feeding it my own photographs. I called the test outputs Essentialism and never released them. The column-of-dots structure is his. This is that sketch, rewritten to live entirely on-chain in under 10 KB.
It remembers two of my photographs, each reduced to a 28×38 grid of grey. Both are minted on Ethereum. The first is Blue Tree, 2023; the tree itself was removed after a storm that December, so the picture outlived its subject. The second is Natural Gradient, 2023, an unedited sky with its full resolution stored permanently on Arweave. The originals are permanent, unlike the memories.
Each edition remembers less than the one before it. Edition 1 samples its photograph at full strength. Edition 44 is mostly grain. The memory percentage is written into every token.
Collect on bootloader
objkt’s on-chain generative platform. Each mint draws its seed from Tezos block entropy.
The working log
Where the algorithm came from, what was changed to get it on-chain, and who changed it. Including the bugs.
The editions
Every edition that has been minted, as bootloader renders it. Each one draws its seed from Tezos block entropy at the moment of the mint, so nobody — including me — knows what an edition looks like until it exists.
Loading from the chain…
Select an edition for its traits and on-chain detail.
Playground
The real generator, running in your browser with bootloader’s exact seeding. Shuffle for a new seed, or drag the edition slider to watch one seed forget its photograph. These are explorations of the space, not previews of any edition — mints take their seeds from the chain.
The space
Twelve seeds, spread across the edition run. Every one is drawn live by the same code that is stored on Tezos.
2022
The sketch this came from is still public, bugs and all. I built it by working through Andy Haskell’s mosaic tutorial — his program walks down columns of dots and asks the image for a color at every step — then randomized the dot size and pointed it at my own photographs. Below is one of the nine test outputs I saved in November 2022 and never released. I was learning p5.js at the time.
What changed
The column structure, the dot spacing constant, and several variable names survive unchanged — that structure is Haskell’s. The photograph does not survive: on-chain there is no room for one, so the image became two grids of grey and the palette became five inks sampled from my earlier work.
The 2022 sketch also called noise(50, 100)
as if it took a range. It does not, so the dot-size variation the
sketch advertised never actually ran. That is fixed here, four
years later.
The odds
Every trait is decided by the seed except memory, which is decided by the edition number.
| Trait | Values |
|---|---|
| density | air 50% · field 38% · full 12% |
| inks | two 56% · three 30% · four 10% · one 4% |
| source | blue tree 87% · natural gradient 13% |
| paper | blush 28% · ivory 22% · rose 20% · fog 12% · overhead blue 10% · night 8% |
| ember | present 55% |
| memory | not random: 100% at edition 1, falling to 12% at edition 44 |
Every edition also carries its own trait line inside the artwork, in the
SVG’s desc
element. View source on any token and it will tell you what it is.
The code
Under 10 KB and stored on Tezos. The code below is not served from this site — it is read out of the contract when you open the page, then compared against the source of the function this page actually ran.
Reading from the contract…