Jordan Croome
Case study

Footnote

A running app that writes a training plan around your race, then keeps re-tuning it as the runs come in. Built as an iOS app, end to end: the interface, the training engine, the database and the AI layer that writes every session.

Client
Footnote
Year
2026
Role
Product design · iOS · AI
Stack
Expo · Supabase · Claude

THIS WEEK

0 km

M
T
W
T
F
S
S

WEEK 1 OF 15

Easy 6 km

5 × 800 m

Rest

Easy 7 km

Long 15 km

Paces derived from your 10K

TUESDAY

Aerobic intervals

Warm-up2 km
Work5 × 800 m
Cool-down1.5 km

The problem

A generic plan off the internet does not know that you ran too hard on Tuesday, that your achilles has been grumbling, or that you moved your long run to Sunday. Coaching that does adapt costs a few hundred a month. Everything in between is a spreadsheet the runner has to maintain themselves.

What I built

An app that takes seven answers and writes a full periodised plan to a race date, with every session described in plain language. It logs runs, tracks the load they create, and reshapes the weeks ahead when the picture changes. The whole thing is framed as a field study: runs are observations, the history is a ledger, the physiology is a footprint.
Seven answers in

FIELD NOTE 0001

Your first week

0 / 7 answered

Seven plain questions. It will not write a plan from a blank form, and it does not ask for anything it will not use.

The plan it wrote

0 of 5 answered

Goal-
When-
Recent race-
Longest run-
Days a week-

No plan yet. It will not guess from a blank form.

The plan on the right was generated from the answers on the left, by a Supabase edge function running the training engine and then an LLM pass to name and describe each session. Five runs a week because the runner asked for five, the long run on Sunday because that is the day they chose, 42km in week one because that is what their stated fitness supports.

7 answers

goal, race, fitness, niggles, schedule, methodology, week shape

VDOT or HR

paces from race times, or effort from heart rate. The plan is prescribed either way

Every session

named, structured into steps, and given a coach's note by the model

One session, opened

TUESDAY · SESSION 2

Aerobic intervals

Warm-up2 km easy6:20 / km
Work5 × 800 m4:38 / km
Float90 s betweenjog
Cool-down1.5 km easy6:30 / km

Every session is named and structured, with a written note on why it is in the week at all.

Prescription, not a distance

A session is not a number to hit. It carries its phase, its place in the week, a structure broken into steps with their own distances, and a note explaining what the session is for. That last part is the AI layer earning its place: the runner is told why they are doing something, in the same voice every time.

The safety rule

Nothing the model writes can change training load on its own. It names sessions and explains them; the engine decides the numbers. Generation is a draft a human reads, which is the same rule I apply to every AI feature I install for a client.

Runs become records

Logging a run captures the objective half and the subjective half together: distance, duration, surface, heart rate and elevation, then perceived effort, pre-run energy, any pain, and a written note. Pace is derived rather than entered.

Why that matters

The subjective half is what makes adaptation possible. A week of hard-feeling easy runs means something the distances alone do not show, and it is the input a spreadsheet never captures.
The ledger

LOGGED · SATURDAY

Long run

DISTANCE

15.02 km

TIME

1:33:18

PACE

-

raw file received

The ledger holds what happened, not what was planned. Pace is derived from the run, never typed in.

The system

Expo and React Native, with Supabase and PostGIS behind it. The training engine models load, fitness and fatigue; Supabase edge functions generate the plan, score daily readiness and write session descriptions. HealthKit and Strava feed activities in. Roughly thirty screens across auth, onboarding, plan, ledger, gear, guide and analysis.

Where it is

Running on device as a signed build, not on the App Store. It is a personal product rather than a client engagement, so there is nothing to claim about adoption and I am not going to invent any. What it demonstrates is scope: a designed interface, a real training model, a database and an AI layer, shipped by one person.

Want something like this built for your business?

Tell me the job you want to stop doing