← All projects

Apex

An AI strength coach built the way a real coach works: diagnose first, prescribe second, watch every rep.

React Native Expo TypeScript MediaPipe Supabase HealthKit

From the storyboard

Four of the 79 boards, exactly as they were designed in HTML before implementation started chasing them. Click any frame for the full capture.

Storyboard frame: assessment wizard step one with goal and training-day chips Assessment · Step 1
The onboarding wizard opens the diagnosis: goals, training days, and the life details a coach would actually ask about.
Storyboard frame: live workout tracker mid-session with an active set and logged sets The Spine · Active Workout
The live tracker, the screen the whole product bends around: current set glowing, logged sets checked, one primary action.
Storyboard frame: assessment verdict screen flagging an under-recruited muscle The Verdict
The differentiator on one screen: an under-recruited upper chest flagged as technique rather than weakness, and a program built from it.
Storyboard frame: personal-record celebration with confetti and a new estimated one-rep max Delight · PR
A new estimated 1RM earns confetti. Progress you can feel beats progress you can query.

Coaching judgment, encoded

Most fitness apps hand you a template and count your sets. A real coach does something else entirely: they watch you move, they know how you slept, and they can tell the difference between a muscle that is weak and one you simply don't know how to use yet.

Apex encodes that judgment. It tracks training with the phone camera on a tripod, reads recovery from real-life signals, and runs an assessment before it ever writes you a program.

"The active workout tracker is the product; everything else is icing."

Apex build bible, DESIGN-SPEC.md

Design before code

The interesting part of Apex isn't just what it does, it's how it was built. The product was designed on paper (well, in HTML) before the implementation was allowed to chase it:

  1. 01

    Storyboard everything

    79 screens were designed as clickable HTML boards before the redesign touched the app, so every flow got argued about while it was still cheap to change.

  2. 02

    Write the build bible

    A single DESIGN-SPEC.md rules the build: a north-star thesis, the information architecture, per-screen behavior, an exact design-token system, and a file-by-file translation plan into the codebase.

  3. 03

    Ground every ruling

    Design decisions cite published interaction research (Apple's Human Interface Guidelines, Material 3, Nielsen Norman Group, Laws of UX) and teardowns of Strong and Hevy. Taste arguments become evidence arguments.

  4. 04

    Build in waves

    Development moves in numbered waves, twelve and counting. Each wave ends shippable and verified on a physical iPhone before the next begins.

A coaching brain with zero dependencies

The program engine is pure ES-module JavaScript with no runtime dependencies, one entry point, and around 300 automated tests. Call nextWorkout(program, history, profile, signals) and it produces the next session of a personalized mesocycle: double progression on reps then load, RIR ramps across the block, weekly volume held between researched landmarks, stall detection, and automatic deloads when the signals call for one.

Because the engine is platform-agnostic, it runs identically under Node for testing and inside React Native on the phone. The same inputs always produce the same program, which is what makes 300 tests meaningful.

Diagnose before prescribing

Apex's most distinctive idea is an exploration phase that runs before programming begins. A screening battery watches how fast each movement pattern improves. Rapid early gains signal a recruitment or skill gap (you had the strength, you just couldn't access it), while slow, grindy progress signals a genuine strength deficit.

The distinction matters because the fixes are different: practice versus volume. The profile that falls out of the assessment is exactly what the program engine consumes, so the diagnosis literally writes the prescription.

Reps, depth, and tempo from a tripod

The camera feature started as a research question: wearables or vision? Vision won on setup friction and information density, and BlazePose (33 tracked joints) won the bake-off. The same MediaPipe pipeline serves web and native by running inside a WebView bridge, with raw landmarks posted back to the app's kinematic layer.

Landmarks Joint angles Smoothing Peak detection Hysteresis state machine Reps · depth · tempo · form faults

Accuracy is framed honestly in-product with confidence bands rather than false precision. A camera that guesses should say so.

Trained by your life

Apple HealthKit feeds the engine sleep, HRV, daily movement, and body-composition trends. Recovery flexes training volume while load stays deliberately steady, so a rough week shrinks the session without erasing your progress.

State lives in an offline-first Supabase backend with server-set roles and row-level security, synced with a debounce so devices converge without fighting. The app works fully offline; the cloud is a convenience, not a dependency.

Proving it works

Around 300 node:test cases across 33 files pin the engine's behavior. Roughly 15 Maestro flows drive the real UI end to end. Release builds run standalone on a physical iPhone against the live backend, and every wave ends with that device check before new work starts.

The open frontier is on-device camera capture performance, and it's tracked as a research task with explicit success criteria rather than a hope.

In development · running on-device (iOS) ← Back to the showcase