AGPL-3.0Open source
Open source, from the formulas to the servers
Every line of OpenAthlete is public on GitHub: the training load maths, the watch connectors, the AI prompts. Use our servers, or install it on yours with one command.
/**
* Banister TRIMP for `minutes` spent at `hr`:
* minutes × HRr × y × e^(k × HRr),
* with HRr = (HR - HRrest) / (HRmax - HRrest)
*/
function trimpAt(hr, minutes, hrMax, hrRest, gender) {
const hrFraction = (hr - hrRest) / (hrMax - hrRest);
if (hrFraction <= 0) {
return 0;
}
const { k, y } = getTrimpCoefficients(gender);
return minutes * hrFraction * y * Math.exp(k * hrFraction);
}The licence
AGPL-3.0, in plain words
A free software licence with one extra rule for software used over a network. Here is what it means for you.
You may
- Use it for anything: your own training, your coaching business, your club.
- Read and study every line.
- Change it to suit you.
- Run your own copy, for yourself or for others.
The licence asks
- If people use a modified version over a network, offer them its source code.
- Share your changes under the same licence.
- Keep the copyright and licence notices.
Running it unmodified for your club adds no obligation. This is a summary, not legal advice: the full text is on gnu.org.
Why it matters
Your training history shouldn't depend on someone else's business plan
March 2024
Today's Plan, owned by Specialized, shuts down. Its coaches and athletes have to move platforms.
July 2026
Garmin buys TrainingPeaks. The best-known independent coaching platform now belongs to a watch maker.
With OpenAthlete
The code is public. If we stopped tomorrow, anyone could run it the next day, and your export holds your whole history.
Self-hosting
Your own instance in three steps
For a club, a lab, a coaching business, or just you.
- 1
Get a server with Docker
Any Linux machine with Docker and its Compose plugin. 1 GB of RAM is enough: the stack uses about 250 MB at rest. Point your domain's DNS at it.
- 2
Run the install script
It downloads the Compose file, writes a .env with fresh secrets, pulls the images and starts PostgreSQL, Redis, the API, the web app and Caddy for automatic HTTPS.
- 3
Create the first account
Open your domain. The first account is yours; after that, sign-up is by invitation, so invite your athletes or coaches. Run the script again to update.
- Keep a copy of .env: without HASH_PEPPER, no password can be checked.
$ curl -fsSL https://raw.githubusercontent.com/openathleteorg/openathlete/main/scripts/install.sh | sh -s -- --domain your.domain
Created .env with new secrets.
✔ postgres Started
✔ redis Started
✔ api Started
✔ web Started
✔ caddy HTTPS ready
→ https://your.domainWorks out of the box
- Every feature, with no athlete limit and no paywall
- COROS sync, which only needs your address
- FIT, GPX and TCX import, and the Activity Import API
- The MCP server for Claude, ChatGPT and other agents
- Users' own AI keys, and local models such as Ollama
Off until you set it in .env
- Email: invitations, password reset
SMTP_HOST · BREVO_API_KEY - Strava, Garmin, Polar and Suunto sync, with a developer account at each brand
STRAVA_* · GARMIN_* · POLAR_* · SUUNTO_* - Single sign-on
OIDC_ISSUER · OIDC_CLIENT_ID - AI on the instance's keys, with a monthly budget per user
OPENAI_API_KEY · AI_HOSTED_MONTHLY_BUDGET_USD - AI load estimate for planned sessions
ENABLE_TRAINING_LOAD_ESTIMATION - Analytics and error reports
POSTHOG_PROJECT_TOKEN - Billing, which you don't need
STRIPE_*
Privacy
A self-hosted instance sends nothing to us
No analytics, no error reports, no phone-home. An end-to-end test opens the self-hosted app in a real browser and fails if it makes a single request to a third party.
Two outside calls remain by design: map tiles from OpenStreetMap in the browser, and weather from Open-Meteo on your server.
Transparency
Every number has its formula
In the app, each metric says what it is and where its limits are. In the code, you can see exactly how it's computed.
Contribute
There's room for you in it
Code
Pick a “good first issue”, or fix whatever annoys you. The development setup is documented.
Good first issuesTranslations
The app speaks English, French, Italian, Spanish and Brazilian Portuguese. Fix a clumsy phrase or bring a new language.
Translation filesFeedback
Tell us what's missing, what's broken, what you would pay for. Discord is where the roadmap gets argued over.
Join the DiscordFunding
Paid for by its users, nobody else
No investors, no ads, no data sold. Supporters (€5 a month or €50 a year) and one-off coffees pay for the servers, the AI and the development time.
Built with NestJS, PostgreSQL with pgvector, Redis and BullMQ, React 19 and Vite, Capacitor and Next.js. Docker images on GHCR for amd64 and arm64.
Rather let us host it?
Same code, on our servers in France. Free, with Supporter if you want AI on our keys or more than five athletes.
Free forever. No credit card.