The first tagged release of Server Survival — and the biggest update in the project's history. The north star behind all of it: not a game with cloud theming, but a game that actually teaches cloud architecture. Still zero build step — the repo is served raw by GitHub Pages.
🎮 Play now: https://pshenok.github.io/server-survival/
Ten new services (13 → 23)
Every archetype cleared one bar before shipping: distinguishable simulation behavior — if it behaves like an existing box with a new label, it doesn't ship.
| Service | The one thing no other node does |
|---|---|
| Monitoring | Gates the live metrics dashboard — "you can't fix what you can't see" |
| Dead-Letter Queue | Holds failed requests and drains them back as a recoverable cost |
| Pub/Sub Topic | Multiplies one event into a delivery per subscriber |
| Identity Provider | Trades latency for catching session attacks a firewall misses |
| Scheduler | A traffic source — injects its own batch-job bursts |
| Notification | A terminal whose success earns reputation, not just money |
| Container Cluster | Flat per-cluster pricing, dense capacity, slow node-pool warmup — the economic anti-twin of Serverless |
| Stream | Head-of-line blocking: a stalled partition holds its tail while others flow |
| GeoDNS | Balances whole independent regional stacks at the very front |
| Data Warehouse | Accepts analytics writes, rejects realtime reads — OLTP vs OLAP |
The production-readiness mechanics
- Observability — per-service sparklines (utilization, queue depth, error rate, latency), threshold alerts, frozen on pause so you can do a real post-mortem of a game over
- Auto-scaling — Compute fleets grow under load with real cold start (warming instances cost money but serve nothing) and shrink with hysteresis. Serverless, fixed Compute, ASG and Containers each win different traffic profiles — verified economically, not vibes
- Queue-depth scaling — pull-based worker fleets scale on upstream queue pressure, the
ApproximateNumberOfMessagespattern, because CPU-style signals can't see a drowning queue - Circuit breaker, retry, SPOF detection — a failing node trips open, traffic reroutes through the redundancy you built, dead ends fail fast, and one retry with backoff rescues transient drops
- Region outages — the whole stack behind a front door goes dark and comes back; GeoDNS shifts traffic away and back
- Failure-reason badges — every dropped request now says why, aggregated so a collapsing topology stays readable ("No route ×14", "Circuit open", "Analytics store, not for reads")
Campaign: 6 new levels (14 → 20)
Chapter 4 — Production Readiness: find a bottleneck you can only see with metrics, ride out a traffic spike with auto-scaling, survive a node failure, catch what retries couldn't in a DLQ, fan out with Pub/Sub, and survive a full region outage with a two-region build. Every level was proven beatable by machine-played runs — and proven to fail when you ignore the mechanic it teaches.
Quality of life
- Category tabs — 23 services organised by the cloud taxonomy (front door / compute / data / async / ops); no more sideways scrolling, keys 1–5 switch tabs
- Share your architecture — export a PNG or copy a link that rebuilds your design for anyone who opens it
- Separate music / SFX controls, persisted
- Nepali joined the 9 supported languages; all locales at full key parity, CI-enforced
Under the hood
- Full modular rewrite: one 4,076-line file → a 50-module native-ESM graph, still no bundler
- 593 automated tests run on every PR (locale parity, campaign-level invariants, and real-simulation regression suites for routing, resilience, scaling and save/load)
- Dozens of community-reported bugs fixed along the way — thank you to everyone who filed issues and sent PRs ❤️
For contributors
Clone and open index.html — that's the whole setup. npm i && npm run check runs lint + tests if you want the safety net. Good first issues are labeled.