The old renderLoop rebuilt the whole DOM every tick and had to bail
out entirely while a <select> was focused to avoid closing it.
refresh() now patches only values that drift on their own
(points/rate, crashes, log lines) in place, leaving the deploy form
and buttons untouched, while render() still handles the structural
rebuilds triggered by user actions.
Adds a Dockerfile, nginx config, docker-compose.yml, and a Gitea Actions
workflow (mirroring goonk's), so rack builds and ships as its own image
rather than being embedded in goonk-cv's build - deploys stay fully
decoupled. Targets a subdomain, not a goonk.se subpath, to avoid needing
path-prefix rewriting kept in sync across the build, edge proxy, and
container.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Core loop (hardware tiers, deployable services, upgrades, random events,
prestige), quirks, host nicknames, an ASCII rack view, in-app help/
changelog, and a Vitest suite covering engine logic and data balance.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>