A 15-second loop. Nine lives. One way out.

▶ Play it right now — no install: game.opxz.dev Desktop browser, sound on — every note you'll hear is synthesized live, and the whole story reads itself aloud. Move ← → / A D · jump ↑ / W / Space · R rewinds the loop · Esc pause · M mute.

Title screen — THE NINTH ECHO

Inspiration

Cats have nine lives — and time-loop games make you spend lives anyway. We fused the two: what if dying or rewinding didn't just reset the room, but left behind a ghost of you that replays your last run, input for input — and every puzzle demanded cooperation with your own dead? Then we asked the harder question underneath: if a machine could steal a cat's nine lives, what story would it be trying to forget? The glowing dark borrows from Hollow Knight; the narrator telling your tale in past tense owes a debt to Prince of Persia; the ending you must choose, to Infamous 2.

What it does

You are a cat trapped in the Loom, a machine that broke time. Each chamber runs a 15-second loop. Press R and the world rewinds — but a life stays behind: an echo that repeats your last run exactly. Echoes hold pressure plates, shove crates, and stand in spike pits so the current you can walk through the doors they keep open. Nine lives per chamber. Spend them wisely.

An echo holds the floor plate while you climb

Twenty chambers descend through five biomes, each teaching the loop a new trick — holding, chaining, weighing, sacrificing, ascending, marching, a genuine paradox — and, further down: water that rises on the loop's own schedule and drowns a parked echo at the same tick every time; memory tiles that want your footsteps back in order; bells that must ring low-far-high; a mirror room where every spent life returns reflected, left and right swapped; and Death's counting — every hundred-and-twentieth tick, anything that moves is seen, so freezing an echo makes it safe: red-light-green-light with your own dead. Between the biomes fall three passages — THE DROP, THE SEAM, THE VEIN — with no puzzle, no timer and no life count, so each change of colour lands on a held breath.

The atlas — a branching descent through five biomes

The descent branches. Twice the Loom stops you and asks — two doors, no menu, walking through one commits you: Who was the story for? (the child's flooding road, or the mother's corridor of bells) and Give me your dead? (the tithe — one chamber walked alone, rewind refused, the Loom holding your echoes — or the long way, every life yours to spend and mourn). Your answers change whose side of the tale you hear, how the vigil looks, and which endings the heart will offer.

A canto card — the Loom's gold voice against the narrator's

Wrapped around the puzzles is one continuous folktale told in two voices — and read aloud by the browser itself. THE LOOM taunts you in gold uppercase; a lowercase narrator tells your tale in past tense and, at the bottom, reveals itself as the First Cat, grieving the machine humans built to steal its gift. The synthesized voice even drops half an octave whenever the Loom speaks. Beneath the Loom's tale hides an older one — the First Telling: a cat, a door, a child, and Death coming up the lane on the sixth night, counting. Eight Night bells are hidden across the descent; ring one and one night of that first story is told, from the child's side or the mother's depending on the door you walked through. The ninth night is the hole in the narrator's memory — it can only be lived, at the bottom. Petrified husks speak their epitaphs when you stand close, and before the finale a vigil plays: every life you spent rises out of the floor and walks in beside you.

Then the First Cat — a boss in three phases, fought entirely with the loop itself. First the seals: three held at once, two directly under a sweeping gaze, so the echoes you park there burn off unless you time each drop against the sweep. Then the shuttle: the machine weaves faster and Death's counting joins the beams. And then no fight at all — the beams stop, the room is a child's room, and there is a door.

The First Cat mid-sweep, beams crossing two held seals

Five endings — break the Loom, stay in its warmth, wear it, sever the threads with a Claw assembled from three hidden shards, or — carrying all eight Nights — stand at the ninth door and simply be still: the one verb the game never asked of you. The ninth door opens both ways.

And you are never alone. Clear a chamber and your winning run uploads — three arcade letters and all. Other players then watch your golden echo cat solve the room beside them, live, and race your time on the per-chamber leaderboard. A whole run is a few hundred bytes, because…

How we built it

…the simulation is deterministic, and determinism is the game. The core is a fixed-timestep 60 Hz simulation in dependency-free vanilla JavaScript: input is recorded per tick as a bitmask, and a ghost is just that byte array replayed through identical physics in an identical tick order (boxes → ghosts oldest-first → player → plates/doors). No randomness, no wall-clock, no physics library. That one property pays for everything: local echoes, the rewind cinematic (your actual history played backwards), online echoes that replay byte-exact on a stranger's machine, and automated playtesting.

On top sits a three.js WebGL presentation layer — bloom, dynamic point lights, depth-extruded chambers, particles, a camera that leans toward the cat — which only reads sim state, so the visuals can never desync a replay. The cat itself is pure code: bezier tail, squash-and-stretch, blinking, drawn to a canvas texture billboarded into the scene. Leave it alone and it sits down; it pins its ears flat when a warden's gaze is winding up.

Every sound is synthesized at runtime with WebAudio — zero audio files. All five biomes play the same motif over the same chord shape, but root, interval colour, timbre, filter, and pacing are re-tuned per biome, so the score darkens as you descend: a rain-blue triangle wave at the top, an ember sawtooth at the heart, and a tritone in the sub for the finale. The narration rides the browser's own speech synthesis — no voice files either.

Online play is a small Node/Express service behind Caddy (auto-HTTPS) on our own Google Cloud VM at game.opxz.dev — systemd-managed with JSON-file persistence and a Firestore mirror, so the demo can't die mid-judging. Remote echoes replay inside a sandboxed shadow world; they can never touch your puzzle.

Challenges we ran into

Determinism is unforgiving. One tick of divergence and an echo misses its plate three runs later. We locked the update order and kept every simulation step free of randomness and wall-clock time. One flush-walk landing exactly on a tile boundary let cats slip through closed doors until we added a half-pixel epsilon to the never-crush rule.

Level design was the other beast. Several "obviously fine" rooms turned out to be geometrically impossible — one wall was 90 px tall against an 82 px jump. So we built a bot that drives the real physics through full multi-ghost solutions and machine-proves every room solvable:

bun run proof   # 29/29 chambers proven, non-zero exit on regression

That proof then convicted our own boss fight. In its first version every seal sat outside every beam column — a few echoes could park and open the exit before the first lethal window ever arrived, and the gaze threatened nothing. Rebuilt, two seals now stand inside beam bands, each echo burned off if it arrives too early, and the exit only holds open in the gap between strikes. The bot has to thread that gap — and clear all three boss phases through their schedules, not around them — or the build doesn't ship.

Accomplishments we're proud of

The proof ships in the repo and gates the game — 29/29, water, mirrors, bells, counting and every boss phase included. The simulation core is byte-exact enough that a stranger's few-hundred-byte recording replays perfectly on your machine — that is the online feature. It's type-checked with no build step (tsc --checkJs), so the browser runs exactly what's in the repo. And the whole thing — engine, twenty chambers plus three passages across a branching descent, a folktale in two voices read aloud, a hidden second story told over eight Night bells, five endings, a synthesized score, online play — was built in one ~30-hour sprint.

What we learned

Record-and-replay is a superpower: make the simulation deterministic and you get ghosts, rewind cinematics, and automated playtesting nearly for free. And the automated playtest turned out to be a design critic, not just a regression test — it was the bot, not us, that noticed our boss couldn't kill anything.

What's next

More paradox rooms (echo-vs-echo interference is barely explored), a speedrun timer, and touch controls for mobile.


Twenty chambers. Three passages. Nine lives. One cat. Go down. game.opxz.dev

Built With

Share this project:

Updates