What it is
A dashboard that holds my whole life and runs permanently on my machine: daily/side/main quests that bank XP, click-to-set HP/MP gauges, a weigh-in sparkline, an agenda strip synced from Google Calendar, my Japanese study streak — and an 8-stat mastery octagon built from real data. My AI tutoring sessions grade actual mastery scores (1–5) into markdown files in my Obsidian vault; the dashboard parses them live. The radar isn't self-reported vibes — it's my graded report card, rendered as a game HUD.
Cross an XP threshold and a full-screen LEVEL UP overlay fires. XP comes from one unified pool: cumulative report-card XP from tutoring plus an append-only ledger the dashboard writes for quests and training.

The interesting part — files are the API
There's no database and no auth. Everything is plain files in the vault: five markdown sources the server parses read-only (report card, gradebook, concept mastery, activity log, Japanese progress) and five schema-validated JSON files the dashboard owns (quests, health, agenda, XP ledger, settings). A chokidar watcher pushes every file change to the browser over SSE, so finishing a tutoring session — or hand-editing a JSON file in any editor — updates the screen within about a second.
That design means any AI coding session can update my dashboard by just editing a file, with the contracts documented in the repo's CLAUDE.md. The write path is defensive: zod validation, atomic temp-and-rename writes, per-source degradation (a malformed vault file dims one panel instead of crashing the endpoint), and XP awarded before quest completion persists — so a failed write can never eat a completed quest's XP.
Built spec-first, reviewed task-by-task
The whole build ran spec → 20-task TDD plan → a fresh implementation agent per task, each gated by an independent review before the next task started. The review loop caught real bugs before they shipped: a level-math crash on negative XP, a write-ordering flaw that could strand completed quests with zero XP, and the server binding all interfaces instead of loopback. 75 tests: parser units against real-format fixtures, API integration on a sandboxed vault, and a Playwright E2E that proves the live SSE loop by editing a vault file on disk mid-test.
Deployment
A Windows Task Scheduler task launches it hidden at logon. The launcher is synchronous so the task instance lives and dies with the node process, and a 5-minute watchdog trigger restarts it unattended — measured crash recovery: 53 seconds. Localhost-only by design.
Status
Live daily. Next arcs: rendering the concept-mastery bands, a job-search panel, and per-stat XP mileage.