Rack Rot
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.
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.