Analytics cookies only (Google Analytics, PostHog). No ad networks, no cross-site tracking. See our privacy policy.
WT
Self-host Workout Tracker
updated Oct 2026deployed by usprices checked · Jul 2026Install verified on Ubuntu 26.04 · Oct 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →
A workout tracking web application for personal use (or family and friends), geared towards running and other GPX-based activities: upload GPX, TCX or FIT files, add manual workouts, follow statistics, route segments, equipment and a heatmap of where you have been. A single Go binary with SQLite by default.
Runs on a VPS from $4/mo (Kamatera 1GB, 1 GB RAM) · prices checked Sep 2026
Our recommendation
Pick Workout Tracker when you want to keep GPS workouts on a server you own, for yourself or a few family and friends. You upload GPX, TCX or FIT files (by hand or through the API), add manual records such as weight lifting or swimming, follow statistics, keep daily weight and step counts, define route segments, track equipment and see a heatmap of where you have been. It is MIT-licensed Go with the web UI built into one binary and SQLite by default, with PostgreSQL and MySQL options. Our snippet is the README's Docker setup as a Compose file with the image pinned to a release tag and a generated JWT key. We did not find an upstream RAM minimum, so our 128 MB floor is an estimate. Endurain is the other fitness tracker in the catalog and adds Strava and Garmin Connect sync; wger is the workout-planning and nutrition manager.
What you need
Any VPS with at least 128 MB of RAM
A domain you control — most self-hosted setups need HTTPS in front of them
Workout Tracker's README flags these before you share it with other people:
non-negotiableOn an empty database it creates a default admin user with the password admin; sign in and change it immediately. New accounts are inactive until an admin activates them, and registration can be switched off with WT_REGISTRATION_DISABLED.
non-negotiableWT_JWT_ENCRYPTION_KEY (or WT_JWT_ENCRYPTION_KEY_FILE) keeps sessions valid across restarts; our snippet generates one into .env. Data lives in /data, which our wt_data volume holds, so back it up.
non-negotiableBy default it makes external geocoding requests to look up places; setting WT_OFFLINE=true stops that, at the cost of geocoding returning nothing. Remember that GPS files can reveal where you live; the project itself asks donors to strip home addresses from files they share.
non-negotiablePort 8080 is plain HTTP, so put a TLS reverse proxy in front. The README's examples use latest and release tags such as 2.0; the registry tags have no v prefix, and we pin 2.10.1.