The problem
The motivated-but-constrained athlete trains for real races while juggling a job, a new baby, and interrupted sleep. They own a wearable and they care about doing the right workout — but nobody has time to synthesize readiness scores, a training plan, and a four-race calendar at 6am. The data exists; the synthesis is the missing product.
Generic plans break on contact with real life: a terrible night with a newborn turns today's interval session into a liability, and a plan that can't bend gets abandoned. FitScript's premise: the plan bends; it doesn't break.
The daily loop
The product is one loop, designed to be as automatic as checking the weather.
- Overnight — Oura, Strava, or an Apple Health relay sync sleep, HRV, resting heart rate, and the week's training.
- Check-in — before the first plan of the day is generated, one tap: 😫 rough / 😐 okay / 💪 strong, plus an optional note ("baby was up all night").
- One recommendation — the coach weighs today's body against the race calendar and prescribes one concrete session, with reasoning that cites the athlete's own numbers, plus low- and high-energy alternatives.
- Refinement — "I only have 20 minutes." "My knee aches." One message re-plans today without losing the season.
- Feedback — "Mark as done" and a thumbs rating feed tomorrow's context, so the coach learns what actually lands.
Product decisions that matter
1 · One recommendation, not a dashboard of scores
Wearables already give people numbers; the job to be done is the verdict. The dashboard answers three questions in order — How am I? What's coming? What do I do today? — and nothing else competes for attention.
2 · Subjective feel is first-class data
Metrics miss things bodies know. The check-in feeds the coach with an explicit rule: when feel and metrics disagree, follow the more cautious signal. Feeling rough on great numbers dials the day back; feeling strong on poor recovery does not override the metrics. Both directions are pinned by eval scenarios.
3 · Stability over novelty
Early versions regenerated the plan on every page load — different phrasing each visit, which quietly erodes trust in a coach. Now the day's plan is generated once, persisted, and refined only through conversation or an explicit regenerate. Guidance you can leave and come back to.
4 · Feedback that actually teaches the coach
Thumbs and "did you do it?" aren't vanity metrics — the last week of prescribed plans, with completion and ratings, is part of the coach's context. If long sessions keep going uncompleted while short easy runs get done and rated up, tomorrow's ask changes. Completion data beats intention, and the coach never guilt-trips.
5 · Engineering for trust
The AI coach falls back to a deterministic rules engine when it's unavailable — transparently, with a visible badge showing which engine produced today's plan. Recovery data has an explicit source-priority chain (Oura → Garmin → Apple Health → labeled sample data). No black boxes, no silent failures.
The eval suite is the quality bar
Personalized guidance with safety stakes cannot ship on vibes. FitScript's golden-scenario eval suite encodes the product bar as executable checks, run against both engines — the deterministic baseline and the deployed AI coach:
- Never prescribe intensity on a fever signal or an HRV crash — even when the readiness score looks fine.
- Taper discipline in race week: high readiness five days before the A-race must not produce a big session.
- No heroics the day after a race; real training on green days (no sandbagging).
- Block-aware reasoning across four consecutive race weekends — one arc, one taper.
- Check-in disagreement in both directions, and adherence collapse (a week of skipped plans must change the ask, not repeat it).
The suite has paid for itself: it caught the baseline prescribing moderate endurance during a fever signal — the readiness score looked fine; the temperature deviation didn't. That gap is now fixed and regression-guarded. Coach prompt changes ship only when evals pass; the suite has grown with the product from 12 checks to 25, and the deployed coach currently passes 25/25.
Worked example: the four-race autumn
A real calendar: a half marathon, a 10-miler, the Chicago Marathon (A-race), and a 7-miler — four consecutive weekends. The coach treats the block as one arc: build through early September, fold the first two races in as supported efforts, protect Chicago with a genuine taper, treat the last as a celebratory shakeout. On any given morning, a rough newborn night converts that day's quality session into easy volume — and the coach says which day this week the key session moves to.
Under the hood
- React + Vite + Tailwind front end; Supabase (Postgres, auth, row-level security everywhere).
- Netlify Functions back end; the coach is Claude (Opus 4.8) with structured outputs — guaranteed-parseable plans.
- Ingestion: Oura (CORS-proxied), Strava (self-refreshing tokens), manual quick-log, and an Apple Health relay that turns any iPhone into a Garmin bridge.
- Eval harness runs the same golden scenarios against the rules baseline (free, instant) and the deployed coach.
- Zero-signup demo mode — the page you can try below — runs the real dashboard, check-in, and live coach entirely in memory.