Architecture · LikeC4

gas-city-dashboard

Single-operator ambient cockpit over one Gas City — calm by default, raises its voice only when something is wrong

built evolving planned research risk

The whole picture

System landscape

The system in context, then opened up into its containers.

gas-city-dashboard — system landscape

gas-city-dashboard — system landscape

index
gas-city-dashboard — containers (backend / frontend / shared)

gas-city-dashboard — containers (backend / frontend / shared)

dashboardSystem

Single-operator ambient cockpit over one Gas City — calm by default, raises its voice only when something is wrong

Risks & open questions

Risks & open questions

risks
Opt-in & planned work — the Maintainer (Triage) module

Opt-in & planned work — the Maintainer (Triage) module

planned

Inside each box

Containers & components

Each part decomposed into the components that implement it. Every box links to its source in the interactive explorer.

Backend (Node/Express) — components

Backend (Node/Express) — components

backendContainer

Binds 127.0.0.1 only. Owns local host capabilities + a transport-only supervisor relay; never a GC data facade.

Frontend (React/Vite) — components

Frontend (React/Vite) — components

frontendContainer

frontend/ — React 19 + Vite + Tailwind. Reads GC data directly from the supervisor; the calm "Reading Room" register is the binding visual contract (DESIGN.md)

shared — the wire-shape SSOT contract

shared — the wire-shape SSOT contract

sharedContainer

shared/ — dashboard-owned /api DTOs + the generated gc-supervisor OpenAPI client; the single contract both halves import

How it runs

Walkthrough flows

Dynamic views — the narrative spine of the system, step by step.

Walkthrough — SPA bootstrap to first paint

Walkthrough — SPA bootstrap to first paint

boot

The SPA loads from the same origin, reads /api/config for operator identity + enabled modules + read-only posture, then reads GC data straight from the supervisor through the transport relay.

Walkthrough — live update over SSE

Walkthrough — live update over SSE

liveUpdate

The SPA holds an EventSource directly on the supervisor stream. A burst of bead/session events is coalesced (leading + trailing) into at most one refresh per window, which re-reads through the cache so the connection pool stays free.

Walkthrough — an operator write (bead / mail)

Walkthrough — an operator write (bead / mail)

operatorWrite

Mutations carry the X-GC-Request header and clear the Origin check + CSRF gate. Mail sends always go from the operator identity even while "Reading as" another agent — impersonation is read-only.

Walkthrough — run git diff (local evidence)

Walkthrough — run git diff (local evidence)

runDiff

Run-detail git diffs are a dashboard-owned local capability, not GC data. The execution-folder cwd comes from untrusted supervisor run metadata, so it is confined to the RUN_CWD_ALLOWED_ROOTS prefix allowlist before git -C runs.

Where it runs

Deployment

What runs where, and the process & data boundaries between the pieces.

Deployment — where each piece runs (loopback-only backend)

Deployment — where each piece runs (loopback-only backend)

deployment

Explore it live

The figures above are static exports. The interactive explorer lets you pan, zoom, follow relationships, and jump from any box to the source.