A locally-running web application for syncing, storing, and visualizing cycling activity data from Strava and Garmin FIT files.
- Strava Sync — OAuth integration to pull all activities and per-second stream data
- FIT File Upload — Import activities directly from Garmin .fit files
- Activity Dashboard — Paginated list of all activities with stream data indicators
- Activity Detail — Summary stats and interactive Plotly charts of power, HR, cadence
- Trends — Time-series charts (Apache ECharts) with metric toggles, time range selection, and trend lines
- Nutrition & Energy Balance — Import Cronometer CSV exports and see daily calories in vs. kJ burned, with a cumulative surplus/deficit line
- Dark/Light Mode — Theme toggle persisted in browser
- Python 3.11+
- uv (fast Python package manager)
# Install dependencies
uv sync
# Start the web server
uv run uvicorn app.main:app --port 8000The app will be accessible at http://localhost:8000. The SQLite database is auto-created on first startup.
- Create a Strava API application
- Go to Settings (
/settings) and enter your Client ID and Client Secret - Click "Connect to Strava" to complete the OAuth flow
- Use "Sync from Strava" on the dashboard to pull your activities
# Backfill missing stream data (preferred for large batches)
uv run strava-cli backfill-streams [--limit N]
# Import a Cronometer daily nutrition summary (re-importing a date overwrites it)
uv run strava-cli import-cronometer ~/Downloads/dailysummary.csvSee ARCHITECTURE.md for full technical details including database schema, data flows, routes, and UI documentation.
- Strava Developer Docs — API reference and setup
- FIT File Documentation — Garmin format specs