Case study · Applied AI
AI Running Coach.
A training app I built, then used to run my first 53 km ultra.
- Year
- 2025–26
- Role
- Solo: app, plan engine, integrations and testing.
- Stack
- Expo / React Native · Supabase · Inngest · Gemini · DeepSeek · Strava
- beginner to ultra
- 0 → 53 km
- beginner to ultra
- race finish time
- 6:43
- race finish time
- test subject: me
- n = 1
- test subject: me
Problem
A friend dared me to run the Amerongse Berg Ultra: 53 km of trail, six months away. I barely ran. So I built a coach.
- Real data. It reads my actual runs from Strava.
- Durable. Plan generation keeps going when the app closes.
- My call. Big changes need my approval, and every plan can be undone.
How it works
An LLM drafts the plan. A second pass reviews it. Then code checks the rules (progression, tapering, space between hard days) before a plan is applied.
Each step is a checkpointed job, so an interrupted plan picks up where it stopped. Gemini handles the chat, DeepSeek writes the plans.
The key decision
Rules live in code, not in the prompt. That makes every new rule slower to add, since it needs a definition and tests. But a model can't talk its way past a test.
The honest part
What didn't work
A knee injury stopped me for over a month. I paused the AI and trained with a physio instead. It also showed me the app handled a long break badly.
Outcome
First ultra
53 km
6h 43m
One runner, one race. It doesn't prove the app caused the result.
Finished twelve minutes ahead of the friend who dared me.