A workout tracking web application for personal use (or family, friends), geared towards running and other GPX-based activities
Self-hosted, everything included.
Heavily inspired by FitTrackee ❤️.
Run the latest master image from GitHub Container Registry:
docker run -p 8080:8080 ghcr.io/jovandeginste/workout-tracker:master
Open your browser at http://localhost:8080
To persist data and sessions, run:
docker run -p 8080:8080 \
-e WT_JWT_ENCRYPTION_KEY=my-secret-key \
-v $PWD/data:/data \
ghcr.io/jovandeginste/workout-tracker:master
Download a pre-built binary or build it yourself (see Development below).
wget https://github.com/jovandeginste/workout-tracker/releases/download/v0.3.0/workout-tracker-v0.3.0-linux-amd64.tar.gz
tar xf workout-tracker-v0.3.0-linux-amd64.tar.gz
./workout-tracker
To persist sessions, run:
export WT_JWT_ENCRYPTION_KEY=my-secret-key
./workout-tracker
This will create a new database file in the current directory and start the web server at http://localhost:8080
.
- personal totals
- running records
- a calendar view
- recent activities (by you and other users)
Overview of all your activities, with summaries. The columns are sortable.
- a zoomable, dragable map of the GPX track with more details per point
- many summarized statistics
- a breakdown per kilometer
- track color based on elevation of the segment
- green and red circle are start and end points of the track
- every point on the track has a tooltip with a summary at that moment
- hover over the breakdown per kilometer to highlight the point
- Upload one or multiple GPX files.
- The files are parsed when uploaded, statistics and other information are calculated and stored in the database (serialized).
- Re-calculate all uploaded workouts (useful while developing)
- Graphs showing monthly aggregated statistics.
- switch between (supported) languages
- use the language configured in the browser (default)
- very limited amount of languages supported for now 😄
The web server looks for a file workout-tracker.yaml
(or json
or toml
) in the current directory, or takes it's
configuration from environment variables. The most important variable is the JWT encryption key. If you don't provide
it, the key is randomly generated every time the server starts, invalidating all current sessions.
Generate a secure key and write it to workout-tracker.yaml
:
echo "jwt_encryption_key: $(pwgen -c 32)" > workout-tracker.yaml
See workout-tracker.example.yaml
for more options and details.
After starting the server, you can access it at http://localhost:8080 (the default port). A login form is shown.
If no users are in the database (eg. when starting with an empty database), a default admin
user is created with
password admin
. You should change this password in a production environment.
- install go
- clone the repository
go build ./
./workout-tracker
This does not require npm or Tailwind, since the compiled css is included in the repository.
You need to install Golang and npm.
Because I keep forgetting how to build every component, I created a Makefile.
# Make everything. This is also the default target.
make all # Run tests and build all components
# Install system dependencies
make install-deps
# Testing
make test # Runs all the tests
make test-assets test-go # Run tests for the individual components
# Building
make build # Builds all components
make build-tw # Builds the Tailwind CSS output file
make build-server # Builds the web server
make build-docker # Performs all builds inside Docker containers, creates a Docker image
# Running it
make serve # Runs the compiled binary
make dev # Runs a wrapper that watches for changes, then rebuilds and restarts
make watch-tw # Runs the Tailwind CSS watcher (not useful unless you're debugging Tailwind CSS)
# Cleanin' up
make clean # Removes build artifacts
A single binary that runs on any platform, with no dependencies.
The binary contains all assets to serve a web interface, through which you can upload your GPX files, visualize your tracks and see their statistics and graphs. The web application is multi-user, with a simple registration and authentication form, session cookies and JWT tokens). New accounts are inactive by default. An admin user can activate (or edit, delete) accounts. The storage is a single SQLite database.
- Go, with some notable libraries
- HTML, CSS and JS
- Docker
- write tests!!!!!
- add support for authentication through a reverse proxy
- make a dev-flag that doesn't embed all files in the binary
- add support for generic database drivers
- add support for other types of import files (eg. Garmin fit files)
- add support for auto-import from a folder (per user)
- see if htmx is worth using