← All Lab projects

FitTrack

An app that logs my workouts and meals, and suggests what to train next based on how well I have recovered.

Status
Used at home, self-hosted
Year
2026
FitTrack walkthrough on a phone: dashboard with readiness score, the Smart Coach suggesting a leg day, nutrition, and the progress calendar.

The problem

I train in the gym and climb. As a new parent, my training time is short and unpredictable. Generic fitness apps either ignore recovery or hide their logic behind a subscription and a black box.

I wanted one place that answers two questions every morning: how recovered am I? and given the time I have, what should I train? The answer should be explained, so I can decide whether to follow it.

What it does

  • Workout logging and plans

    Log sets, reps and weights against reusable plans. The next session pre-fills from last time, so progression is visible.

  • Nutrition tracking

    Calories and macros against a daily target, with food search through the open Open Food Facts database.

  • Daily readiness score

    Sleep, heart-rate variability, resting heart rate and training load from a Samsung Health export, each compared with my own recent baseline and combined into one score from 0 to 100.

  • Smart Coach (rule-based)

    Suggests the muscle group trained longest ago, drops grip-heavy exercises within 24 hours of a climbing session, and trims accessories when time is short.

  • Progress charts

    Strength, body and activity trends over time.

Try it

Runs entirely in your browser with made-up data. Nothing is sent anywhere.

Readiness and next workout

Move the sliders to set up a made-up morning. The score and the suggestion use the same weights and rules as FitTrack's coach.

This morning

78
+6%
-1 bpm
45
40
Last climbing session
Time available
Days since last trained

Readiness

73/ 100 · Good to push

Good to push. Training load is the strongest signal (load 1.1x baseline, in the productive range).

Sleep (35% weight)78
Score 78
HRV (25% weight)59
+6% vs 60d baseline
Resting HR (20% weight)56
-1 bpm vs baseline
Training load (20% weight)100
Load 1.1x baseline, in the productive range

Suggested session

Pull Day — Back Focus about 45 min

  • Barbell Row: 4 × 6-8 · rest 120s
  • Pull-Up: 3 × 6-10 · rest 90s
  • Seated Cable Row: 3 × 8-10 · rest 90s
  • Face Pull: 3 × 12-15 · rest 60s
  • Barbell Curl: 3 × 8-10 · rest 60s
  • Hammer Curl: 3 × 10-12 · rest 60s

Why: Back is the group trained longest ago.

Screens

All screenshots use made-up demo data.

Dashboard with a readiness score of 68 out of 100, its four factors, and daily calorie and macro targets.
Readiness and daily targets
Smart Coach suggesting a leg day with six exercises, sets, reps and rest times, and the reason it was chosen.
Rule-based workout suggestion
Recovery check listing days since each muscle group was trained and recommending a back day.
Recovery check
Nutrition day view with calories against target, protein, carb and fat rings, and logged meals.
Nutrition tracking
Progress view with a calendar of training days and session counts.
Training calendar
List of past workouts: push, pull, legs and bouldering sessions with durations.
Workout history

Architecture

Architecture diagram: the phone app talks to an Express API with a SQLite database. A Samsung Health export is imported into the database. A rule engine computes readiness and workout suggestions. Food search queries Open Food Facts.Architecture diagram: the phone app talks to an Express API with a SQLite database. A Samsung Health export is imported into the database. A rule engine computes readiness and workout suggestions. Food search queries Open Food Facts.

In words

The app is a web app I install on my phone. It talks to a small API on my home server, reached privately over Tailscale.

All data sits in one SQLite database. A Samsung Health export is imported on demand. Re-running the import updates records instead of duplicating them.

The readiness score and the coach are plain functions over that database. The only outside call is the food search.

How I built it

I wrote the requirements from my own routine: limited, unpredictable training time as a new parent, and climbing alongside the gym.

I designed the product and architecture, including how the readiness score should behave. The code was written with Claude Code. I reviewed it, and the readiness scale was calibrated against a year of my own history.

A trade-off I made deliberately. The first design called a paid AI model for coaching. I replaced it with rules: they cost nothing to run, work offline, and every suggestion comes with its reason.

Tech stack

Frontend
  • React
  • TypeScript
  • Vite
  • Tailwind CSS
  • Zustand
  • Recharts
  • PWA
Backend
  • Node.js
  • Express
  • SQLite
Data
  • Samsung Health export import
  • Open Food Facts
Hosting
  • Docker
  • nginx
  • home server
  • Tailscale