INFRA DASHBOARD · CREDENTIAL-FREE · SELF-HOSTED

One page, one glance, every morning.

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.

0 tokens
the browser only hits an aggregated /api/data
55 s TTL
cache per source, just under the 60 s refresh
real radar
health per group from Zabbix items, by severity
docs as-code
tasks come from a .md with P1/P2/P3 checkboxes
How it works

The edge: the browser touches nothing sensitive.

🔒

Credential-free browser

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.

🌐

Fan-out + per-source cache

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.

🩹

Graceful degradation

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.

📋

Docs-as-code tasks

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.

Stack

FastAPI that aggregates, HTML that reads clean.

the architecture, in one line
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.

FastAPI + Uvicornhttpx asyncZabbix JSON-RPCvanilla HTML/CSS/JSDocker Composeruff + pytest CI