The page an infra team opens to start the day: a service radar (green/yellow/red by group, fed by Zabbix problem severity), the team's pending tasks (parsed live from a docs-as-code Markdown base), and external widgets (weather, USD, bitcoin). What's interesting is the edge: the backend does all the fetching and caching, the browser stays 100% credential-free.
The frontend only calls GET /api/data on its own origin. Every upstream credential (Zabbix login, API keys) lives in the backend's environment. The browser never sees a token.
A request fires an asyncio.gather to all sources in parallel. Each one caches independently (55 s TTL) — it never hammers upstreams or hits rate limits, and redundant refreshes are free.
The cache decorator wraps every fetch: on an upstream error it returns the last good value, or an error placeholder the UI renders inline. A flaky feed never leaves the page blank.
Pending work is parsed straight from a Markdown file (## P1/P2/P3 with - [ ] checkboxes). The to-do the team already keeps is the data source — there's no separate task DB to sync.
Browser (no credentials) ──GET /api/data──▶ FastAPI aggregator
│ (TTL 55 s cache)
asyncio.gather ─────┼──▶ Zabbix JSON-RPC (radar)
├──▶ Tasks KB (.md P1/P2/P3)
└──▶ feeds (weather·USD·btc)
◀── one aggregated JSON ──┘The same image runs the offline demo (with a mock server) or a real deploy pointing the env vars at real instances — zero code changes. No CDNs: all CSS/JS is local, sources degrade gracefully.