Browser-native incident simulator

CASCADE

Keep the city alive. Every fix has a blast radius.

A distributed-systems roguelite built from the ideas I have spent years shipping and operating: dependencies, retries, failover, observability, and the uncomfortable distance between a green service and a healthy system.

TypeScriptCanvas 2DWeb WorkerDeterministic seedsNo backend

01 / THE SHIFT

You are on call.

The city is a dependency graph. Read the telemetry, find the first domino, and choose a runbook before a symptom becomes a system-wide outage. Restarting the red building is not the same thing as fixing the cause.

01ObserveClick a service to inspect its live signals.
02DiagnoseFollow latency, retries, and dependency edges.
03StabilizeSpend the right runbook, not the loudest one.

02 / CONTROL ROOM

Incident command

STANDBY Choose a shift to initialize the city.
TIME00:00 CUSTOMER IMPACT0.0% BLAST RADIUS0 services INCIDENT01 / 04
C

Runbook build

BASELINE / INCIDENT 01

No runbooks installed yet
BASELINE OPERATIONSStabilize the first incident to earn your first runbook card.
A

Service topology

healthy degrading failing
NO ACTIVE SHIFT Start an incident to bring the city online.

04 / UNDER THE CITY

The portfolio piece is the architecture.

CASCADE deliberately separates a 10 Hz simulation from the render loop. The worker owns graph state, propagation, and deterministic incidents. The browser owns the city, HUD, and operator decisions.

Inspect the source
60 FPSCanvas renderercity · particles · motion
STATE SNAPSHOTWeb Workergraph · incidents · actions
DETERMINISTICSeeded enginesame outage · shareable URL