Beacon — local web dashboard
Beacon is the React 19 SPA that ships embedded inside the korva-vault binary. Visit localhost:7437 while the vault is running to browse observations, manage sessions, edit scrolls, administer teams and audit log — all without ever leaving your machine.
Updated: 2026-04-30
Beacon is the local web dashboard for your Vault. It’s a single-page application built on React 19 + Vite 6 + Tailwind 4 + TypeScript 5.8, embedded inside the korva-vault binary at release time (-tags embedui). Visit http://localhost:7437 while the vault is running and there it is — no extra port, no extra process.
Architecture
The same korva-vault binary serves:
- MCP over stdio (for AI clients).
- REST API at
/api/v1/*(for the CLI and external tooling). - The SPA at
/and any nested route (with proper SPA routing fallback toindex.html).
In dev mode (npm run dev in beacon/), the SPA runs on port 5173 and proxies API calls to http://localhost:7437/vault-api/*. Production builds bake the SPA into the binary so there’s nothing extra to deploy.
Routes
/ → Marketing landing (public)/admin/* → Admin panel (requires admin.key) /admin/dashboard → System KPIs /admin/vault → Vault Browser (search + delete) /admin/scrolls → Public Scrolls /admin/scrolls-private → Private Scrolls (Teams+) /admin/teams → Teams + members + invites (Teams+) /admin/skills → Skills Hub with versioning (Teams+) /admin/audit → Audit log (Teams+) /admin/code-health → SDD quality gates /admin/license → Activation / status
/app/* → User dashboard /app/overview → Vault stats /app/vault → Vault Explorer (search obs) /app/sessions → Session history /app/lore → Lore Manager /app/settings → PreferencesAuthentication
The admin panel login (/admin) offers two authentication methods — switch between them with the tab at the top of the login form:
| Tab | Who uses it | Credential |
|---|---|---|
| Admin Key | Vault owner / initial setup | Found at ~/.korva/admin.key → copy the key field |
| Session Token | Team members with role=admin | Obtained via korva auth redeem <invite-token>, stored at ~/.korva/session.token |
Both credentials are validated against the vault and stored in sessionStorage only (cleared when the tab closes). Maximum 5 failed attempts, 30-second lockout on the sixth.
Shared vault deployments — when you run a single
korva-vaultinstance for the whole team (e.g.vault.yourcompany.com), only the person who set up the server has the admin key. Any other team admin can still access the panel by logging in with their session token — no need to share the server’s key.
- Teams gate —
<TeamsGate>wraps Teams-only features and verifiesuseLicenseStatus().tier.
i18n
Beacon ships with full English and Spanish support: navigation, common words, auth flows, license, dashboard, vault, scrolls, private scrolls, teams, skills, audit, code health, editor, glossary. Hook: useI18n() exposes { lang, setLang, t, editor, setEditor }. Persisted in localStorage (korva-lang, korva-editor).
Stack
| Concern | Choice |
|---|---|
| Framework | React 19 + react-router 7 |
| Server state | TanStack Query 5 (with polling on the live dashboard) |
| Auth state | Zustand 5 with sessionStorage persistence |
| Icons | lucide-react |
| Build / dev | Vite 6, Tailwind 4 (@tailwindcss/vite), TypeScript 5.8 |
| Lint / format | Biome 1.9 (single tool replacing ESLint + Prettier) |
| Tests | Vitest 3.2 + Testing Library + jsdom |
Design system
| Token | Hex |
|---|---|
--bg | #060608 |
--surface | #0D1117 |
--surface-2 | #161B22 |
--border | #21262D |
--text | #E6EDF3 |
--accent | #22C55E |
--red | #F85149 (errors) |
--blue | #388BFD (links) |
--orange | #D29922 (warnings) |
--purple | #A371F7 (informational) |
Typography: Syne (display), IBM Plex Sans (body), JetBrains Mono / Fira Code (code).
Building Beacon yourself
make beacon-dev # Vite dev server on :5173make beacon-build # full prod build → beacon/distmake vault-full # Beacon build + Go build with -tags embeduiThe vault-full target is what release engineering runs to produce the shipping binary.
Tests
7+ test files in beacon/src/__tests__/:
AdminLogin.test.tsx— render, submit, validation, lockoutErrorBoundary.test.tsx,Glossary.test.tsx,InfoCallout.test.tsx,PageHeader.test.tsxadminStore.test.ts— Zustand mutations + persistencei18n.test.ts— language switching + translation completeness
Coverage report: v8 (--coverage), HTML + text output.
Why a local dashboard?
The CLI is fast for power users; Beacon is for the rest of the team. Writing scrolls, browsing the timeline, redeeming invites, managing skills — these are all easier in a UI. Crucially, since Beacon ships inside the binary, you don’t need a separate deployment to expose it.
Next
- Self-hosting — when you want Beacon reachable from the rest of the team
- Teams admin — Beacon’s Teams-tier features