Studio¶
The Synapse dashboard is growing from a read-only cockpit into an operator Studio: a control plane that answers, in one glance, what is happening, what is at risk, what is safe to do next, and who should do it. It is built the way the rest of Synapse is — local-first, dependency-light, offline-safe — and rides on the read model the dashboard already serves.
This page tracks what has shipped. The full direction lives in the internal design plan; what is public here is real and running.
Design system¶
The Studio speaks an instrument-panel language rather than a marketing dashboard:
a deep ink base, one indigo-violet brand hue, and red/amber/green reserved
exclusively for verdicts so risk reads at a glance. It is a small set of CSS custom
properties and components in dashboard_assets/studio.css, served by the dashboard at
/studio.css — no build step, no external request, and it renders correctly with the
hub offline.
- Palette — ink-navy surfaces, an indigo-violet accent for links, focus, and the live pulse, and the three verdict colours used nowhere else.
- Type — three roles: a display face for labels and numerals, a body face for prose, and a monospace face that carries the data (task ids, leases, paths, hashes). A system-font stack ships today; self-hosted faces drop in behind the same variables.
- Components — panels and cards (elevation by tint and a hairline, never shadows),
status dots, the verdict pill, mono data rows, the navigation rail, and an indigo
focus ring. Motion is restrained and stilled under
prefers-reduced-motion.
The reference page¶
Run the dashboard and open /studio to see the design system exercised on one page —
every verdict tone, every status-dot state, the panels, cards, data rows, and
numerals. It renders no live data, so it works even when the hub is down, and it is the
visual reference the live command centre is assembled from.
synapse dashboard --port 8765
# front door (command centre): http://127.0.0.1:8765/
# design reference: http://127.0.0.1:8765/studio
# classic hub HTML: http://127.0.0.1:8765/classic
The Studio snapshot — /studio.json¶
The command centre reads one JSON contract, served live at /studio.json: a single risk
verdict (the reserved red/amber/green signal), a row of headline counters, the
agents, claims, tasks, conflicts, risk behind them, and a compact security-posture
section. It is a pure projection of the same read model the dashboard already exposes —
studio_snapshot.py reshaping /snapshot.json — so Studio adds no new hub call, only a
curated command-centre view. Every headline count is derived from the list it summarises,
so the instrument and the rows beneath it can never disagree. A partial payload from a
degraded hub still projects to a renderable snapshot rather than failing.
synapse dashboard --uri ws://127.0.0.1:8765
# then GET http://127.0.0.1:8765/studio.json
The command centre — /studio/command¶
The live operator view, served at /studio/command, reads /studio.json and answers at a
glance what the fleet is doing and what is at risk. Its signature instrument is the
Coordination Clock — a radial gauge where every claim is a segment around the dial,
coloured by lease health (green fresh, amber ageing, red stale), with conflicts marked on
the rim and a slow radar sweep; the dial centre carries the verdict and the live claim
count. Around it sit the verdict pill, the headline counters, and the agents, claims,
tasks, and risk panels.
The page shell is hub-independent: it loads with no hub running, shows an offline state,
and fills in live as it polls. The persistent NavRail keeps the command view, reference
view, fleet, LiveFeed, and security posture one click away; the HeaderBar shows the live
hub id, version, verdict, and connection state from /studio.json. It honours
prefers-reduced-motion — the sweep stills and a claims table pairs the dial so the same
information is legible without animation. Vanilla HTML, the studio.css tokens, and
dependency-free ES — no build step, no external request.
The security-posture panel sits beside the Coordination Clock and summarises five shipped safety surfaces: sandbox grants, ACL/role visibility, the dashboard exposure guard, signed federation / peer observation, and receipt evidence. Rows are evidence-bound: missing role bindings, peers, or receipts are shown as amber "not currently evidenced" instead of being treated as configured. The panel is read-only; server-side ACL, dashboard bind, federation, and sandbox enforcement remain in their existing modules.
The observed peers (advisory) panel projects dashboard --observed-peer rows (and
any FLEET-style advisory mirrors folded into the same snapshot field) into
/studio.json under observed_fleet: per-peer reachability, lag, clock skew, and
observed claim-owner counts. Unreachable peers are red; lagging peers amber; no
configured peers is an honest amber "not configured" state. Peer data never grants
local claim authority.
The LiveFeed panel tails /events.json?since=SEQ&limit=N, the durable event-store feed
served when the dashboard starts with --feeds-db. It starts at since=latest, then
polls forward by next_cursor, so it shows new recorded events without walking a large
history. If --feeds-db is absent, the panel says the event feed is not configured rather
than implying a quiet log.
synapse dashboard --port 8765 --feeds-db ./hub.db
# open http://127.0.0.1:8765/ (same shell as /studio/command)
The dashboard CLI prints the Studio URL first. Root / and /studio/command
serve the same command-centre shell; /classic keeps the pre-Studio hub HTML.
What comes next¶
Beyond the command centre come the workflow, trace, policy, routing, and channel surfaces, each reading the same kind of projection. The core read-only Studio stays free; an organisation-level workbench (saved views, exports, multi-project, managed) is planned as a separate layer.