The whole cluster, one browser tab.
The Arkane Control Plane Console is served by gw-admin itself — no agent, no sidecar, no external stack. Login is TLS on :9443; the password is checked by Argon2id inside a net-free auth cell, and the session is an HttpOnly, Secure, SameSite=Strict cookie carrying one of three roles: viewer, operator, admin. Every write runs the same order — CSRF token, server-side role check, audit entry first — before anything happens.
Overview, cells, topology, deploy, secrets.
Overview greets you with the cluster at a glance. Cells lists every cell — system cells badged apart from apps, replica groups collapsed into one row with an honest aggregate status and a rollout button. Topology draws the cluster as a band, with the net-outbound line making visible which cells can even reach the network. Deploy and Secrets are below.
overview │ cells │ topology │ deploy │ secrets admin@arkane ● gw-admin [system] running control plane · healer ● gw-public [system] running reachable: 2 of 2 ● keystore [system] running net-free ● inference ×2 [app] running replica group [ rollout ] ● persistence [system] running WAL mirrored logs ▹ drawer · every write: CSRF → RBAC → audit-first
A rollout from this button is the same code path as arkctl cell rollout — one replica at a time, ready-gated, the group never at zero.
Diff first, apply second.
Paste a manifest and the console shows you a diff preview that mutates nothing — what would spawn, what would change. Invalid input is refused with a readable reason, fail-closed; manifests that grant capabilities are deliberately rejected here and belong to arkctl apply. Only then: apply — CSRF-gated, role-checked (operator or admin), hash-chain audited before the first spawn.
+ spawn inference ×2 image blake3:9c41… · replica group ~ update tool-echo heap 8192 → 16384 KiB 2 ops · nothing applied yet ✗ refused: manifest grants capabilities — use arkctl apply (fail-closed by design)
An inventory that cannot leak.
The secrets tab lists names and grants — structurally never a value. There is no reveal button to forget to disable: the API that serves the tab has no code path that returns a secret's bytes. Reading the inventory at all is admin-only.
Everything else is accounted for the same way: five failed logins return 429, and every accepted write becomes a block in the Blake3 audit chain, tied to the acting user's digest. The console is a client of the same RPCs arkctl speaks — no privileged side door.
db-password granted → persistence api-token granted → gw-mcp values: not retrievable — the endpoint does not exist
Where credentials actually live: a net-free keystore cell, key material RAM-only, injected per call by the gateway — the app never holds them. The audit chain, verified offline →