Skip to content
OpenAthlete

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.

apps/api/src/modules/core/helpers/training-load.ts
/**
 * 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);
}
How a session's load is computed, straight from the repository

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. 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. 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. 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.

  4. 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.domain

Works 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 resetSMTP_HOST · BREVO_API_KEY
  • Strava, Garmin, Polar and Suunto sync, with a developer account at each brandSTRAVA_* · GARMIN_* · POLAR_* · SUUNTO_*
  • Single sign-onOIDC_ISSUER · OIDC_CLIENT_ID
  • AI on the instance's keys, with a monthly budget per userOPENAI_API_KEY · AI_HOSTED_MONTHLY_BUDGET_USD
  • AI load estimate for planned sessionsENABLE_TRAINING_LOAD_ESTIMATION
  • Analytics and error reportsPOSTHOG_PROJECT_TOKEN
  • Billing, which you don't needSTRIPE_*

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.

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 issues

Translations

The app speaks English, French, Italian, Spanish and Brazilian Portuguese. Fix a clumsy phrase or bring a new language.

Translation files

Feedback

Tell us what's missing, what's broken, what you would pay for. Discord is where the roadmap gets argued over.

Join the Discord

Funding

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.