Node Ops Dashboard
One page that tells you your Dogecoin node is healthy.
A single-file Flask dashboard for the node you built in Track 1: sync status, peers, mempool, wallet balance, and recent transactions, auto-refreshing. The "hello world" of Dogecoin ops - and the monitoring seed the production checklist asks for.
What you'll have when it works
- A dashboard: chain, block height, headers, sync %, peer count, mempool size, wallet balance
- Recent wallet transactions table with confirmation counts
- Health verdict logic: OK / SYNCING / STALLED with plain-language explanations
- Auto-refresh every 30 seconds, dark theme, zero client dependencies
The prompt
Paste this into Claude Code in an empty project folder. It's a full spec, not a wish – the constraints in it (integer koinu, idempotent crediting, testnet asserts) are the difference between a demo and something trustworthy. Read what comes back before you run it.
Build a single-file Dogecoin node dashboard in Python 3 + Flask. One file (dashboard.py), no database, no frontend framework, templates inline via render_template_string. Read the whole spec first.
CONTEXT
- Dogecoin Core node on localhost. RPC port, user, and password come from env vars DOGE_RPC_PORT (default 44555), DOGE_RPC_USER, DOGE_RPC_PASS. JSON-RPC via the requests library: POST with basic auth, body {"jsonrpc":"1.0","id":"dash","method":M,"params":P}; raise a clear error if the response's "error" field is set; handle connection-refused with a friendly "node not reachable" page rather than a stack trace. Treat RPC error code -28 as "node starting up" and show that state.
DATA (one /api/status JSON route the page polls)
- getblockchaininfo: chain, blocks, headers, verificationprogress
- getnetworkinfo: subversion, connections, relayfee
- getmempoolinfo: size, bytes
- getbalance, and listtransactions "*" 10 for the table (category, amount, confirmations, time, abbreviated txid)
- Health verdict computed server-side: SYNCING if verificationprogress < 0.9999 and headers > blocks; STALLED if blocks unchanged for 10+ minutes while not syncing (track last-change in module state); else OK. Include a one-sentence plain-language explanation with each verdict.
PAGE (route /)
- Dark background (#16110b), cream text, one gold accent (#E8B93B), monospace numbers. A header row of stat cards (height, peers, mempool, balance), the health verdict as a colored pill with its explanation, then the transactions table. Auto-refresh by fetching /api/status every 30s and updating the DOM (no full page reload). Everything inline: CSS in a <style> block, JS in a <script> block. It should look genuinely good, not engineer-default.
- Footer line: node subversion + chain name + "local dashboard - do not expose to the internet".
SECURITY
- Bind Flask to 127.0.0.1 explicitly and print a warning if run with 0.0.0.0. The dashboard is read-only: never call sending/wallet-unlocking RPCs.
DELIVERABLES: dashboard.py, requirements.txt, README (env vars, run command, what each verdict means). Then walk me through reading each stat while my testnet node syncs.
The walkthrough
- Point it at the testnet node from Track 1 and watch a real sync progress bar.
- Stop dogecoind and confirm the dashboard degrades gracefully instead of crashing.
- Leave it running while you do Track 2 - you'll feel the node's heartbeat while your apps talk to it.
Before this touches real DOGE
- Keep it localhost-only; if you must view remotely, SSH-tunnel the port instead of exposing Flask.
- This is the seed of the monitoring the production checklist requires - add alerting (email/webhook on STALLED) as your first extension.
The lessons behind this kit: Run your own Dogecoin node · JSON-RPC quickstart in Python · Taking Dogecoin payments to production