A top-down shooter whose enemy builds a model of how you move and aims where you are about to be. Every panel around the arena is reading that model live while you play.
It really does start empty — every weight in the layer that decides what it does is zero. With nothing learned, each decision is an even coin flip, so round one opens with it firing, reloading and turning at random. It has your keys and no idea when to press them. It is shaped within seconds: over one minute, with nothing differing but whether the player pulled a trigger, it went from 6 shots to 56. A rival you Continue is the exception — it walks in with everything it learned about you last time, and never flails at all.
Between rounds it studies you and practises against a copy of itself. A longer pause means more practice per round — switch it between normal and long in the bar below.
Nothing is uploaded, ever. The model of you is saved in your browser only, so the Mirror can remember you between sessions — it never leaves your machine. When a saved rival exists the game asks before anything happens: Continue picks the fight back up, Quick play faces a blank Mirror and keeps nothing from that session, and New story erases the rival for good, once you confirm it. That card is the only thing that ever erases the memory — New fight in the bar below just starts a new world and leaves it alone. No account, no tracking, no analytics, no network requests at all.
Plain ES modules, no framework and no build step. The 3‑D is drawn by hand on a 2‑D canvas and the network is about a hundred lines of arithmetic. Every room is generated from a seed rather than authored.
Three columns on one plate. The plate is the control — the score a thing that learned nothing would get — and each column is what the policy took past it. Zero means no better than the obvious answer.
hands — did it call your new key set at the moments you change keys, against the best no-learning guess. aim — the direction you turned, against your commonest direction. trigger — whether its trigger reads higher on the frames you fired, against firing at your average rate.
Every frame is scored before it is trained on, so no column is a memory of the training set.
Hands, aim, trigger — how much of each is yours now, past what plain guessing would get.
The actual network, live: 43 numbers in, two hidden layers of 64, and the decisions out — four keys, the choice of turn, the trigger, the reload. The pulse is one decision crossing it, about twelve a second, and its brightness is how much the layer it is passing is actually doing. The marks on each slab are real activations, sampled across the whole layer.
The weights — there are thousands, and any picture of them is a grey rectangle. You are watching the thinking, not the wiring.
This one policy, plus a small dedicated reload net trained the same way from the same frames, is everything. There is no scripted bot behind it — no orbit, no peek timer, no routing, no cadence written by hand.
Its whole brain, thinking — one pulse per decision, live.
A staircase of the whole session, one tread a round: the wide blue treads are your kills, the narrow red steps behind them are its. It is kept as it happens, never rebuilt from a summary afterwards.
It learns killing from exactly one source: watching you win. If you have never killed it, it has never seen a kill. A round only ends when somebody dies, and between rounds it takes one rehearsal step against a frozen copy of itself and keeps what worked.
Every frame of you it has watched — and the kills the whole game turns on.