Console
The dashboard
One console reads the bus for a live view and drives everything else — scripts, pusher configs, process control and alerts. It never signs anything with a live key it stores; it acts through the pushers and pm2.
Tabs
Live
Every source's latest price grouped by asset, with sparklines, age and TTL. Sources are discovered from the feed's registry — no hardcoded list.
Backtest
Edit a pricing or guard script, replay it over recorded history, and Apply to the live bus (the feed recompiles within seconds).
Constructor
Build a compressed pusher's slot config, preview the byte-exact calldata, and see the live slot map — each lane's resolved scripts, bus fields and packed feedId.
Pushers
Start / stop / restart pushers over pm2, watch signer balances and on-chain metrics, and run the onboarding commands.
Alerts
Edge-triggered health rules (producer / feed / blob stale, low balance, pusher down) with Telegram notifications.
The slot map
For a compressed pusher, GET /api/pusher/slots returns the slot structure from its
config: per occupied lane, the resolved pricing and guard selectors (walked through the feed's own
fallback order), a badge for per-chain overrides, the live bus fields, and the packed feedId.
Click a lane to open its script in the editor; click the feedId to copy it.
Source discovery
The feed publishes an active source registry at {prefix}:sources. The console reads
it into /api/state and rebuilds its source list on every poll — so the TOML-only
EVM sources appear in the Live grid, the backtest symbol list and the
slot-builder picker with no configuration on the console side.
The HTTP API
The console's full HTTP contract — every route, request and response shape — is documented in
dashboard/API.md, kept byte-identical between the two stacks and guarded by a drift test.
Highlights: /api/state (the live sweep), /api/calc + /api/calc/get
(script CRUD, with a kind for pricing vs guard), /api/backtest,
/api/pusher/* (config, feeds, slots, register, process control).