Endurain keeps a diary of your exercise on your own server. Upload files from your watch or bike computer, or link Garmin Connect or Strava, and see each run, ride or swim with its map, pace and heart rate. A health section tracks sleep, weight, steps, water and more, and you can set weekly goals. Friends can follow you, but everything is private unless you choose to share it.
Maps, pace, heart rate and laps for every activity, from .fit, .gpx or .tcx files
Automatic sync with Garmin Connect and Strava
Health tracking for sleep, weight, steps, water and fasting
Private by default, with followers and optional public links
Great for: Runners, cyclists and swimmers who want Strava-style tracking without handing their routes to a big company.
A substantial two-part app: a FastAPI backend split into strict modules (backend/app/modules/) with import rules enforced by tests, and a Vue 3 TypeScript frontend organised by feature (frontend/src/features/). The frontend's API types are generated from the backend. Upstream's AGENTS.md and skills are thorough, which helps an AI a lot, but most changes touch both halves. Your AI always tries the gentlest step first, so your version stays easy to update.
1
Settings 4 options
No code. Change it in the app or its config.
Default visibility for new activities and which details (start time, map, heart rate…) are hidden from others.
Metric or imperial units, public share links, who can sign up, password rules, map tiles and the login page picture.
Goals per sport for distance, time, elevation, calories or number of activities, and targets for sleep, steps, weight and water.
The interface language for each person.
2
Extend 2 options
Themes, plugins, webhooks and the API. Still no fork.
Connect Garmin Connect, Strava, Gadgetbridge or RunnerUp so activities arrive by themselves.
Bulk-import years of .fit/.gpx/.tcx files or a Strava export; upload new files from scripts with an API key.
3
Code 2 options
Your AI edits the source for anything else.
New or changed screens, such as a different home page or a new chart.
New data or behaviour. Regenerate frontend types with `npm run gen:api` afterwards.
Can I trust it?
AGPL-3.0-only. Free to use and change. If you run a changed version that other people use over the internet (not just you or your household), you must offer them your source code under the same licence. "Endurain" is a trademark: self-hosting and non-commercial use of the name are fine, but paid hosting under that name needs the author's permission.
Your data: stores personal data, on your own device or server. PostgreSQL (LOCAL_PATH/postgres) for activities, health data and users; original activity files and photos in LOCAL_PATH/backend/data.
Other services: Garmin Connect (optional, free with a Garmin account); Strava (optional, free (needs your own Strava API app)); Reverse geocoding (Nominatim, Photon or geocode.maps.co) (optional, free public services by default); Email (SMTP) (optional, free with most providers); OIDC single sign-on (Authentik, Authelia, Keycloak, Pocket ID…) (optional, free (self-hosted) or varies)
Pinned version 2f33e45. Every handover uses exactly this code, which we've reviewed.
Change the default admin/admin password straight after the first start.
Serve it only over HTTPS behind a reverse proxy. Production login cookies won't work on plain http.
GPS tracks reveal your home and routines. Keep activities private or hide start locations before sharing.
By default, start coordinates are sent to the public OpenStreetMap Nominatim service to name the place. Self-host a geocoder if that worries you.
Keep SECRET_KEY, FERNET_KEY and database passwords out of AI chats. Losing FERNET_KEY means reconnecting Garmin and Strava.