AUTO?Automatically stop or restart the simulation when a condition is met — e.g. reset once material falls below a threshold, or stop once captures dry up. Set to "nothing" to run forever with no automatic action.
off — runs indefinitely
STEPS 0000000Opening
reset change amount100%?How much changes each time settings get randomised — via the dice button, or via an automatic reset with "randomise on reset" enabled below. 100% is a full re-roll, 1% usually changes just one thing. Always visible because it governs the dice button too, not just auto-reset.
WHEN
combine
low cap sensitivity10no cap N steps% mat threshold20%N steps counttime (sec)piece count ≤promotions ≥
?When on, each automatic reset also re-rolls settings using the dice button's current mode (both / physics only / display only) — lets it cycle through random configurations unattended. Uses the "reset change amount" slider above to decide how much changes each time.
SIMULATION▶
×
30%
ADVANCED LAYOUT▶
pattern
pieces (white)
pieces (black)
colour
∞
2
0.50
0.20%
POTENTIAL▶
FIELD SHAPE
0.50
FIELD MOTION?Time-varying modulation applied on top of the field shape above. Leave at "none" for a static field.
0.010
0.50
PIECE RESPONSE
4
0.50
3
COLOURS▶
10px
board squares
piece palettes
100%
potential tint
presets
FIELDS▶
55%
?Arrows showing net drift direction of pieces in each region. Accumulates continuously with a slow exponential decay, so it reveals persistent currents, vortices and stagnation points rather than instantaneous motion.
EFFECTS▶
20
0
fast
40%
?A little trail of sparkles follows your cursor or finger across the board. Purely cosmetic — no effect on the simulation.
PIECES▶
tap a piece then tap or drag on the board
place: drop one piece per tap. zap: erase on tap. fill: flood-fill the connected empty region you tap into.
SOURCES & SINKS▶
tap a source/sink tile then tap or drag on the board
piece spawned by sources
50%
POTENTIAL▶
tap a tile then tap or drag on the board
+0.8
3
SEEDS▶
Two independent seeds — pin either, both, or neither. Physics governs how the run plays out; configuration governs how settings get generated by 🎲 randomize. Used to be forced together; that was more confusing than useful.
physics
configuration
what's actually driving this
PRESETS▶
curated starting points — the fastest way to see something strange happen.
CURRENT SETUP▶
SETTINGS STRING▶
every modifiable setting, as one paste-able string. board contents are not included. mainly useful for sharing a run outside the app, or backing one up — the PRESETS section above is the quicker way to load something in-app.
ART
REACTIVE BINDINGS▶
Wire a live signal to a visual parameter — as the signal moves, the parameter follows. Needs a run/loaded experiment for calibration — a binding does nothing until one exists, rather than guessing a default scale.
→
WHAT TO INCLUDE▶
pick what a raster (PNG) or vector (SVG) output includes, independently — greyed cells explain why they're unavailable. Applies to both a one-shot render and an auto-capture run below.
rastervector
glyphs (pieces)
trail?on
field overlay?on
bloom?Bloom is a raster self-composite technique (blurred copies screened over the original) — there's no vector equivalent, so it can never appear in an SVG export.
capture bodies?on
gradient
pulse
rainbow
glyphs off = flat colour dump (1px/cell) in both — pieces still show up as tinted pixels, just no drawn glyph shapes. gradient/pulse/rainbow read their colour, direction, and intensity from the live DISPLAY→EFFECTS sliders; these checkboxes only control whether each is included.
RASTER SIZE▶
VECTOR SIZE▶
AUTO-CAPTURE (EXPORT RUN)▶
steps the sim on its own — not paced to the display, so it runs as fast as this tab can go — and writes a capture to a folder every N ticks. Uses whatever WHAT TO INCLUDE / RASTER / VECTOR SIZE above are currently set to, frozen for the whole run.
Export runs need Chrome's File System Access API — this browser doesn't support it, so this is disabled here.
WHAT TO INCLUDE▶
records a WebM straight from the sim — driven by ticks, not real time. pick what the recording includes.
glyphs (pieces)
trail?on
field overlay?on
bloom
capture bodies?on
gradient
pulse
rainbow
glyphs off = flat colour dump (1px/cell, no VIDEO SIZE scaling) — pieces still show up as tinted pixels, just no drawn glyph shapes. Compact and fast on large boards, where drawing individual piece glyphs every frame would be too slow to sustain a real frame rate. gradient/pulse/rainbow read their colour, direction, and intensity from the live DISPLAY→EFFECTS sliders; these checkboxes only control whether each is included.
VIDEO SIZE▶
RECORDING▶
Capture itself still takes real time to record (one video-second per one video-second, regardless of how fast ticks step) — that's how video recording works, not something this can shortcut.
This browser doesn't support MediaRecorder/canvas capture — video export is disabled here.
mode
resolution
length
recording takes
est. file size
ENSEMBLE SETUP▶
Runs N headless replicates against the current live physics settings (whatever's configured in PHYSICS/DISPLAY right now), one different seed per replicate.
replicates (N)step budget / runbase seedmilestone poll every
steps
How often each replicate rechecks piece count for PROFILE's extinction-curve milestones. 1 = every step (exact); raise it on large boards where a full-board recount every step gets expensive (~30-60% slower at 64-256² in testing) — coarser polling trades milestone-step precision for speed.
Each replicate uses "<base seed>-r<i>" — same base seed + same settings reproduces the exact same ensemble.
WHAT WILL RUN▶
AUTOSTOP (experiment-only)▶
Independent of the sandbox's AUTO controls in the top bar — changing one doesn't affect the other. Each replicate stops on its own once a condition here is met (or runs the full step budget if action is "nothing").
action?No "reset" option here, unlike the sandbox — a headless replicate is already a single self-contained run from a fresh board, so mid-run reset doesn't apply.
when
combine
low cap sensitivity10no cap N steps% mat threshold20%N steps counttime (sec)piece count ≤promotions ≥
RUN▶
⚠ The 'time' autostop condition is enabled. It's wall-clock based, not step-based — re-running the same seed/config later can give different results.
SAVE CURRENT SETUP▶
Saves the live recipe/overrides (whatever SETUP is currently driving), plus the replicate count, step budget, base seed and autostop settings above. Not a snapshot of results — re-running reproduces, it doesn't replay.
SAVED EXPERIMENTS▶
scroll·zoom · drag·pan
STATE?Whose turn it is, total moves made, and the current move rule (diffusive = uniform random step; boltzmann = weighted toward lower potential, strength set by β).▶
WHITE0 moves
modediffusive
MATERIAL?Live piece counts and chess-value totals. Material charge is the white/black value imbalance, normalised from -1 (all black) to +1 (all white). Mean value is the average chess value per piece for that colour. Total value is the sum across all of that colour's remaining pieces.▶
material charge—
W mean value—
B mean value—
W total value—
B total value—
W captures made0
B captures made0
ENERGY?Imposed potential V is the current mean potential-field value under each side's pieces — how favourable or hostile the terrain is right now. Chess energy is the mean chess value per piece, i.e. how heavy that side's remaining army is on average.▶
Imposed potential V
W
—
B
—
Chess energy (mean piece value)
W
—
B
—
DYNAMICS?Live rolling sparklines of the last 300 moves for every tracked stat — material, chess energy, imposed potential, capture rate, pawn fraction, mean free path. A fast way to spot a trend before it shows up in the full history graphs below.▶
RUN HISTORY?Full-run graphs sampled every N moves (set below) rather than a fixed 300-move window like DYNAMICS — good for seeing the whole trajectory of a long run at once. CLR wipes the recorded history without resetting the board.▶
sample—
PHASE SPACE?Plots of one observable against another, time-coloured from dark (old) to bright (recent). Shows the system's trajectory through its state space.▶
XY
PAWN FRACTION?What share of each side's remaining pieces are still pawns. Falls as pawns promote or get captured faster than other pieces — a rough gauge of how "cooked down" each army is.▶
pawn / total pieces per side
CAPTURES?Recent captures in order, most recent first — attacker, victim, and square. Useful for catching a specific event (an explosion, a conversion cascade) right as it happens.▶
SPECTROGRAMper-row over time?One horizontal strip per board row, colour-coded by whatever that strip represents (density, colour balance, potential…), stacked and scrolling left as time passes — a live history of the board's row-by-row structure.
mode?Compressed squeezes the whole recorded history to fit the panel width. Linear draws one column per move at true scale — scroll or drag the strip below to explore, since it can run wider than the screen.?Toggle white and black pieces in and out of the spectrogram independently, to isolate one colour's pattern from the other.← scroll →
♟️ Chess Gas
a statistical-mechanics toy built out of chess
Chess Gas is a cellular automaton in which chess pieces make random legal moves on a tiled board. It was built as a way to think about statistical mechanics, emergent behaviour, and what happens if you take the rules of chess seriously as a physics — pieces as particles, captures as collisions, material as energy.
🚀 Quick start
Open the I/O tab and pick a preset — they're the fastest way to see something strange happen.
Tap ▶ to run it, or the dice (⚄) to randomise everything and see what comes out.
Tap any piece on the board to track its path. Tap it again to stop.
🧪 The basic idea
A standard chess starting position is tiled across a large board — white on the bottom ranks, black on the top. Pieces make random legal moves in alternating turns. What emerges is a two-species lattice gas: the particles are chess pieces, the interactions are captures, and each piece type has a different mobility and mass. Pawns are slow and directional; queens are fast and omnidirectional. Captures are inelastic collisions by default. Total material — the sum of piece values — can only decrease under ordinary rules, though several collision and potential modes let you break that deliberately.
📐 Board size
Boards run from a plain 8×8 up to 2048×2048. Past a certain size the board no longer fits the screen at 1 pixel per cell — zooming out further than that switches to a sampled rendering mode so huge boards stay smooth and interactive rather than grinding to a halt. At extreme zoom, isolated pieces on a very sparse board can occasionally fall between samples; that's a deliberate speed trade-off, not a bug.
🎲 Presets & randomisation
The I/O tab holds a set of curated presets — starting points chosen to show off a specific kind of behaviour (a percolating gravel field, bishops looping forever on a torus, a barrier only positively-charged pieces can cross). Pick one and tap load, then import to apply it.
The dice button has three modes, cycled by holding it down — a short tap runs whichever mode is active:
⚄ both⚄P physics only⚄D display only
Physics-only re-rolls the rules (topology, collisions, potentials); display-only re-rolls how it looks (colours, trails, effects) without touching the simulation underneath.
✏️ Editing the board
The Edit tab has three tools. Pieces lets you paint or erase individual pieces by hand. Sources & sinks lets you paint cells that continuously spawn or remove pieces, turning the board into an open, non-equilibrium system that never settles. Potential lets you paint an energy landscape directly — repulsive or attractive — that biases how pieces move without changing any rule.
🔁 Auto stop / restart
The bar under the toolbar lets the simulation stop or reset itself automatically once a condition is met — material falling below a threshold, captures drying up, a fixed step count. Combine several conditions with the gate control (any/OR or all/AND). Set the action to "nothing" to just run forever, which is the default. This bar is Sandbox-only — Experiment mode has its own separate autostop logic, and Demo mode runs its own independent auto-reset timer instead (see below), unaffected by whatever this section is set to.
🎬 Demo mode
A fullscreen presentation view with a small floating control cluster — reachable from the mode switcher (bottom bar on desktop, its own tab row on phone). Auto-resets on its own timer, cycling through curated colour/potential-field combinations by default. Several of the cluster's buttons do a second thing on a long press (hold ~half a second):
▶ / ⏸ — play/pause.
↺ reset — tap resets/rerolls now (also restarts the auto-reset timer). long-press cycles how much changes per reset, 0–100%. Background darkens as it climbs.
🎨 / 🎲 style — tap switches between curated preset cycling (🎨, guaranteed-harmonious colour/pattern combinations) and full-parameter drift (🎲, everything independently re-rolled — can look muddy, can also land somewhere curated presets never would). long-press resizes the board, capped at 512×512 in Demo mode regardless of what Sandbox was set to.
🐌🐇 speed — tap cycles simulation speed; icon tracks the band (snail → tortoise → llama → cheetah).
🎚 / ⏲ interval — tap cycles the current mode's value. long-press switches between MOVES (🎚, how often history/signal data is sampled) and TIME (⏲, seconds between auto-resets — shows a shrinking clock-ring around the button as the interval elapses).
☀ wake lock — tap toggles keeping the screen on. Turns red if the browser refuses or doesn't support it, rather than looking identical to "not tried yet."
⛶ exit — back to Sandbox.
Tapping any of these shows a brief tooltip confirming the new value — the darkening background and changing icons are meant to be readable from across a room, the tooltip is for when you're close enough to check.
💾 Import / export
The settings string in the I/O tab captures every adjustable setting — physics, display, layout — as one paste-able string. Board contents are not included, only settings; exporting doesn't snapshot the current position, and importing rebuilds a fresh board under the new rules. Use it to save a configuration you like, or to share one.
📊 Reading the physics
Material — total value on the board; strictly non-increasing under ordinary capture rules.
Chess energy — mean value per piece; a temperature proxy.
Material charge — white/black value imbalance, −1 to +1.
Mean free path — average distance a piece travels between captures.
Pawn fraction — share of each side still pawns; its decay marks a phase transition.
Imposed potential — the live mean field value under each side's pieces right now.
The Data tab has rolling sparklines, full-run history graphs, a phase-space scatter plot, and a spectrogram showing per-row structure over time — in linear mode you can scroll or drag back through the whole recorded history.
⚙️ What you can change
Topology — bounded, toroidal, cylindrical X/Y, Klein bottle, Möbius strip, projective plane, sphere. Collision rules — capture, elastic, inelastic, annihilate, explode, exchange, pacifist, convert, wololo. Promotion — random, queen, weighted, underpromotion, reflect, explode, board-match. Potential fields — barriers, gravity wells, saddles, gradients, periodic lattices, mazes, gravel, plus piece-generated halos that move with the pieces themselves. Dynamic potentials — oscillating, travelling-wave, breathing, or rotating modulation on top of any static field. Sources & sinks — open the system; spawn or remove pieces at painted cells.
⌨️ Keyboard shortcuts
Space play/pause R reset . step [/] speed
WASD/arrows pan Z/C zoom 0 reset view
Tab cycle board init F cycle field overlay T cycle trail mode
J jitter Q/E toggle panels K this page
Click a piece track its path Ctrl+drag paint potential Shift+drag paint sources/sinks
🌀 Philosophy
This is a 2009 idea, sat on for seventeen years because actually building it was a lot of tedious plumbing, and only actualised now because a language model was willing to do that plumbing in a single long conversation [7]. That's the parallel worth drawing more than any other: cellular automata had their moment of pop-cultural fashionability in the 2000s largely because home computers had finally gotten fast enough to run them for fun rather than research [1] — the compute showed up, and a genre of hobby-project followed it. The same thing is happening again right now, just with a different resource becoming suddenly abundant. It's not a coincidence that this project could only get made once that resource was LLM coding assistance rather than cheap FLOPs.
Credit where it's due and not more: Wolfram's actual theory-of-everything pitch [1] reads, and read at the time, as fairly confident crankery. What this project took from that era was its aesthetic residue: small grid diagrams, a fascination with rules simple enough to state in a sentence producing behaviour too complicated to predict, and the general permission to take a toy seriously. The direct ancestor is Leonard Richardson's Dada Chess[2] — two computer players making legal-but-random chess moves against each other, forever, live on a webpage since the late 2000s. Chess Gas takes that same core gag and asks the more physics-flavoured question hiding inside it: if pieces are just particles that collide, what does the resulting gas actually do?
The other lineage is more recent and more shameless. The specific pleasure of watching an ordinary board game get extrapolated outward into something bigger, gaudier, and increasingly unrecognisable — while the mechanical core stays exactly, legibly the same — is the whole trick of Balatro[6]. That's the drip this project is actually chasing: the feeling of a familiar ruleset getting steadily more colourful and more absurd the longer you let it run, until a plain chessboard is a two-thousand-cell gas simulation with a spectrogram.
📚 Bibliography
[1] Wolfram, S. A New Kind of Science. Wolfram Media, 2002. — less for the science than for the small diagrams, and for being the reason cellular automata briefly had a fandom in the 2000s.
[2] Richardson, L. Dada Chess, crummy.com, late 2000s. — the direct ancestor: two players making random legal chess moves against each other, forever.
[3] Anonymous stock photograph of a giant spherical chessboard, vintage unknown. — for the imagination of it.
[4] Rivet, J.-P. and Boon, J.-P. Lattice Gas Hydrodynamics. Cambridge University Press, 2001. — for how the particle-gas mechanics actually work.
[5] A vision of Netzach consciousness, received upon the breaking of a fever in the late 2000s, releasing the author from the infinite chess dimension. — this software being a Hod vision of that vision.
[6] Balatro, LocalThunk, 2024. — for the drip: an ordinary game pushed outward into something bigger, louder, and more colourful, one system at a time, without ever changing what it fundamentally is.
[7] Claude, Anthropic, 2026. — the famous vibecoder, for finally doing the seventeen years of tedious plumbing between the idea and the thing, one conversation at a time, including this page about itself.