← Christian Bellofatto

Threshold

React Native · TypeScript · Claude API · Supabase · TestFlight

Threshold is a coach for people who already know how to train. Most fitness apps either hand you a fixed program that ignores your life, or a logging screen that records what you did without having an opinion about it. Threshold sits where a real coach sits: it knows your history, your equipment, your goal race, and the thing your left shoulder is currently doing — and it programs against all of it, then talks you through the session while you're in it.

I built it because I train for Hyrox around four kids and a job, which means the plan changes constantly. A program that can't absorb "I have 40 minutes and no rig today" isn't a program, it's a document. The interesting design problem was making a model useful at three different timescales at once: the block, the day, and the set you're standing in the middle of.

The block

Five-week program grid with a written rationale above it, days colour-coded by strength, cardio, metcon, and rest The same grid with week two Monday selected, showing that day's lower-body lifts and a 6x400m running session, plus a proactive message from the coach
A five-week block, and the day underneath it. The coach opens the conversation rather than waiting to be asked.

A block is generated as a whole, with a stated rationale — upper/lower split built around race prep, rehab for a specific movement pattern, and explosive strength, with weeks one and two establishing conservative baselines, three and four pushing load and volume, and five deloading. That periodization is the part people get wrong on their own: it's easy to write five hard weeks, and it's the taper and the deload that make the block work.

The grid is deliberately the whole surface. Plenty of training apps only show you today, which makes it impossible to see whether the week is balanced or whether you've stacked three heavy pulls in a row. Seeing the shape of the block is what lets you argue with it.

The session

An in-progress strength session logging sets with weight, reps, and RPE, with a coaching cue above the movement and a rest timer
Logging a set, with the cue for that movement and the coach one tap away.

Every movement carries its own coaching note — what the movement is actually for and how to execute it — so a prescribed accessory lift isn't a name you have to look up mid-session. Sets record weight, reps, and RPE, which matters more than it sounds: RPE is how the coach learns that the prescribed load was wrong, and it's what lets the next week adapt without me having to explain that I was tired.

The coach bar sits at the bottom of every screen with voice input, because typing mid-workout with chalk on your hands does not happen. Asking for a substitution when the rack is taken, or telling it a movement aggravated something, changes the session in place rather than filing a complaint for later.

How it's built

Expo and React Native in TypeScript, with Supabase for Postgres and auth, distributed through EAS Build to TestFlight. The coaching runs on the Claude API, and the hard part was never generating a workout — a model will write you a workout immediately, and it will be plausible and generic. The work was in the context: representing an athlete's history, injuries, available equipment, and recent RPE well enough that what comes back is specific to them, and keeping that representation small enough to stay fast.

It's on TestFlight, currently with one athlete on it: me. That's the honest status, and also the reason it has improved — I train on it four days a week, and the things that annoy me get fixed that weekend.