Areas we serve

Self-Hosted Dreeve: Your Strava Stats Dashboard on Your Server

Strava's year-in-sport recap is fun until you want a chart it does not ship, or you realize your decade of rides lives in someone else's database with a subscription attached. You can export GPX files and stare at spreadsheets. You can also run a proper dashboard on a box you control.

Dreeve is what a lot of cyclists and runners reach for after that moment. It started life as "Statistics for Strava" and grew into a full self-hosted sports analytics app: import activities from Strava, Garmin, Polar, Wahoo, Apple Health, or plain FIT/TCX/GPX files, then browse dashboards, heatmaps, gear wear, segment history, and the kind of nerdy stats Strava hides behind paywalls. About 2.2k GitHub stars, AGPL-3.0, maintained by Robin Ingelbrecht and contributors out of Belgium. The name is West-Flemish for a tree-lined country road — the kind every rider actually wants to be on.

What it actually does

Dreeve is a PHP/Symfony app served with FrankenPHP in Docker (image robiningelbrecht/dreeve on Docker Hub or GHCR). You run two containers: the web app and a daemon that shares the same volumes for background imports and scheduled work. Data lands in SQLite under ./storage/database, with activity files and rendered assets beside it. Drop files in a watch folder and they get picked up automatically.

Highlights that matter day to day:

  • Flexible import — IMPORT_MODE=files for manual uploads and watch-folder sync, or connect the Strava API when you are ready to pull your history on a schedule.
  • Dashboard you arrange — monthly calendar view, activity list, Eddington number tracking, segment efforts, and a heatmap of where you actually train.
  • Gear and maintenance — bikes, shoes, components, with automation rules to tag commutes, sport types, and default gear so you stop fixing metadata by hand.
  • Looking back — milestones timeline, "Rewind" year summaries, Strava challenge trophies, and a photo archive tied to activities.
  • AI and MCP — optional workout assistant via your chosen LLM provider (including local Ollama), plus an MCP server so Claude or Cursor can query your stats read-only when you enable keys in the admin panel.
  • PWA — install it on your phone like a native app pointed at your own URL.

Administration is all browser-based: credentials, API keys, IP allowlists for /admin, and security settings that show which client IP Dreeve thinks you are (handy behind nginx or Caddy).

Why self-host your training data?

You own the archive. A SaaS can change pricing, throttle API access, or sunset a feature you built your club reports around. Dreeve keeps the database on your disk. Back up storage/ and build/ like any other important app data.

Privacy without giving up Strava. Many athletes still sync from Strava but want analytics and AI prompts to run on infrastructure they trust — a home NAS, a Canadian VPS, or a private VLAN. Dreeve fits that split: Strava as capture, your server as the long-term brain.

Customization and badges. Shareable user badges for forums and blogs, automation rules for club tagging, and dashboards that reflect how you measure a season, not how a product manager in California guessed.

AGPL fits the hobby. If you tweak templates or internal tools, upstream expects you to share derivatives — normal for a community sports stack, worth reading before you fork for a commercial coaching portal.

What running it takes

Official path is Docker Compose: copy the sample docker-compose.yml, set APP_URL to the root of a hostname (subdirectories are not fully supported), generate an ADMIN_PASSWORD_HASH with bin/console security:hash-password inside the container, and put TLS in front on port 8080 in production.

Practical notes from the docs:

  • Two containers, one database — app and daemon must mount identical volumes or imports silently break.
  • Reverse proxy — default TRUSTED_PROXIES=private_ranges is what you want behind Docker + nginx; tighten if you expose the port raw to the internet.
  • Memory — FrankenPHP worker count (FRANKENPHP_NUM_WORKERS, default 4) trades RAM for concurrency; a 2 GB VPS is a reasonable solo-athlete starting point, bump workers only if pages queue.
  • Strava mode — needs client ID, secret, and refresh token in .env; plan for API rate limits on the first big backfill.

After go-live, schedule volume backups. One corrupted SQLite file without a snapshot hurts more than a missed KOM.

Who it's for (and who should skip it)

Good fit: data-curious runners and cyclists, coaches who want a private stats hub for a small roster, triathletes juggling multiple devices, and anyone who already self-hosts Immich or Navidrome and wants the fitness shelf to match.

Maybe skip it: if you only need a phone feed and social kudos, Strava alone is less ops. If you will not patch Docker images or rotate admin passwords, a hosted analytics tool with someone else's on-call team may sleep better. Team-scale training platforms with billing and athlete messaging are a different category entirely.

Hosting it in Canada

Training routes, heart-rate trends, and location heatmaps are personal information under PIPEDA. Keeping Dreeve on a Canadian VPS or Docker host you control is a straightforward sovereignty story: sync from vendors you choose, store and query in-country.

Tell us your import mode (files vs Strava API), expected activity volume, and whether you want MCP/AI enabled if you want help sizing a box, hardening the admin path, or backing up the SQLite store before your first century import.

Want the stack running without babysitting containers? Talk with Swift Host — we are in St. Albert and actually answer the phone.

Tags:
  • Dreeve
  • Strava
  • Fitness
  • Cycling
  • Self-Hosted
  • Docker

Need Help With Your Hosting?

Tell us about your application — we respond within 1 hour with honest recommendations.