Track every move
Own every moment

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.

  • AGPL-3.0 open source
  • 100% self-hosted
  • Strava and Garmin sync
Your dataYour server
.gpx · .tcx · .fitManual and bulk import
Strava · GarminSync to Endurain
DockerDeploy in minutes

Our mission

Fitness data belongs to the athlete

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.

You own your data

Everything lives on infrastructure you run. Export it, back it up, move it. No gatekeepers, no vendor lock-in, ever.

Privacy by design

Per-activity privacy controls, MFA, SSO and email verification are built in. Share what you choose; keep the rest to yourself.

Truly open source

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

A temporary feature freeze, not a pause

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 announcement
  • Security and bug fixes
  • Refactors and reliability
  • Docs and translations
  • Tests and CI hardening

Features

Everything you expect, hosted your way

A complete training log with the integrations and quality-of-life features of the big platforms, minus the surveillance.

Activity tracking

Rich activity feeds, maps, and week/month statistics across every sport.

Strava and Garmin

Sync activities, gear and body composition from Strava and Garmin Connect.

Import files

Upload .gpx, .tcx and .fit files one at a time or in bulk. .fit preferred.

Gear tracking

Track bikes, shoes, wetsuits, skis and more, down to component wear.

Health metrics

Log weight, steps and sleep, and follow trends on a dedicated dashboard.

Goals

Define distance or time goals and track progress week over week.

Multi-user and followers

Admin and user roles, follower feeds, and public user profile pages.

MFA and SSO

TOTP multi-factor auth, OIDC/SAML single sign-on and email verification.

Localized and themed

Multi-language, metric or imperial units, and a dark / light theme switch.

Endurain mobile

Your training, in your pocket

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.

The Endurain app settings screen.
The Endurain app recording a run on a live map.

Self-host it

Up and running with Docker

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.

  1. 1 Copy the example compose and env files
  2. 2 Set your secrets and integration keys
  3. 3
    Create the data folders, owned by UID 1000
    sudo mkdir -p /var/opt/endurain/backend/{data,logs}
    sudo chown -R 1000:1000 /var/opt/endurain/backend
  4. 4 docker compose up -d
docker-compose.yml Show Hide
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
.env Show Hide
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

Built in the open, together

Endurain is developed on GitHub and shaped by its community. Jump in, ask questions, translate, or help fund the work.

Take back control of your fitness data

Try the live demo, then self-host your own instance in minutes.