DEV Community

Cover image for A real-time global intel dashboard with zero backend
The AI producer
The AI producer

Posted on

A real-time global intel dashboard with zero backend

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)