Skip to content

v3.0.0 — The Education Release

Latest

Choose a tag to compare

@pshenok pshenok released this 28 Jul 23:04
291553d

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 ApproximateNumberOfMessages pattern, 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.