A personal AI triathlon coach I designed and built — it reads my live Strava data, tracks training load, and adapts my plan through a conversational coach that proposes changes for me to approve. Self-coaching guesswork, replaced by a coach in my pocket.

.timeline
Ongoing — built 2026
.year
2026
.tools
Claude Code, Figma, Next.js, Supabase, Anthropic API, Strava API, Vercel
.role
Product Lead
Amateur endurance athletes coach themselves, and the tools don't help where it actually matters. Strava — and every training app like it — is a rear-view mirror: it tells you what you did in exquisite detail, but nothing about what you should do next. Structured plans are the opposite problem. They're written once, in the abstract, and then reality happens — you miss a session, a ride leaves you cooked, work eats your Sunday long run — and the plan just sits there, unchanged and quietly wrong. A human coach solves this by holding your goal, your recent load, and your life in their head and adjusting week to week. But that's expensive, and most age-group athletes don't have one. I was training for a sprint triathlon with a fixed race date, juggling three disciplines across a nine-week build, and doing what everyone does: eyeballing my Strava feed, half-remembering last week, and hoping I wasn't quietly digging myself into an injury.

Coach is a personal training dashboard with an AI coach wired into my real data. It syncs my activities straight from the Strava API every morning, maps heart rate, power and cadence, and computes my acute-to-chronic workload ratio so over-reaching surfaces before it becomes an injury. On top of that sits a coach built on Claude that isn't a generic chatbot — every reply is grounded in live context: my athlete profile, the current week of the plan, recent sessions, my training load, and a long-term memory of durable facts it has learned about me. It writes a proactive briefing on the dashboard each day — last session, this week, wins, focus — in a real coach's voice. And crucially, it can change the plan: tell it "I'm not doing my Sunday ride" and it reasons over my goal, the race date and my recent load, then proposes a specific set of edits as a card I approve with a single tap. Nothing moves until I say so.


I build my own tools — it's how I think — and I'm a triathlete training for a race with a hard date on the calendar. Those two things collided into this. I didn't want another dashboard of charts; I wanted the thing a good coach actually gives you, which is judgement applied to your specific situation, today.
The first real product decision was where the intelligence should sit. It would have been easy to build a clever one-shot plan generator and call it done. But the value of a coach isn't the plan — it's the constant, small re-planning as life interferes with it. So I designed around adaptation, not generation. The plan is just state; the coach is the thing that reasons over it and keeps it honest.
The second decision was trust, and it's the one I was most deliberate about. An AI that can silently rewrite your training plan is a liability, not a feature — the same instinct I brought to payroll automation, where an unchecked automated action is a risk rather than a convenience. So plan changes are propose-then-approve: the coach reasons, then surfaces a plan-change card with a clear before-and-after and an Apply button, and nothing is written until I tap it. If dropping a session leaves a hole in the week, it rebalances the following days in the same proposal, so I'm approving a coherent week rather than a single orphaned edit. The AI does the thinking; I keep the decision.
Grounding was the third. A coach that hallucinates your paces is worse than no coach, so I never let the model freelance on the facts. Every chat request rebuilds the system prompt from live data — profile, this week's sessions with their real ids, recent activities, training load — and the plan-change tool operates on those actual session ids, not on vibes. I added a memory layer so it accumulates the durable things across conversations — a niggling knee, a standing midweek commitment — while deliberately ignoring one-off stats, so its advice gets more personal over time without turning into a junk drawer.
I made it a mobile-installable app because training decisions happen at the poolside and the trailhead, not at a desk, and wired a daily cron so the data and the morning briefing are simply there when I wake up. The whole thing runs on Next.js, Supabase with row-level security, the Strava API and Claude — and I built it in Claude Code, which is the honest throughline of the project: I had a real problem, I understood it as a product, and I shipped the tool I wanted to exist.
What I'd do next: close the loop on outcomes — feeding how sessions actually felt back into the plan automatically — and get a couple of other age-group athletes onto it, to see how much of "my coach" generalises into "a coach."
Every problem worth solving has a human at the centre of it.