You own your data
Everything lives on infrastructure you run. Export it, back it up, move it. No gatekeepers, no vendor lock-in, ever.
Endurain is a self-hosted fitness tracking service, a privacy-first home for your activities, gear and health data. No lock-in, no data mining. Just your training history, on infrastructure you control.
Our mission
Endurain exists because your training history is too personal to hand over to someone else's cloud. It is built for people who want the polish of a modern fitness platform without giving up ownership, privacy, or control.
Everything lives on infrastructure you run. Export it, back it up, move it. No gatekeepers, no vendor lock-in, ever.
Per-activity privacy controls, MFA, SSO and email verification are built in. Share what you choose; keep the rest to yourself.
Licensed under AGPL-3.0 and developed in the open on GitHub. Read every line, file an issue, or ship a pull request.
Current status
Endurain has grown fast. To keep it healthy, the focus has shifted from shipping new features to strengthening the foundations: clearer module boundaries, more predictable background work, better tests, and safer releases. Bug fixes, security patches, docs and translations continue as usual.
Read the announcementFeatures
A complete training log with the integrations and quality-of-life features of the big platforms, minus the surveillance.
Rich activity feeds, maps, and week/month statistics across every sport.
Sync activities, gear and body composition from Strava and Garmin Connect.
Upload .gpx, .tcx and .fit files one at a time or in bulk. .fit preferred.
Track bikes, shoes, wetsuits, skis and more, down to component wear.
Log weight, steps and sleep, and follow trends on a dedicated dashboard.
Define distance or time goals and track progress week over week.
Admin and user roles, follower feeds, and public user profile pages.
TOTP multi-factor auth, OIDC/SAML single sign-on and email verification.
Multi-language, metric or imperial units, and a dark / light theme switch.
Endurain mobile
The Endurain app records runs, rides, walks and hikes live on a map and uploads them straight to your own server. It works offline, syncs automatically when you reconnect, and signs you in with SSO and MFA.
The Android app is available as a public beta on Google Play and the iOS app as a public beta on TestFlight. Beta builds are pre-release software and may be incomplete or unstable.
A closer look
A clean, modern interface across activities, gear, health and settings, in light or dark, on desktop and mobile.
Self-host it
Endurain ships as a Docker image and is configured entirely through environment variables. A complete docker compose example lives in the repository. Spin up the stack and open the app.
sudo mkdir -p
/var/opt/endurain/backend/{data,logs}
sudo chown -R 1000:1000 /var/opt/endurain/backend
docker compose up -d
services:
endurain:
container_name: endurain-app
image: ghcr.io/endurain-project/endurain:latest
env_file:
- .env
volumes:
- ${LOCAL_PATH:-/var/opt/endurain}/backend/data:/app/backend/data:Z
- ${LOCAL_PATH:-/var/opt/endurain}/backend/logs:/app/backend/logs:Z
ports:
- "8080:8080"
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
postgres:
image: docker.io/postgres:18@sha256:74935e72241653ca55e0414067e6d8763aceb8a810eb51b452253ec3dcfc4336
container_name: endurain-postgres
env_file:
- .env
healthcheck:
test: ["CMD-SHELL", "pg_isready -U endurain"]
interval: 5s
timeout: 5s
retries: 5
volumes:
- ${LOCAL_PATH:-/var/opt/endurain}/postgres:/var/lib/postgresql/data:Z
restart: unless-stopped
DB_PASSWORD=changeme
# Must be the same as DB_PASSWORD
POSTGRES_PASSWORD=changeme
# Generate with: openssl rand -hex 32
SECRET_KEY=changeme
# Generate with: openssl rand -base64 32
FERNET_KEY=changeme
TZ=Europe/Lisbon
ENDURAIN_HOST=https://endurain.example.com
BEHIND_PROXY=true
# If you change this, you also have to change DB_DATABASE
POSTGRES_DB=endurain
# Uncomment and set it to the same as POSTGRES_DB if you change it
# DB_DATABASE=endurain
# If you change this, you also have to change DB_USER
POSTGRES_USER=endurain
# Uncomment and set it to the same as POSTGRES_USER if you change it
# DB_USER=endurain
PGDATA=/var/lib/postgresql/data/pgdata
These files are examples only. Replace the placeholder secrets and adjust paths and ports for your setup. Need help? Check docs.endurain.com.
You can generate SECRET_KEY and FERNET_KEY at docs.endurain.com/tools/.
Login needs ENDURAIN_HOST to match the address you open, so serve Endurain through a reverse proxy with HTTPS. Plain HTTP on port 8080 will not let you log in with the provided example.
Community and support
Endurain is developed on GitHub and shaped by its community. Jump in, ask questions, translate, or help fund the work.
Source, issues and pull requests.
Guides for install, config and dev.
Chat, help and announcements.
Follow updates in the fediverse.
Follow updates on Bluesky.
Follow the project on LinkedIn.
Help localize Endurain via Weblate.
Sponsorships keep Endurain independent and moving forward.
Try the live demo, then self-host your own instance in minutes.