← all projects Rack Rot

Rack Rot

StartedNov 2026

An idle game about running a homelab and losing to physics. Deploy self-hosted services, fight entropy with a limited pool of attention, and buy the automation that eventually fixes things better than you do.

rackrot.uk →

JavaScriptIdle GameBrowser GameNo Build StepGame BalanceSelf-Hosting

The game

You start with one Raspberry Pi, a wall socket and a dream. Self-hosted services earn money while they are up, and they do not stay up. Certs expire, disks fill, the OOM killer gets hungry, and sometimes it is just DNS.

You fix things by hand out of a limited pool of Focus, which is the whole point: there is never enough of it. The goal is three nines — 99.9% uptime over a rolling five-minute window — with all twelve services live at once.

The one tension

Rot accrues faster than one person can firefight. Everything else in the design serves that.

For the first eight minutes you can keep up by hand with a service or two. Then more of them land than you have attention for and uptime sags to around 94%, which is the part the game is actually about. You climb out by buying monitoring, backups, runbooks, HA and Ansible — and the recovery is deliberately not a reward for getting better at clicking. By the time you win, you did not fix the last few hundred incidents. The automation did.

Past the win it keeps going: scaling a service raises its fragility by 7% per level, so entropy scales with you and the run oscillates between three and five nines indefinitely.

Those timings are not guesses. The balance was checked by running the real game loop headless — a stubbed DOM driving requestAnimationFrame — on a greedy strategy for 100 in-game minutes, which is a far quicker way to find out that the crisis arrives too early than playing it through by hand every time.

No build step

Static HTML, CSS and vanilla JavaScript. No framework, no dependencies, no bundler, no tracking, no cookies and no accounts. Three files do the work, and the largest is the 40KB game.js holding the content tables, the tick loop and the renderer.

Saves live in localStorage. Come back later and you get offline progress, capped at eight hours — and the rack rots while you are away, which felt like the only honest way to do it.

The presentation is an ops dashboard: green monospace on black, dark only, and it honours prefers-reduced-motion. Every raster icon and the social card are generated from a single hand-drawn SVG rather than maintained separately.

There is a console API, on the assumption that this particular audience opens devtools:

RACKROT.help()
RACKROT.rates()               // gross, elec, net, rotMult, yieldMult
RACKROT.deploy('mail-stack')

Scores, optionally

There is a leaderboard, and it is off by default and sends nothing until you enter a handle and opt in. That is the only reason the "no tracking" line in the footer is still true. It runs on my own game services API, part of VCurl, the same one behind Real Time Balls — two boards, cumulative credits and best uptime, plus the twelve achievements.

Scores submitted from a browser are spoofable, because the token ships in the client; the boards carry min and max bounds rather than pretending otherwise. Players also get a [FORGET ME] button that deletes the remote record, keyed on an id stored separately from the save so wiping one does not orphan the other.

The game's ops dashboard in green monospace on black, showing an uptime readout of 2.16 nines, a rack of eight services with fix and patch buttons, a service catalogue, and an achievements panel
Mid-run at 99.308% — 2.16 nines, seven of twelve services up. photo-vault is DOWN and earning nothing, metrics-wall is DEGRADED, and the rest are quietly rotting behind their health bars. The catalogue on the right sells the next thing to deploy and the automation that will eventually keep it alive.