Workout Tracker
Workout Tracker handles workout tracking web application geared towards running and other GPX-based activities as a self-hosted solution.
A no-fluff look at what you actually get when you stop uploading your runs to Strava’s servers.
TL;DR
- What it is: MIT-licensed, self-hosted web application for tracking workouts — primarily GPX-based activities like running and cycling — built in Go by a single developer [README].
- Who it’s for: Runners, cyclists, and hikers who want to own their activity data, escape Strava’s subscription tier, and are comfortable with a one-command Docker setup [README][1].
- Cost savings: Strava’s premium plan runs $7.99–$11.99/month. Workout Tracker on a $5–6/month VPS is effectively zero recurring cost for the software [README].
- Key strength: Clean GPX/TCX/FIT import pipeline, route segments with automatic workout matching, equipment tracking, and a Swagger-documented REST API that lets tools like Fitotrack push data automatically [README].
- Key weakness: Web-only interface with no native mobile app, no social/community features, and 1,204 GitHub stars — small community means you’re mostly on your own if something breaks [README][2].
What is Workout Tracker
Workout Tracker is a self-hosted web application written in Go, maintained by a single developer (jovandeginste) under an MIT license. The GitHub description is precise about scope: “A workout tracking web application for personal use (or family, friends), geared towards running and other GPX-based activities.” [README] There’s no grand vision statement or VC-backed ambition here — just a well-built tool solving a specific problem.
The problem it solves is the same one r/selfhosted users keep posting about: fitness apps like Strava and Garmin Connect are genuinely useful, but they store your data on vendor servers, lock advanced analytics behind monthly subscriptions, and can change their terms or pricing whenever they want [2]. One Reddit thread asking for self-hosted alternatives framed it plainly: “I have become very against paying for subscriptions, and would like to stop giving my fitness data to companies.” [2] Workout Tracker is the minimal, direct answer to that.
The project sits at 1,204 stars and 47 forks as of this review — modest numbers in the self-hosted space, but the commit history (1,790 commits) and active Weblate translations suggest consistent maintenance rather than an abandoned side project [README]. There’s a Matrix community chat for questions.
Technically, it’s a Go web application that supports SQLite, MySQL, and PostgreSQL as storage backends. It ships as a Docker image for amd64 and arm64, or as a binary you can run directly. The Swagger-validated REST API means it integrates cleanly with external tools without requiring custom scripting [README].
Why people choose it
The self-hosted fitness tracking space has a clear demand signal: people who train seriously want their data, and they don’t want to keep paying for it indefinitely [1][2]. Strava’s free tier is increasingly limited — route planning, segment leaderboards, heart rate analysis, and training load are all paywalled. Garmin Connect is free but ties you to Garmin hardware and still puts your data on their servers. The recurring complaint in self-hosted communities is that there’s no clean, private alternative that handles GPX files without drama [2][3].
Workout Tracker’s specific appeal is focus. It doesn’t try to replace Garmin’s entire ecosystem or build a social network. It handles the core workflow: you record an activity on your watch or phone, export the GPX/TCX/FIT file, and the app parses, stores, and analyzes it. For runners who primarily care about their own history — pace over time on a favorite route, equipment mileage, weekly distance trends — that’s the whole job [README].
The route segment feature deserves mention because it’s the closest thing Workout Tracker has to Strava’s “segments” — you can define a section of a route, and the app will automatically detect when future workouts match it and track your times [README]. It’s a feature that usually justifies Strava subscriptions for competitive runners; here it comes for free with the self-hosted install.
Automatic sync via the REST API matters for workflow. Rather than manually exporting GPX files after every run, apps like Fitotrack can push data directly to Workout Tracker’s API. The Fitbit sync command (cmd/fitbit-sync/) in the repository handles daily stats like step counts and weight from wearables [README]. This reduces the manual overhead that typically kills self-hosted fitness tool adoption.
Features
Based on the README and repository structure:
Activity tracking:
- Upload workout records in GPX, TCX, or FIT format [README]
- Manual or automatic upload via REST API (e.g., Fitotrack push integration) [README]
- Manual workout entry for non-GPS activities — weight lifting, push-ups, swimming [README]
- Route segment detection: define a segment, app matches future workouts automatically [README]
Personal stats:
- Daily stats tracking: weight, step count, and other metrics [README]
- Manual entry or API sync (Fitbit sync command included) [README]
- Statistics and progress dashboard [README]
- Heatmap view — visualizes where you’ve been frequently [README]
Equipment tracking:
- Log gear per workout (shoes, bikes) [README]
- Track usage and wear across activities [README]
Technical:
- REST API with Swagger documentation (validator badge in README confirms spec validity) [README]
- SQLite (default), MySQL, and PostgreSQL support [merged profile]
- Docker images for amd64 and arm64 [README]
- Multi-language UI via Weblate translations [README]
- JWT-based sessions with configurable encryption key [README]
What it doesn’t do:
- No native mobile app — it’s a web interface
- No social features, friends, or activity sharing
- No AI coaching, training plans, or suggested workouts
- No built-in GPS recording (you need a watch/phone to record, then import) [README]
Pricing: SaaS vs self-hosted math
Strava (the primary replacement target):
- Free: basic activity log, limited route features, no heart rate analysis
- Subscription: ~$7.99/month (annual) or ~$11.99/month (monthly) — prices have increased and vary by region
- The specific features locked behind the paywall (segment leaderboards, training load, route planning, heart rate zones) are exactly what serious runners use
Garmin Connect:
- Free with Garmin hardware, but data lives on Garmin’s servers
- No self-hosted option; if Garmin changes terms or discontinues the service, your history goes with it
Workout Tracker self-hosted:
- Software: $0 (MIT license) [README]
- VPS to run it: $5–6/month on Hetzner or Contabo (SQLite mode uses minimal resources for personal use)
- Storage: negligible — GPX files are small, thousands of workouts fit in a few hundred MB
Concrete math for an active runner: A runner doing 5 sessions per week, paying Strava’s annual rate of $7.99/month, pays ~$96/year for features that Workout Tracker covers at the self-hosted level. On a $6/month Hetzner VPS, that’s $72/year — with the server also available for other workloads. If you’re already running a home server or VPS for other tools, Workout Tracker adds essentially zero marginal cost.
The Strava comparison is the honest one here because that’s the subscription most GPX-based athletes are currently paying. Pricing data for specific alternatives like Komoot ($5.99/month) or TrainingPeaks ($19.95/month) varies, but the direction is the same: any recurring SaaS subscription eventually costs more than a one-time VPS setup for personal-scale data.
Deployment reality check
The install path is straightforward for anyone comfortable with Docker. The README’s quickstart is a single docker run command [README]:
docker run -p 8080:8080 -v .:/data ghcr.io/jovandeginste/workout-tracker:latest
For persistent sessions you add the JWT key environment variable. For a production setup you use docker-compose with an explicit data directory, which the README covers with a curl-and-run docker-compose example [README].
What you actually need:
- A Linux VPS or home server (SQLite mode runs on 512MB RAM; PostgreSQL/MySQL setups need more)
- Docker installed
- A domain name and reverse proxy (Caddy is the easiest) if you want HTTPS and a real URL
- Optional: external PostgreSQL or MySQL if you want something more robust than SQLite for multi-user family setups
What can go sideways:
- No managed update path — you’re responsible for pulling new Docker images when releases drop. The project has 1,790 commits and active development, so falling behind versions is a real maintenance task [README].
- The JWT encryption key must be set for sessions to survive container restarts. Forget it, and everyone gets logged out on the next deploy [README].
- Multi-user support exists (the description mentions “family, friends”) but there’s no LDAP or SSO — each user is a local account managed within the app [README].
- No mobile app means you need a separate recording solution. Fitotrack (Android) and similar apps handle the GPX recording and API push; iOS users will need to find their own export workflow [README].
- The Fitbit sync is a separate command (
cmd/fitbit-sync/) that requires setup outside the main web interface [README]. It’s not plug-and-play.
For a technical user: 15–30 minutes to a running instance. For a non-technical user following a guide: 1–2 hours including domain and HTTPS setup. If you’ve never run a Docker container, budget an afternoon.
The project’s small community size (1.2k stars, 47 forks) is the honest risk factor here [README]. With n8n or Nextcloud you can find dozens of forum posts for any error you hit. With Workout Tracker you might be debugging alone or opening a GitHub issue.
Pros and cons
Pros
- MIT licensed. Own your install completely — no usage restrictions, no commercial license required, no vendor can change the terms [README]. This contrasts with several fitness alternatives under AGPL-3.0, which has copyleft implications if you embed or modify it.
- GPX/TCX/FIT import pipeline is solid. These are the three formats that cover virtually every GPS device and app. If your watch exports it, Workout Tracker can read it [README].
- REST API with Swagger documentation. The spec is Swagger-valid (README badge confirms it), which means it works with standard API clients and integration tools like Fitotrack out of the box [README].
- Route segment matching. Defines a course, detects it in future workouts automatically — a core Strava premium feature available here for free [README].
- Heatmap view. Useful for visualizing training geography; many self-hosted alternatives skip this [README].
- Equipment tracking. Shoe and gear mileage is a real runner need that most basic trackers ignore [README].
- Multi-database support. SQLite for personal use, PostgreSQL/MySQL when you need more [merged profile].
- ARM64 images. Runs on a Raspberry Pi or other ARM hardware, relevant for home server users [README].
Cons
- No mobile app. The web interface is the only client. Recording requires a separate app (Fitotrack, your watch’s export function, etc.) [README][2]. Strava’s native mobile app is genuinely good; this is a real gap.
- Small community. 1,204 stars, 47 forks, one primary maintainer [README]. If the maintainer loses interest or the project hits a Go version compatibility wall, there’s limited community to pick it up.
- No social layer. No friends, no segments leaderboard, no kudos, no clubs. If your running motivation is tied to community comparison, this tool isn’t a substitute for Strava — it’s a replacement only for the data ownership and analytics parts [README].
- No training plans or coaching. Tools like wger, Garmin Connect, and TrainingPeaks have structured plan features. Workout Tracker logs what you did; it doesn’t tell you what to do next [README][3].
- Fitbit sync requires separate setup. It’s a CLI command in
cmd/fitbit-sync/, not a UI-driven integration [README]. - Multi-user management is basic. No SSO, no LDAP, local accounts only. Fine for family use, not for a gym deployment [README].
- License badge vs. merged profile discrepancy. The merged profile shows “NOASSERTION” for the license, but the README clearly displays the MIT badge and LICENSE file. Verify against the repository directly before relying on any aggregator’s metadata.
Who should use this / who shouldn’t
Use Workout Tracker if:
- You’re a runner or cyclist paying Strava $7.99–$11.99/month primarily for analytics and segment tracking, and you want to stop that recurring charge.
- You value keeping your activity history on your own server, not a vendor’s cloud.
- You already have a VPS or home server running Docker.
- Your workflow involves a GPS watch that exports GPX/TCX/FIT files, and you want automatic import without manual steps.
- You’re comfortable doing your own updates and maintenance, or are willing to set up a cron job to pull new Docker images.
Skip it (consider Endurain instead) if:
- You want Strava/Garmin Connect integration that syncs automatically from the platform rather than manual file exports. Endurain connects directly to Strava and Garmin Connect [1].
- You want a more polished onboarding experience with explicit integration setup UI rather than CLI sync commands.
Skip it (consider wger instead) if:
- You care about nutrition tracking, calorie logging, or gym workout programming in addition to cardio [3][4].
- You want an Android app for in-gym logging — wger has one [4].
Skip it (stay on Strava) if:
- Social features are part of why you train — segments, clubs, friends’ activities, Flybys.
- You want AI coaching, structured training plans, or performance analytics beyond raw statistics.
- You don’t have a VPS or home server and aren’t interested in setting one up.
Skip it (consider FitTrackee) if:
- You want a Python-based alternative with similar GPX-focus but prefer that stack for easier modification.
- You need multi-user with more mature account management [3].
Alternatives worth considering
From the awesome-selfhosted.net health and fitness category [3] and the broader space:
- Endurain — AGPL-3.0, 1,883 stars, Docker. Connects directly to Strava and Garmin Connect, covers goals and targets, more integration-heavy than Workout Tracker [1][3]. Best if you want to pull from existing services rather than import files.
- FitTrackee — AGPL-3.0, 1,100 stars, Python/Docker. GPX/TCX focus similar to Workout Tracker. Python stack if that matters [3].
- wger — AGPL-3.0, 5,955 stars, Python/Docker/REST API. The broadest fitness tracker in the self-hosted space: workouts, nutrition, weight, gym management. Significantly more complex to set up and run [3][4].
- Wingfit — CC-BY-SA-4.0, 483 stars. Minimalist, focused on planned workouts and personal records [3].
- Statistics for Strava — AGPL-3.0, 1,676 stars. Doesn’t replace Strava — it visualizes your existing Strava data. Not a self-hosted replacement, but a complement [3].
- Strava — The incumbent. Native apps for iOS and Android, the largest cycling/running community, best segment ecosystem. ~$96/year. Makes sense if the social and coaching features matter to you.
For a runner focused purely on data ownership and file-based history, the realistic shortlist is Workout Tracker vs FitTrackee vs Endurain. Pick Workout Tracker for MIT license and Go simplicity. Pick Endurain if you want Strava/Garmin sync. Pick FitTrackee if you prefer Python and want a slightly larger community.
Bottom line
Workout Tracker is exactly what it says on the label: a clean, MIT-licensed web app that stores your GPX files, tracks your routes, and shows you your history — without a monthly bill or a cloud intermediary. It won’t replace Strava if you run for the community, the leaderboards, or the coaching. It will replace the $96/year subscription if you’re primarily paying for data analytics and ownership, and you’re willing to spend an afternoon setting up Docker.
The project’s small scale (one primary maintainer, 1.2k stars) is the honest risk. It’s a well-maintained individual project, not a backed company. If that trades off acceptably against owning your own fitness history indefinitely, the math works. A $6/month VPS handles this comfortably alongside other self-hosted tools.
If getting the VPS set up is the blocker, that’s the kind of one-time deployment upready.dev handles for clients.
Sources
- Victor Awogbemila, XDA Developers — “This self-hosted fitness tracking service is just what you need to replace the cloud” (Oct 24, 2025). https://www.xda-developers.com/self-hosted-fitness-tracking-service/
- r/selfhosted — “What’s currently the best self hosted workout/fitness data tracker?”. https://www.reddit.com/r/selfhosted/comments/1n59q59/whats_currently_the_best_self_hosted/
- awesome-selfhosted.net — “Health and Fitness” category listing. https://awesome-selfhosted.net/tags/health-and-fitness.html
- Sanuj Bhatia, Android Police — “These 5 open source fitness apps are perfect for Android users” (Aug 14, 2025). https://www.androidpolice.com/best-open-source-fitness-apps-android/
Primary sources:
- GitHub repository and README: https://github.com/jovandeginste/workout-tracker (1,204 stars, MIT license)
- Swagger API spec: https://raw.githubusercontent.com/jovandeginste/workout-tracker/master/docs/swagger.json
Features
Integrations & APIs
- REST API
Replaces
Related Health & Lifestyle Tools
View all 53 →Monica
24KPersonal CRM for tracking interactions with friends, family, and contacts with relationship management tools.
Habitica
14KHabitica is a self-hosted habit & personal tracking tool with support for Habit Tracking, Tracking.
Mealie
12KMealie handles material design inspired recipe manager as a self-hosted solution.
Tandoor Recipes
8.1KTandoor Recipes handles manage recipes, plan meals, build shopping lists, and much much more as a self-hosted solution.
Workout.cool
7.1KWorkout.cool lets you run modern fitness coaching platform entirely on your own server.
wger
5.8KReleased under AGPL-3.0, wger provides web-based personal workout on self-hosted infrastructure.