A personal health dashboard that synthesizes data across strength training, running, sleep, recovery, and body composition into an interactive Next.js web app. Built for a single user — no auth, no hosting, just npm run dev.
The dashboard pulls real data from CSV exports and markdown logs, computes health scores, detects trends, flags imbalances, and generates cross-domain insights.
npm install
npm run devOpen http://localhost:3000.
| Page | Route | What it shows |
|---|---|---|
| Overview | / |
Animated health score ring (weighted composite), quick stats, "doing well" / "needs attention" cards, key lifts table, recovery status |
| Training | /training |
4 sub-tabs: Strength (lifts table, volume chart, overload trends, session frequency, PRs, flags), Running (plan phase + empty state), Steps (834-day Oura area chart), Recovery (readiness, HRV trend, entries table) |
| Sleep | /sleep |
Sleep score, stages stacked bar chart, duration trend, recent nights table |
| Body | /body |
7-day avg weight, trends (7d/30d/90d), weekly high/low, interactive weight chart with time range toggle |
| Insights | /insights |
AI narrative ("What Your Body Is Saying"), domain status cards, cross-domain correlation previews |
| Domain | Source | Records |
|---|---|---|
| Strength | strength/strong_workouts_raw.csv |
18,213 rows (Sept 2020 – Mar 2026) |
| Recovery | oura/Recovery_Log.md + oura/raw/*.csv |
94 daily entries + 834 days raw |
| Sleep | oura/raw/sleepmodel.csv |
1,103 nights |
| Steps | oura/raw/dailyactivity.csv |
834 days |
| Weight | data/weight.csv |
1,602 daily entries (Jan 2021 – Apr 2026) |
| Running | running/Run Log.md |
0 (first run Apr 12, 2026) |
All data is read server-side via Node.js fs in Server Components — no API routes, no database. The strength CSV is cached by file mtime for performance.
HealthOS/
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── page.tsx # Overview
│ │ ├── training/page.tsx # Training (4 tabs)
│ │ ├── sleep/page.tsx # Sleep
│ │ ├── body/page.tsx # Body / Weight
│ │ └── insights/page.tsx # Insights
│ ├── components/
│ │ ├── ui/ # shadcn/ui primitives
│ │ ├── layout/ # Sidebar, page header
│ │ ├── shared/ # Score ring, empty state
│ │ ├── training/ # Recharts: volume, overload, steps, HRV, frequency
│ │ ├── sleep/ # Recharts: stages, duration
│ │ ├── body/ # Recharts: weight trend
│ │ └── insights/ # Narrative, correlations
│ └── lib/
│ ├── data/ # Data fetchers (strength, oura, running, weight, health-score)
│ ├── parsers/ # CSV (PapaParse) + markdown table parsers
│ ├── types/ # TypeScript interfaces per domain
│ ├── utils/ # Dates, stats, exercise-to-muscle mapping, est. 1RM
│ └── config/ # Design tokens, chart theme
│
├── strength/ # Strength agent data + CLAUDE.md
├── running/ # Running agent data + CLAUDE.md
├── oura/ # Oura agent data + CLAUDE.md + raw/ CSVs
├── data/ # Weight CSV
├── dashboard/ # Legacy HTML dashboard (archived)
├── CLAUDE.md # Root agent context
└── DESIGN.md # Notion-inspired design system
| Layer | Choice |
|---|---|
| Framework | Next.js 16 (App Router, Server Components) |
| Components | shadcn/ui (New York style) + Radix UI |
| Styling | Tailwind CSS |
| Charts | Recharts |
| CSV Parsing | PapaParse |
| Icons | Lucide React |
Notion-inspired editorial minimalism — warm neutrals, Inter font, whisper-weight borders (1px solid rgba(0,0,0,0.1)), multi-layer shadows. Domain colors: Strength (orange #E8590C), Running (green #2B8A3E), Recovery (blue #1971C2), Body (purple #7048E8). Full spec in DESIGN.md.
Weighted composite: Recovery 40%, Strength 30%, Running 30%. If a domain has no data, its weight redistributes equally to active domains.
- Strength scores on: session consistency, recency, progressive overload trends, muscle balance
- Recovery scores on: 7-day readiness average mapped to 0–10
- Running scores on: plan adherence and mileage (once active)
The data files are maintained by four Claude Code agents, each with their own CLAUDE.md:
- Strength — Logs workouts from Strong app exports, tracks PRs, flags imbalances
- Running — AI running coach with 27-week half marathon plan
- Oura — Daily recovery/sleep analyst with training recommendations
- Dashboard — Legacy HTML dashboard generator (superseded by this Next.js app)
- Weight: Replace
data/weight.csvwith a new export from your weight tracking app (columns:Date,Weight (lb)) - Strength: Replace
strength/strong_workouts_raw.csvwith a new Strong app export - Oura: Update
oura/Recovery_Log.mdvia the Oura agent, or replace raw CSVs inoura/raw/ - Running: Log runs via the Running agent — it updates
running/Run Log.md