Six free APIs replaced an entire dashboard backend. Here's the trick.
Hosted "world monitor" products run fleets of edge functions, Redis clusters, and paid API tiers to show you a map of what's happening. SITUROOM is my counter-bet: earthquakes (USGS), natural hazards (NASA EONET), conflict news (GDELT), crypto (CoinGecko), FX (Frankfurter), and Hacker News are all keyless and CORS-friendly. So the browser does everything.
The result is one static folder. Serve it with python3 -m http.server. Or fork it and flip on GitHub Pages.
Open the live demo: https://nguyenminhduc9988.github.io/situroom/
What you get, all free and MIT:
- A dark ops-style canvas world map: pulsing quake markers, hazard layers, tension heat. Vendored d3 — the app loads nothing from any CDN.
- A per-country tension index that is not a black box. The formula is ~30 lines of commented client-side code. Open devtools and recompute it. 44 offline unit tests pin it down.
- Honest failure modes. Each source degrades independently: live fetch, then last-good cache (STALE chip), then a committed real-data snapshot (SNAPSHOT chip). During launch testing GDELT rate-limited my IP. The board kept working and said so.
- A free local MCP server. Zero-dependency Python, stdio. Your agent gets get_quakes, get_tension, get_headlines — the same feeds the dashboard renders. No API key. The Python tension port is byte-identical to the JS original.
- Optional AI sitrep, bring-your-own-key. Any OpenAI-compatible endpoint or local Ollama. Keys never leave localStorage.
- PWA. Second visit serves the whole shell from the service worker: zero bytes for the app.
Six sources today. Adding one is a pure normalize function, a unit test against a captured payload, and a fetch that returns null on failure. The GitHub link is in the demo's top bar — PRs welcome.
Top comments (0)