Drop a bomb. The fuse is a tick number.
Up to a hundred players on a tile grid. Blasts travel in a cross, take out soft blocks and people, and the last one alive takes the round. It runs on an authoritative 20Hz server that lives inside serverless functions and survives them dying.
No account. No download. WASD to move, space to bomb.
Play with people you know
A private room has a code instead of a queue. Host one and send the link, or type the code somebody sent you. Nobody else can join it.
One frame of a real round
Not a drawing of the game. This page runs the simulation, seats a full room, drives them with the same policy that fills empty seats live, and draws the frame it lands on. A blast is crossing, stopped by hard blocks and by the one soft block it eats at the end of each arm. Every outlined square is a tile a running fuse will reach: the client works those out itself, which is the whole reason this game is the demo. The ringed token with the caret is the seat you would hold.
How to play
Six rules, and one of them is the whole game
Bombs go off on a fuse you can count. Everything else is about where you are standing when they do, and about whether you can get out of a corridor you just made. Play the public arena, or host a private room and send the code: a private room waits in its lobby until the host starts the round, nobody without the code can join it, and the host picks its arena out of six shapes at five sizes, which decides both how the fighting goes and how many people it seats.
The lattice never moves
Hard blocks sit on a fixed lattice and are never destroyed, so the skeleton of the arena is the same every round. Soft blocks fill most of the rest and are the part you break. Every spawn is kept clear, so nobody is walled in at tick zero.
Free movement, with the corner nudge
You move continuously and collide with the grid, no tile snapping. Push into a wall while nearly lined up with a gap and you slide into the gap instead of sticking. That one rule is most of the feel.
A bomb is a fuse and a cross
Drop a bomb on the tile you stand on. When the fuse runs out the blast travels in four directions, stops dead on a hard block, and eats one soft block per arm. A blast that reaches another bomb sets it off too, which is how one bad decision becomes four.
Broken blocks pay
Some soft blocks hide a powerup: another bomb, another tile of range, more speed. They keep whoever is losing still gaining something, and they are why the map opening up changes the game rather than just clearing it.
Dying does not stop you playing
Caught in a blast and you are out of the arena, not out of the round. You move to the walls, the border plus every tile sudden death seals, walk them, and lob bombs over them at whoever is left. As the arena closes you follow it in, and a kill from out there still scores.
Sudden death closes the walls
Past a threshold the arena closes in, hard blocks dropping from the outside inward, until somebody wins. A round ends when one player is left, not when a clock runs out, and this is what makes sure it gets there.
Architecture
A bomb’s fuse is a tick number, and that changes what has to cross the wire
This is the whole reason the game is a grid and bombs. A fuse is integer arithmetic on a tick the client already has, so there is no physics to approximate and no other player’s input to guess at.
The client predicts all of it
A client that knows when a bomb was placed knows exactly when and where it goes off, so the whole bomb and blast system is predicted locally, exactly rather than approximately.
Blast cells never travel
The blast is derived from the bomb and the bomb from a tick, so the most visually expensive thing in the game costs nothing on the wire.
And when the function dies
Every fuse in the room resumes on exactly the tick it was on. “A function dying is a non-event” stops being a sentence on a page and becomes something you can watch happen to a bomb that is about to kill you.
The shape underneath
Three pieces, one of which is allowed to die
Serverless functions are the wrong shape for realtime multiplayer in exactly one way: they die, on a schedule, at a duration cap measured in minutes. Arcbreak runs on tickroom, which is the set of pieces that makes that death boring.
01
Relay
Holds the WebSocket and nothing else. It decodes input, publishes it, and forwards whatever the room publishes back. A relay dying costs one reconnect.
02
Redis
The bus and the filing cabinet: the input and snapshot channels, the lease, the checkpoint. One publish reaches every subscriber, so the command count does not grow with the population. Bandwidth does, which is why the wire is binary.
03
Ticker
Holds a short lease, runs the simulation at a fixed 20Hz, checkpoints the room every second, and spawns its own successor before it exits. Two tickers racing resolve to one.
What you see when it happens
Nothing. Your socket is held by a relay, a different function with a different lifetime, so it never closed. The replacement ticker takes the lease, restores the checkpoint, and carries on from the tick the old one stopped at. The simulation is a pure function of state, inputs and a fixed dt, with no clock read and no unseeded randomness, which is why a restore reproduces the room instead of forking it, and why src/game/ runs unchanged in a browser, in a unit test, and on the server.
- Same tick
Handoff
- The predecessor died at tick 26 and the successor restored at tick 26. Longest gap in the snapshot stream: 10ms.
- 20.45 Hz
Tick rate
- Against a 20Hz target, over real wall time, driving a real ticker against a real Redis.
- 50 to 50
Fan-out
- Fifty publishes issued exactly fifty Redis commands and were delivered to five subscribers. Command count is flat in the population; only the bytes are not.
Those three figures come from tickroom’s verification record, and they are the only measurements this page quotes. Read the handoff as a floor: it is loopback Redis with no network hop and no cold start, so production is slower. What it demonstrates is the mechanism: a successor takes the lease, restores the checkpoint, and continues the tick count rather than resetting the room.
Six arena shapes, five sizes, up to a hundred seats.
The public arena is always open and always has a chair free: turn up alone and the simulation plays the empty seats itself, spread across the grid rather than bunched beside you, and hands each one back the moment a person wants it. Host a private room instead and you pick the arena, from a nine seat diamond up to a hundred seat rectangle.