A full-stack web app that analyzes videos of calisthenics holds using MediaPipe pose detection, geometric scoring, and LLM-generated coaching feedback.
Supported moves: planche, front lever, back lever, handstand
- Upload a video and select the move
- Frames are extracted at 2 FPS and run through MediaPipe pose detection
- The longest stable-pose window is identified
- Geometric metrics (angles, alignment, lean) are scored against calibration curves
- An LLM generates coaching feedback from the scores
- Results are displayed with a skeleton overlay on the best frame and a score trend chart
- Python 3.10+
- Node.js 18+
- ffmpeg (for video trimming)
cd backend
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# Edit .env — set PROVIDER and the matching API key
python -m uvicorn main:app --reload
# Runs on http://localhost:8000cd frontend
npm install
npm run dev
# Runs on http://localhost:5173| Variable | Description |
|---|---|
PROVIDER |
claude | openai | gemini |
ANTHROPIC_API_KEY |
Required when PROVIDER=claude |
OPENAI_API_KEY |
Required when PROVIDER=openai |
GOOGLE_API_KEY |
Required when PROVIDER=gemini |
DATABASE_URL |
Defaults to sqlite:///./cfa.db |
cd backend
source venv/bin/activate
pytest -v- Create
backend/analyzer/moves/<move_name>.pywith aMETRICSlist (each entry:name,label,weight,compute_fn,curve) - Register it in
backend/analyzer/moves/__init__.py - Add the move to
MoveTypeinfrontend/src/api/types.ts
- Backend: FastAPI, SQLAlchemy, MediaPipe, OpenCV, NumPy
- Frontend: React, TypeScript, Recharts
- LLM: Anthropic Claude / OpenAI / Google Gemini (configurable)