Starlette + WebSocket dashboard run on the Pi as cis490-dashboard.service
(127.0.0.1:8447, Caddy-fronted at dashboard.wg). Tails
/var/lib/cis490/index.jsonl for episode events, snapshots host counts
every 30s, broadcasts to every connected browser. New connections get a
warm snapshot (recent_episodes, total_bytes, host_counts) so reloads
don't see a cold dashboard.
Frontend is a 10-scene scrollytelling deck following the project
outline: intro, collect, hosts, db explorer, baseline, attacks,
chunking, models, knn, perf. Sticky full-bleed canvas with a
right-aligned prose column (matrix-explorable layout). Hotkeys (arrows,
space, j/k, c, Home/End), prev/next chevrons, FAB, and an opt-in
click-to-advance toggle. Demo toggle drives synthetic data for the
five scenes that have no real producer yet (attack envelopes,
chunking, model bars, knn scatter, perf scatter); when off, those
scenes show "awaiting <event_type> events" rather than fake data.
Producers wire in by POSTing typed JSON to 127.0.0.1:8447/publish
(loopback only; Caddy 404s it externally). Event types the widgets
subscribe to: model_metric {model, accuracy}, embedding {x, y, phase},
model_perf {model, latency_us, accuracy}, prediction {episode_id,
window_idx, predicted, actual}, attack_profile {name, shape, curve},
phase {phase}.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
12 lines
492 B
Python
12 lines
492 B
Python
"""Live dashboard served at dashboard.wg.
|
|
|
|
Blank-slate web display whose live data is fed from Python over a
|
|
WebSocket. Other code in the repo can push events to connected
|
|
browsers two ways:
|
|
|
|
- In-process: ``from training.dashboard.app import broadcaster``
|
|
then ``await broadcaster.publish({...})``.
|
|
- Cross-process (e.g. orchestrator/receiver): POST a JSON body to
|
|
``http://127.0.0.1:8447/publish``. The endpoint is bound to
|
|
loopback and is not reverse-proxied by Caddy.
|
|
"""
|