128-bit pixels mixed and inflated by a 73751-byte WebAssembly module
Run
Start chooses the first lattice; Reset starts again from it, Random from random bits. A turn runs the four swap phases, the median passes and the rewriting, then one frame is drawn; Speed sets how many turns a second. Threads splits the grid into horizontal bands, one Web Worker each, bit-identical to a single thread. Click a pixel to inspect it; shift-drag paints ones, ctrl-shift-drag zeros. Keys: space play/pause, n step, r random.
60 turns/s
Mixing neighbours trade bits · entropy increase through gene swapping
Every pixel is a 128-bit string on a plane with edges. A swap phase pairs each pixel with one neighbour, left–right or up–down at an even or odd offset, so in a turn it exchanges once with each of its four neighbours. Where two strings differ, the 32 bits around that position in each pixel are hashed together, and every position whose hash falls below the threshold is exchanged: a uniform crossover that conserves the set bits. p runs along the x axis from the left-edge to the right-edge value, shaped by the Gradient power; the crossover rate is 2p(1 − p), so 0 and 1 are the identity and 0.5 the strongest mixing. Mutation flips a random share of all bits.
p = 0.00
p = 1.00
More settings
0.20
Settling majority vote per bit plane · entropy decrease through median filtering
A pass works on each of the 128 bit planes separately: a bit that disagrees with the majority of its neighbourhood, the 3 × 3 block by default, takes the majority value when the hash of the pixel's 32 surrounding bits falls below the threshold. p runs along the y axis from the top-edge to the bottom-edge value; Passes sets how many passes a turn.
p = 0.00
p = 1.00
Rewriting a decoder or CPU rewrites every cell · the local changer
Every pixel's 16 bytes are replaced by what the changer makes of them. A Decoder reads them as a coded stream and writes what it decodes back: the LZ decompressor copying from the dictionary, Deflate, LZ4, Snappy, a Brotli-like coder, a prefix code, Morse, Rice residuals, WebP's boolean decoder, PNG filters, a JPEG block or the codebooks. A Transform applies a fixed rule such as invert, reverse, sort or a DCT. A CPU runs the bytes as its whole memory for the chosen number of instructions and writes the memory back. With Cells set to pairs, two neighbouring cells are joined into one 32-byte cell for the changer and split back afterwards; with a CPU or the LZ decompressor, pairs instead carry persistent link machines, one per direction, each running one instruction per phase. The dictionary, the skipped bits, the cursor read range and offset and the longest copy shape the decoders that use them; the inspector below the lattice shows what the selected cell decodes to. With "random start on change" ticked, choosing another dictionary starts again from random bits; otherwise the running lattice keeps its cells and the new dictionary takes over from them.
More settings
6
→ 12 bits
+0
N = 3
Display rendering
Each pixel's colour is the average of its 16 bytes' colours through the palette, stretched around the previous frame's mean. Frames pass through a render buffer, an exponential average with a half-time of 200 ms or 4 turns in two stages, so flicker is damped; temporal sharpening adds back what a slower third stage has not yet followed; cycles of 2 to 8 turns show as column phases mixed with the cycle mean; spatial sharpening comes last. None of this feeds back into the lattice. Scale 1:1 maps one pixel to one device pixel.
0.00
More settings
1.00
0.12
What you see. Every pixel is a 128-bit string. Each turn its bits are traded with the neighbours, a median filter settles some of them, and a decoder rewrites the whole cell from a dictionary. The colour is the average of the cell's 16 bytes through a palette, so like bytes make like colours. Click a cell to read it; Help, at the top of the controls, explains every section and control.
Turn
0
Bits moved last turn
0
Bits median-filtered last turn
0
Pixels rewritten last turn
0
Entropy of the byte distribution
–
Byte histogram
Render half-time
–
Segment influence bits of the other half's new content that change when one half is replaced by random bits
–
Link CPUs
off
Total set bits
0
Turn time
–
Swap order
UD0 LR0 UD1 LR1
Bits mutated last turn
0
This cell: what it holds and what it decodes to
Pixel
–
128 bits
–
Dictionary
–
Decoded
–
Decoder
–
Code
–
Byte LUT
byte 0 … 255: 256 colours spread as far apart as the RGB cube allows (257 points placed to maximise Σ ⁴√(distance to the nearest other colour), the eight corners pinned, white left out so every byte shows against the page; the closest two colours are 44 apart on the 0–255 scale). Which byte gets which colour is tuned to the dictionaries: the frequent bytes of each one (Latin letters, the UTF-8 bytes of Han, Armenian, Cyrillic, Georgian, Arabic, Devanagari, Hangul and kana text) are kept as far apart in colour as the palette allows. A pixel shows the average of its 16 bytes' colours, stretched 3× around the previous frame's mean colour. Bytes that occur in the dictionary:
Help, at the top of the controls, explains every section and control; the repository's docs folder goes deeper.