Warning
This software is under heavy development. APIs are unstable and breaking changes happen without notice. It is vibe-coded — built fast with AI assistance — which means it works, but carries all the bugs and rough edges that implies. Use it for personal exploration, not production workloads.
Self-hosted fitness analytics for cyclists and endurance athletes. Analyze your training data with interactive maps, performance charts, and personal records tracking.
Activity Management
- Upload and parse Garmin FIT files directly
- Automatic import from Garmin Connect (with MFA support)
- Automatic import from Xert
- Activity list with route map thumbnails
- Detailed activity view with interactive map and charts
- Delete individual activities (with async fitness recalculation)
Performance Analytics
- PMC (Performance Management Chart) — Track CTL (fitness), ATL (fatigue), and TSB (form) over time with color-coded training zones
- Power Curve — Best power outputs at each duration with freshness indicators
- HR Zones — Time-in-zone breakdown for each activity
Personal Records
- Lifetime PRs (longest ride, fastest segments, max power, biggest climb)
- Per-route PRs with automatic route matching via GPS similarity
Activity Comparison
- Compare multiple activities on the same route side-by-side
- Overlay performance charts (power, HR, speed) to spot differences
- Identify where you gained or lost time
Settings & Preferences
- Selectable map tile styles (OpenStreetMap, Positron, Dark Matter, Voyager)
- Light/Dark/Midnight themes
- Metric/Imperial unit preferences
- HR-derived power estimation for activities without power meters
Multi-User
- Isolated data per user
- Admin panel for user management
- OAuth login (Google, GitHub)
git clone https://github.com/tomberch/training-dash.git
cd training-dash
docker compose upOpen http://localhost:8000 and register your account. The first user automatically becomes admin.
To import activities from Garmin or Xert, go to Settings > Integrations.
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript, Tailwind CSS 4, Vite, Recharts, Leaflet |
| Backend | Python 3.12, FastAPI, SQLAlchemy 2, Pydantic |
| Database | PostgreSQL 16 with PostGIS |
| Queue | Redis + arq (background job processing) |
| Container | Docker Compose |
- Getting Started — Installation, configuration, first steps
- Architecture — System design and code organization
- API Reference — REST API endpoints
- Contributing — How to contribute
- Docker and Docker Compose
- Node.js 20+ (for frontend development)
- Python 3.12+ and uv (for backend development)
Backend:
cd backend
uv sync
uv run pytest # run tests (use -n auto for parallel integration tests)Frontend:
cd frontend
npm install
npm run dev # starts dev server on :5173Full stack with hot reload:
# Terminal 1: Database + Redis
docker compose up db redis
# Terminal 2: Backend
cd backend && source .venv/bin/activate
uvicorn trainingdash.app:app --reload
# Terminal 3: Frontend
cd frontend && npm run dev






