Life Hub v2.0: From Data Recorder to Intelligence Platform

Life Hub v2.0: From Data Recorder to Intelligence Platform

I've been building Life Hub (a self-hosted personal life dashboard) since late February. It started as a simple FastAPI app tracking mood, sleep, and habits with an HTMX UI. By v0.4, it had grown to 10 ORM models, 7 data collectors, 29 MCP tools, and a Council of 8 AI advisors. Solid foundation, but the ROADMAP still had four open items, and the intelligence layer was mostly scaffolding.

Last night I sat down with Claude Code and shipped the entire remaining ROADMAP in a single session. Seven commits, 12 new files, 256 passing tests. Here's what went in.

What Shipped

Commit 1: Advisor Cooldowns + Test Coverage

The Council of Advisors had a spam problem: nothing stopped an advisor from posting the same observation every time triggers were evaluated. I added scope-aware cooldowns (daily triggers get 20h cooldown, weekly get 6 days) with automatic expiry detection. The digest tabs now filter comments by scope so daily pages show daily-scoped observations, not week-old strategic commentary. Also backfilled 29 tests for the advisor LLM, council chat, and daily brief systems.

Commit 2: Finance Page + Data Export + Quick Log Modal

Three features bundled into one commit because they were independent and all straightforward:

  • Finance page with net worth tracking, Chart.js trend charts, and a CSV-based collector
  • Data export API supporting CSV and JSON for all 8 data tables (GET /api/v1/export/{table}?format=csv)
  • Quick Log floating action button: a modal accessible from any page with Habit/Mood/Sleep tabs via Alpine.js, posting through existing HTMX endpoints

Commit 3: Wellness Score + Sparklines + Context-Aware Chat

The Today dashboard went from "here's today's numbers" to "here's how today fits your trajectory." A composite wellness score (0-100, weighted across mood, sleep, habits, and activity) now sits prominently at the top, flanked by 7-day sparklines for mood, sleep, and habit completion. The advisors also got a major upgrade: each chat message now includes the user's current life data in the system prompt, so when Alistair Vance says "your goals are stalling," he's referencing actual numbers.

Commit 4: AI Briefs + Proactive Triggers

Two pieces that make the system self-activating. Weekly and monthly AI briefs (Claude Haiku) now auto-generate from the collector CLI on Sundays and the 1st of each month. Six advisor trigger types fire post-collection: Sister Miriam speaks up when mood drops below 4 for three days, Coach Miller notices when sleep declines by an hour, Jax Thorne calls out habit completion below 50%, and Bramwell Finch questions complacency when everything's green. All respect the cooldown system from Commit 1.

Commit 5: Advanced Correlations

The Insights page went from four basic Pearson correlations to a proper analysis platform. Habit-specific correlations now show which individual habit most predicts mood. Weekend vs. weekday split analysis reveals behavioral differences across the week. Streak impact analysis compares average mood during 3+ day habit streaks vs. non-streak periods. All sections are collapsible Alpine.js panels.

Commit 6: ntfy Notifications

Push notifications via ntfy.sh for three conditions: no habits logged today (reminder nudge), a 5+ day habit streak about to break (priority alert), and no mood logged (gentle check-in). Runs as a post-collection step in the CLI, configurable via NTFY_URL, NTFY_TOPIC, and NTFY_TOKEN.

Commit 7: Garmin Health Collector

A new collector that pulls daily health data from Garmin Connect: steps, heart rate, weight, calories, active minutes, resting HR, SpO2, and body fat. Session tokens are cached to avoid re-authentication every run. The health page got metric summary cards (showing latest values) and filter tabs to drill into specific metric types. Gracefully skips when the garminconnect package isn't installed.

Architecture

The stack hasn't changed: FastAPI serving three interfaces (JSON REST API, HTMX UI, MCP server) from a single process, backed by SQLite with WAL mode. What changed is the depth:

  • 15 ORM models (up from 10)
  • 9 data collectors (up from 7): Miniflux, Navidrome, Audiobookshelf, Uptime Kuma, Ghost, GitHub, Weather, Finance, Garmin
  • 31 MCP tools (up from 29): added get_wellness_score and expanded get_correlations
  • 256 tests (up from ~146): every new feature ships with tests

The collector CLI now runs a full pipeline: collect data → refresh digests → generate AI briefs (weekly/monthly) → evaluate advisor triggers → send notifications. One cron job, everything stays current.

The Session

The whole thing was a single Claude Code session working through a pre-approved plan. I drafted the plan covering every phase, got it approved, then executed sequentially. Each commit followed the same loop: implement → write tests → run full suite → commit. No test regressions across all seven commits.

The trickiest parts were test isolation (shared SQLite DB across tests means you can't assume empty tables) and the advisor trigger dedup logic (cooldown windows need to account for both scope and expiry). Everything else was straightforward feature work following established patterns.

What's Next

The ROADMAP is clear. What remains is polish: extracting HTMX f-string fragments into proper template partials, consolidating digest MCP tools, adding SSE for real-time dashboard updates, and automating SQLite backups. None of it is urgent. The system works.

Life Hub is the dashboard I wanted but couldn't buy. It tracks what matters, surfaces patterns I'd miss, and has a council of AI advisors that actually reference my data instead of speaking in generalities. If you're building something similar, the repo is at github.com/snaviaux/life-hub.