A local project panel for SaaS builds — planning and ops in one place. Single
user, localhost-first, dark sci-fi/HUD UI. See SPEC.md for the full design.
A left sidebar switches between five views:
- Plan — kanban (Todo / Pågår / Blockerad / Klar), task cards with prio / AI / dependency badges, milestones, decisions, idea inbox. 🕐 on a card creates a reminder.
- Ops — service health grid (uptime / latency / cost), open-incident banner + runbooks, deploys, cert status, backup age, cost-trend sparklines.
- Filer — per-project file manager: folder tree, create
.txt/.md, inline editor (save = new version), version history + restore, drag-and-drop upload, streamed download. Blobs live in SQLite. - AI — Ollama-driven suggestions (prioritize / new task / move / question). Accept executes the action; questions get a free-text answer fed back as context.
- Inställningar — Ollama model + auto-analyze toggle, SMTP form (Gmail preset + test button).
Plus a Secrets modal (AES-256-GCM at rest, key from a master password via
argon2id — AI/MCP never see values, only {name, scope, age}) and a global
reminders widget with badge + toast for due items.
Three processes: api (Hono, serves the built web UI), worker (health poll +
daily alerts + 30-min AI auto-analyze + per-minute reminders), mcp (stdio,
spawned by Claude Code). One SQLite DB. Ollama runs locally (127.0.0.1:11434).
- api — Hono on
127.0.0.1:8899, REST mirror of the MCP tools + secrets endpoints, and servesweb/dist. - worker — polls each service's
health_urlevery 60s; daily cron alerts on cert expiry, secret age, stale backups and cost overruns (via ntfy). - mcp — the same tools over stdio for Claude Code; every AI write is logged to
activity_logtaggedsource='ai'. - web — Vite + React SPA, built to
web/distand served by the api.
# 1. config
cp .env.example .env # tweak if needed; defaults are fine for localhost
# 2. install + build
npm install
cd web && npm install && npm run build && cd ..
# 3. run (pm2)
pm2 start ecosystem.config.cjs
pm2 save # persist across reboots (after `pm2 startup`)Open http://127.0.0.1:8899. The database is created on first run at
data/panel.db (override with DB_PATH).
Dev mode with hot reload: cd web && npm run dev (proxies /api to the running
api on 8899).
The api binds loopback only. To reach it remotely, front it with Cloudflare
Access over a tunnel — see cloudflared/config.example.yml.
SSH port-forwarding (ssh -L 8899:127.0.0.1:8899 host) also works.
All configuration is via .env (see .env.example) — no
hardcoded paths. Nothing secret lives in any config file; the master password is
entered at unlock time and only its derived key is held in memory, for 5 minutes.
- Ollama (
OLLAMA_URL,OLLAMA_MODEL) — local only; auto-analyze is toggled at runtime in Inställningar (default off). - Email (
SMTP_HOST/PORT/USER/PASS/FROM) — for reminders. Prefer setting the password in.envover the UI (a UI-saved password is stored in the DB in plaintext, redacted only from API responses).
- Secret values never appear in
get_context, logs, or API responses without an unlocked session. - Bind
127.0.0.1; expose only via Cloudflare Access or an SSH tunnel. Ollama is never exposed externally. - MCP
read_fileserves text mimes only, ≤100kb, and never secrets. .env,data/, and tunnel credentials are git-ignored — keep them that way.