Emily Denis

Flagship case study · AI personalized guidance

FitScript

An AI training coach that reads your sleep, recovery, race calendar, and how you say you feel — then prescribes the one workout your body is actually ready for, with the reasoning stated in your own numbers.

Try the live demo — no signup Open the app
Role
PM · design · engineering (solo)
Status
Live, in daily use
Stack
React · Supabase · Claude
Quality bar
25/25 eval checks

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.

FitScript's feel-first check-in: How are you feeling today, with one-tap rough/okay/strong options
The feel-first check-in — asked once, before the day's plan exists.
Today's workout card: an easy recovery session with reasoning citing readiness, HRV, and the athlete's own check-in
One recommendation with reasoning in the athlete's own numbers — here, respecting a "rough" check-in despite decent metrics.

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:

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.

FitScript coach chat adjusting today's plan conversationally
The chat is a control surface for today's plan, not a chatbot destination.

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

Try the live demo ↗ ← All work