A full-stack training tracker for Brazilian Jiu-Jitsu that visualizes position progress as a skill tree, logs sessions, tracks drilling volume, and surfaces stale techniques to review.
- Interactive BJJ skill tree with node-level proficiency
- Session logging (Gi/No-Gi, session type, duration, notes, technique reps)
- Automatic proficiency updates with time-based decay
- Drill queue for stale or never-drilled techniques
- Weekly mat-time and top-position analytics
- Embedded technique video modal support
- FastAPI docs available at
/docs
- Backend: FastAPI, SQLAlchemy, SQLite, Pydantic
- Frontend: React, TypeScript, Vite, Zustand, Tailwind, Recharts, Framer Motion
.
├── config/ # Skill tree graph + techniques config
├── scripts/
│ └── start.sh # Starts backend + frontend for local dev
├── src/
│ ├── backend/ # FastAPI app, models, routers, CRUD
│ └── frontend/ # React + Vite app
├── requirements.txt
└── bjj_tracker.db # SQLite database (local)
- Python 3.10+
- Node.js 18+
- npm 9+
Run both backend and frontend with one command:
bash scripts/start.shApp URLs:
- Frontend:
http://localhost:5173 - API:
http://localhost:8000 - API Docs:
http://localhost:8000/docs
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn src.backend.main:app --reload --host 0.0.0.0 --port 8000cd src/frontend
npm install
npm run devGET /api/health- Health checkPOST /api/sessions- Create a training session with technique logsGET /api/sessions?limit=20- List recent sessionsGET /api/tree- Skill tree with computed node proficiencyGET /api/tree/stats- Dashboard metricsGET /api/tree/drill-queue- Suggested stale/never-drilled techniques
# Frontend build
cd src/frontend && npm run build
# Start backend only
uvicorn src.backend.main:app --reload- This project currently uses SQLite (
bjj_tracker.db) for local storage. - Skill tree content and drill targets are defined in
config/skill_tree.json.