Projects/ reflo
Reflo motion capture demo

reflo

Motion-capture pilates personal training: real-time form correction and AI voice coaching, built for the phone and designed for what comes next.

Best experienced on a mobile browser. Open in Safari or Chrome on your phone and allow camera access. The live workout screen has a skip button to jump to the last 15 seconds for demo purposes.

Role

Solo Developer & Designer

Type

Computer Vision · Mobile

Stack

React Native, TensorFlow.js, MoveNet

Platform

Web · iOS

The Problem

Reformer pilates is one of the most effective ways to train, and one of the least accessible. Classes run $40 to $70 a session, and beginners, the people who most need eyes on their form, are exactly the ones priced out. The alternative is practicing alone off a video that can't see you, which is how bad habits and injuries start.

Reflo isn't built to replace the studio. It's built to be your homework between sessions, so you arrive at real classes with cleaner fundamentals and get more out of the money you're already spending. It watches your movement through your phone's camera and coaches your form with a real voice, in real time.

The phone is just the entry point: the most accessible camera most people already own. The interaction model underneath (persistent body tracking, spatial overlays, audio feedback tied to movement) is the same foundation that will power AR glasses, smart mirrors, and movement-aware wearables. This is the first accessible step toward that.

User Flow

Reflo user flow diagram

From Sketch to Ship

Every screen started as a low-fidelity wireframe and was reviewed against the flow before any code. Here's the journey from first sketch to shipped interface.

Reflo low-fidelity wireframes across key screens

Design System

A system built before the branding pass, so every screen stays consistent. Color, type, and mark each carry a single defined job.

Click a card

Signal Red

The single high-weight color. CTAs, today's session, active states, form errors. Used sparingly so it always means one thing: act, or pay attention. It's also the dot in the logo, a tracked joint, echoed as a 4px square throughout the UI.

How It Works

01

Body tracking

The browser's getUserMedia API streams the camera feed. MoveNet SinglePose Lightning detects 17 body landmarks every frame, computing joint angles entirely on-device with no server round-trip.

02

Spatial overlay

A canvas layer over the live feed draws the skeleton in real time: red while tracking is active, shifting to teal the moment a correction fires, dimming to grey when confidence drops or the body leaves frame.

03

Contextual coaching

When a joint angle crosses a threshold, a correction is queued and fires in the next gap in the audio track, never over the instructor. Positive feedback plays when form stays clean.

Detection Logic

Three exercises are tracked in this MVP. Joint angles are computed every frame using dot-product math against known landmark positions. A 5-frame rolling average smooths jitter; corrections queue continuously and fire only in silent windows.

Exercise

Trigger

Voice Correction

Long Stretch

Hip pike > 195°

Drop hips down, squeeze the glutes

Long Stretch

Hip sag < 160°

Squeeze glutes and lift hips back up

Long Stretch

Head drop detected

Curl higher, chin away from chest

The Hundred

Head drop detected

Curl higher, chin away from chest

The Hundred

Arms sinking below hip

Lift arms up, hovering not resting

Footwork Toes

Heels dropping

Keep heels lifted through every rep

Footwork Toes

Knees caving inward

Push knees out over second toe

Working With Instructors

Reflo has been developed in ongoing consultation with certified pilates instructors, shaping the exercise library, validating that the correction cues match how they actually teach, and pressure-testing the concept itself.

Their most important pushback shaped the entire positioning: people go to studios for community and the felt, hands-on correction a camera can't replicate, and Reflo should never try to replace that. So it doesn't. Reflo is framed as homework, not a substitute: it catches the gross positional errors that are visible from a side view (piking, sagging, dropping) so beginners build cleaner fundamentals between the classes they're already paying for, and get more out of every session.

That collaboration also drew the scope lines honestly. Detection is deliberately limited to the exercises where side-view tracking is reliable, rather than faking confidence on rotational or depth-based movements a single camera can't see. And the per-rep timing that paces generated workouts is calibrated with instructors rather than guessed, because tempo, holds, and breath-paced movement are the parts of pilates that generic rep-counting gets wrong.

Tech Stack

Expo SDK 56

App framework + web build

TypeScript

Language

React Navigation

Stack + bottom tabs

getUserMedia API

Browser camera access

MoveNet Lightning

Real-time joint detection

TensorFlow.js

ML runtime

OpenAI TTS

Generated workout voice

ElevenLabs

Flagship voice + corrections

Anthropic API

Routine generation

Firebase

Auth + Firestore

Work in progress

Reflo is an active build. The core loop (track, coach, generate, save) works end to end. Remaining work is validation and hardening, not new systems.

What's built

  • ·

    MoveNet pose detection with color-coded skeleton and joint-angle thresholds

  • ·

    Correction window system, audio queued to silent gaps

  • ·

    Flagship class: hand-produced ElevenLabs voice track with music

  • ·

    AI routine generation: Anthropic composes weekly plans from a tagged exercise library

  • ·

    Generated-workout voice via OpenAI TTS, paced from rep counts, quota-limited

  • ·

    Real session data driving streak, progress, and calendar

  • ·

    Firebase auth, 3-step onboarding, post-workout report

  • ·

    Out-of-frame detection and lock-on gating

  • ·

    Vercel web deployment with mobile viewport

Still to come

  • ·

    Expanding tracked exercises beyond the current three

  • ·

    Instructor-calibrated per-exercise rep timing

  • ·

    Cached generated audio (Firebase Storage) to cut regeneration

  • ·

    iOS development build via EAS

  • ·

    WebXR exploration for true spatial overlay

Full backlog on GitHub →

Challenges & Learnings

Choosing the pose model

MoveNet SinglePose Lightning was chosen over MediaPipe BlazePose after testing both in-browser. Lightning's lower inference cost held a steadier framerate on mid-range phones, which mattered more here than BlazePose's extra landmark precision. The angles being measured only need shoulder, hip, knee, ankle, and wrist.

Timing corrections and cues with the audio

The hardest product problem was making AI feedback feel natural alongside voice coaching. For the flagship, corrections fire only in pre-mapped silent windows. For generated workouts, the pacing is computed from each exercise's rep count so cues, work time, and corrections never overlap.

Two voice paths, one pipeline

The flagship class is a hand-produced ElevenLabs track, the polished front door. Generated routines use OpenAI TTS composed on demand and metered by a weekly quota, since live generation is the only real cost. A voiceMode branch routes both through the same tracking and HUD, so the experience is consistent while cost stays controlled.

Validating the AI, not trusting it

Routine generation never writes model output directly. Every exercise reference is validated against the real library, rep and set counts are bounds-checked, and any failure falls back to a deterministic local plan, so a bad generation degrades to a working workout instead of a broken screen.

Constraining to side-view only

Rather than chase every camera angle, the app is designed around a single side-view constraint. It made the joint-angle thresholds far more reliable, cut false positives, and mirrors how purpose-built movement hardware approaches camera placement.

← All Projects