This article contains a large amount of Claude verbiage. I've edited it quite a bit and tried to remove the more obvious examples of Slop, but many of the descriptions of the visuals come from Claude which does a decent enough job.
Knights replays the turn-based solve of a spiral knight-coloring — the phenomenon from Numberphile's Red & Black Knights (Neil Sloane), with more in the Numberphile2 follow-up — then accelerates and zooms out to reveal the emergent large-scale pattern. Cells of a square spiral are claimed by K colors of pieces taking turns; on a color's turn it grabs the lowest-numbered cell that is not occupied and not attacked by any other color (same-color attacks are allowed — that asymmetry is what breeds the pattern). Controls and URL params are in the README; design notes in ideas.md.
Each pattern below has one-click live links — the solve is deterministic, so the URL reproduces the exact field. Where a detail needed a crop, the tools/shot.mjs command (with its coordinates) is included too.
The original result: just two knights taking turns, each avoiding the cells the other attacks. That alone produces the famous pattern — see the Numberphile videos linked above. More colors and odder pieces build from this.
knight ×2 · Mono palette
live (plays the build; press S for the finished view)
knight ×3 · Vivid palette
live (plays the build; press S for the finished view)
The Numberphile2 follow-up runs through other pieces and mixes. Here they are — one click to watch each one build (in every case each color is a single piece type, just like the videos):
| 4 knights | live |
| 5 knights | live |
| alfil + three-leaper | live |
| knight + antelope | live |
| knight + dabbaba + wazir ×2 | live |
| knight + zebra | live |
| wazir, ferz, wazir, ferz | live |
We've also added compound pieces — a single color that moves as the union of several leapers at once. A knight+antelope compound may step like a knight or an antelope on any given move (the standard fairy-chess reading — an OR of the moves, not a sequence). In the videos each color is always a single piece type.
Several of these unions are named fairy pieces — the compound editor recreates them (then keeps going into unnamed unions like knight+antelope):
| Mann | / commoner — wazir + ferz, the non-royal king | live |
| Kirin | — ferz + dabbaba (also preset 4, ×8) | live |
| Phoenix | — wazir + alfil | live |
| Alibi | — dabbaba + alfil | live |
| Squirrel | — knight + dabbaba + alfil, every cell two away | live |
| Frog | — ferz + three-leaper | live (×3) live (×5) |
Rider-based compounds like the Amazon (queen + knight) aren't reachable — this sketch has only leapers, no sliding pieces. Beyond the named ones, mixing different reaches into one piece is what breeds the wilder fields below.
wazir+ferz ×4 + knight+antelope ×4 · Vivid palette
Pairing four king colors (wazir+ferz, which cover every near neighbor and so build big coherent domains) with four knight+antelope colors (two reaches at once, which can't settle) splits the field cleanly: the king colors win the calm geometric pinwheel at the center, and the restless knight+antelope colors are pushed out into an ornate, carnival-like frame. The character holds at every zoom — only the core-to-frame ratio shifts.
wazir+ferz ×4 + zebra ×4 · Vivid palette · extent 300
Same king colors (wazir+ferz) as the rose window, but paired with a single long-reach piece (zebra) instead of the knight+antelope compound. A pure long-reach piece can't build domains of its own, so rather than forming an outer frame it dumps all its interference at the spiral origin — flipping the composition: a calm radial frame around a busy core, the rose window turned inside out.
Two details near the core reward a closer look:
live (plays the build; press S for the static finished view)
dabbaba ×3 + ferz ×3 · Vivid palette
Two colorbound pieces, but with very different fills: ferz lands densely and reads in full Vivid color, while dabbaba's sparser jumps leave its domains looking washed-out and dusty. The contrast gives the whole thing a faded, antique-watercolor palette you don't get anywhere else.
The fun part is the extent. The solve is identical toward the center either way, so the extent-300 field is just the middle of the extent-1000 one — but pushing out to 1000 lets whole new color regions appear and butt up against that same familiar core:
Two of those new regions up close:
URL='https://chrismo.github.io/screensavers/knights/?groups=dabbaba:3,ferz:3&extent=1000&speed=0&palette=0&nopanel=1'
# strata (right) and drips (lower-left):
node tools/shot.mjs "$URL" strata.png 5000 --size 1500,1500 --clip 1145,466,355,310 --scale 3
node tools/shot.mjs "$URL" drips.png 5000 --size 1500,1500 --clip 307,1021,430,420 --scale 3
knight+three-leaper ×6 · Vivid palette · extent 300
It carries a couple of anomalies riding in the weave:
live (plays the build; press S for the static finished view)
URL='https://chrismo.github.io/screensavers/knights/?groups=knight-threeleaper:6&extent=300&speed=0&palette=0&nopanel=1'
# the island (top-left) and the red bar (lower-right):
node tools/shot.mjs "$URL" island.png 3500 --size 1500,1500 --clip 79,71,280,240 --scale 4
node tools/shot.mjs "$URL" bar.png 3500 --size 1500,1500 --clip 1215,1245,280,255 --scale 4
wazir+ferz ×2 + knight+dabbaba ×2 + zebra+antelope ×2 · Vivid palette · extent 300
live (plays the build; press S for the static finished view)
ferz ×4 + wazir ×4 · Vivid palette · extent 100
Those empty cells are an anomaly — a spot the rule left blank and never came back to fill. Because ferz is colorbound, the cells it gets blocked on all fall on the same sublattice, so the empties line up into a short row instead of scattering. Short-reach colorbound pieces tend to make these linear anomalies; longer-reach pieces make scattered point ones instead.
live (zoomed in at a small extent so the anomaly is easy to spot)
URL='https://chrismo.github.io/screensavers/knights/?groups=ferz:4,wazir:4&extent=100&speed=0&palette=0&nopanel=1' node tools/shot.mjs "$URL" dots.png 3000 --size 1200,1200 --clip 600,450,250,90 --scale 6
alfil ×4 + wazir ×4 · Vivid palette · extent 1000
live (plays the build; press S for the static finished view)
URL='https://chrismo.github.io/screensavers/knights/?groups=alfil:4,wazir:4&extent=1000&speed=0&palette=0&nopanel=1'
# the two biggest peaks, bottom-left of the range
node tools/shot.mjs "$URL" zoom.png 5500 --size 2000,2000 --clip 100,1600,400,400 --scale 1.6
knight ×4 + knight+antelope ×3 + dabbaba+three-leaper ×1 · Vivid palette
These only appear once long-reach compound pieces are in the roster: a single far-away piece (antelope reach-4, three-leaper reach-3) can veto one specific cell deep inside another color's territory, seeding an anomaly. Two kinds show up — interior islands (specks deep in a solid field) and domain-wall anomalies (blooms along the borders). Plain short-reach knights can't reach in like this, so you mostly see clean domains instead.
live (plays the build at full tilt; press S for the static finished view)
URL='https://chrismo.github.io/screensavers/knights/?groups=knight:4,knight-antelope:3,dabbaba-threeleaper:1&extent=1000&speed=0&palette=0&nopanel=1'
# the three bugs + red/yellow corner (they sit at world (752,756) -> (810,810) -> (848,848))
node tools/shot.mjs "$URL" bugs.png 3500 --size 6000,6000 --clip 5225,399,420,420 --scale 3
knight ×7 + antelope ×1 · Vivid palette · extent 500
The same anomaly species turns up twice — and lined up the same way:
The striking part: every anomaly the antelope seeds runs along the same diagonal — its own [4,3] move-line. So a lone saboteur gives the whole field one consistent grain. It's the same idea as the crosshair anomaly (a piece's symmetry printed as a shape); here the piece's reach direction is printed as the orientation of every anomaly. The menagerie below uses two different long pieces — two crossing grains — which is why its critters look so much more tangled and varied.
live (plays the build; press S for the static finished view)
URL='https://chrismo.github.io/screensavers/knights/?groups=knight:7,antelope:1&extent=500&speed=0&palette=0&nopanel=1'
# the ring-string (red, upper-right) and the island (green, lower-right):
node tools/shot.mjs "$URL" rings.png 4000 --size 1600,1600 --clip 1260,0,340,340 --scale 4
node tools/shot.mjs "$URL" island.png 4000 --size 1600,1600 --clip 1400,1400,200,200 --scale 4
knight ×6 + knight+antelope ×1 + dabbaba+three-leaper ×1 · Vivid palette
A close cousin of the three bugs, bred to be an anomaly farm. The knight ×6 base builds big clean domains; the two minority long-reach compounds — knight+antelope (reach 4) and dabbaba+three-leaper (reach 3) — reach deep inside those domains and along their walls to seed an unusually wide variety of anomalies. And because the solve reorganizes at every scale, each extent is a different field — the deterministic nesting means the same critters are present at all of them, just shrunk.
The same roster at four extents — each a wholly different composition:
And the critters that turn up when you zoom in — a rough field guide:






These sort into two axes — anomaly shapes (blob island · ring-string · crosshair · caterpillar/worm · wall-bloom) and boundary types (clean sawtooth · interdigitated comb · spiny) — captured in the taxonomy notes.
# the critters each sit at a different extent — this helper swaps it per shot
G='knight:6,knight-antelope:1,dabbaba-threeleaper:1'
shot() { node tools/shot.mjs "https://chrismo.github.io/screensavers/knights/?groups=$G&extent=$1&speed=0&palette=0&nopanel=1" "$2" "${@:3}"; }
shot 200 caterpillar.png 3000 --size 1200,1200 --clip 230,763,200,200 --scale 5
shot 600 caterpillar-adrift.png 5500 --size 1200,1200 --clip 1116,22,66,58 --scale 8
shot 200 crosshair.png 3000 --size 1400,1400 --clip 1037,1038,190,165 --scale 6
shot 300 worm.png 3500 --size 1400,1400 --clip 192,708,175,55 --scale 7
shot 300 spines.png 3500 --size 1400,1400 --clip 874,704,430,340 --scale 3.3
shot 700 ornate-corner.png 5500 --size 1200,1200 --clip 1095,0,105,105 --scale 6