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).

The console is served in production behind the reverse proxy; it authenticates with a session cookie (password, optionally TOTP). Secrets — bot tokens, keys — live only in gitignored local config, never in the browser.