The duel city
Two wizards duelling over a town, at 25 ticks a second, in one bit per pixel. The same C that runs on a keyboard's OLED displays, compiled to WebAssembly and drawn on a canvas. Nobody is playing it, and it is not reading you.
Those five are page furniture. None of them reaches the world: the canvas and the pause are the shell's, and the district picker can only name one of the bounded values the firmware itself would accept. There is no control here that plays anything, because there is nothing to play.
- seed
- —
- elapsed
- —
- ticks
- —
- spells cast
- —
- damage, in pips
- —
- champions felled
- —
The link is the point
This world is a pure function of two numbers: a seed, and how far in you are. Both are in the address bar. Copy the link and the world you send is the world that arrives — the same spells, in the same order, at the same tick, down to the pixel. Not a recording of it. The same computation, run again on your machine.
That claim is tested rather than asserted. The
make web-parity gate renders the same seeds, frames and
canvases twice — once through this WebAssembly module, once through the
native library the Linux desktop shell loads — and fails unless every
byte of every frame matches.
Nothing is read
The world self-plays. The champions fabricate their own moves from the
seed, so there is no input to sample and no reason to ask for any. The
compiled module imports nothing: no clock, no network, no
storage, no host function at all. You can check that in the console with
WebAssembly.Module.imports() — the list is empty. It is not
a promise about what this page does with your data. There is no path by
which it could have any.
What you are looking at
A tower whose lit storey follows what the machine is doing, residents crossing the plaza on a civic clock, couriers, a sky that turns through four phases on a sixteen-step arc — and two champions throwing spells across it, chaining, winding up, landing and occasionally felling one another. A felled champion collapses, gets carried off and is replaced, so the city does not run down.
The town view is a 256×256 drawing layer. The other four are the keyboard's own 32×128 panels, reframed — every canvas at once, from one seed, if you want to see how little separates them.
If you leave this tab
The browser stops calling for frames, and the world stops with it. On your return it resynchronises to now rather than replaying the gap, so the city jumps forward. That is the keyboard's own behaviour, kept deliberately: a device that has been asleep catches up bounded, or it spends the battery it saved.