BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
Sports & fitnessTypeScript · MDXGitHub @openathleteorgOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The open-source alternative to TrainingPeaks. Self-hostable endurance training platform. Your data stays yours.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
The ethical alternative to TrainingPeaks and Strava.
OpenAthlete is open source under the AGPLv3, built so you can own your training data: self-host, export, and avoid vendor lock-in. Core hosting and processing are oriented toward the European Union with GDPR-minded defaults.
Endurance athletes feed years of intimate training data into proprietary U.S. platforms such as TrainingPeaks, Strava, and Garmin Connect, with little practical say in how that data is processed, monetized, or retained.Read the full README ↗Endurance athletes feed years of intimate training data into proprietary U.S. platforms such as TrainingPeaks, Strava, and Garmin Connect, with little practical say in how that data is processed, monetized, or retained.
OpenAthlete is a different proposition: comparable tracking and analysis in an open-source stack, hosted in the EU when you use managed infrastructure, self-hostable when you prefer your own hardware, and with training-load logic you can read and adapt in the repository. It is maintained by an ultra-trail runner based in Grenoble.
| Feature | 🟢 OpenAthlete Cloud | 🔵 TrainingPeaks | 🟠 Strava | 🟣 Intervals.icu |
|---|---|---|---|---|
| Open source code | ✅ AGPLv3 | ❌ | ❌ | ❌ |
| Self-hostable option | ✅ Free | ❌ | ❌ | ❌ |
| Data hosted in EU | ✅ France | ❌ US | ❌ US | ⚠️ Mixed |
| GDPR-native | ✅ | ⚠️ | ⚠️ | ⚠️ |
| Transparent algorithms | ✅ Code audit | ❌ Black box | ❌ Black box | ⚠️ Partial |
| Full data export | ✅ Native | ⚠️ Limited | ⚠️ Limited | ✅ |
| CTL/ATL/TSB tracking | ✅ | ✅ | ❌ | ✅ |
| AI session generation | ✅ Your key, or included for Supporters | ⚠️ Premium | ❌ | ❌ |
| Price | Free, or 5€/mo (50€/yr) as a Supporter | $19.99/mo | $11.99/mo | Free (donation) |
OpenAthlete is built by athletes, for athletes. We're proud to be part of the open-source community and grateful for all contributors who help make this platform better.
To get a local copy up and running, please follow these simple steps.
Here is what you need to be able to run OpenAthlete.
If you want to enable AI features, you may need to obtain API credentials. More details can be found in the documentation.
Clone the repo into a public GitHub repository (or fork https://github.com/openathleteorg/openathlete/fork):
git clone https://github.com/openathleteorg/openathlete.git
cd openathlete
Install packages with pnpm
pnpm install
Set up your environment variables
apps/web/.env.example to apps/web/.env and update with your configurationapps/api/.env.example to apps/api/.env and update with your configurationDATABASE_URL - PostgreSQL connection stringJWT_SECRET - Secret key for JWT tokens (generate with openssl rand -base64 32)VITE_API_URL - Backend API URL (for frontend)Setup Node version
If your Node version does not meet the project's requirements, use nvm:
nvm use
You first might need to install the specific version and then use it:
nvm install && nvm use
Build shared packages
pnpm shared build
Set up the database using Prisma
In a development environment, run:
pnpm database run db:migrate dev
In a production environment, run:
pnpm database run db:deploy
Run (in development mode)
pnpm dev
This will start:
http://localhost:5173http://localhost:3000Run type checking before committing:
pnpm tsc:check
Format and lint your code:
pnpm format:write
pnpm lint:fix
Pull the current version:
git pull
Check if dependencies got added/updated/removed
pnpm install
Apply database migrations by running one of the following commands:
In a development environment, run:
pnpm database run db:migrate dev
In a production environment, run:
pnpm database run db:deploy
Check for .env variables changes
Compare your .env files with the .env.example files to see if new variables were added.
Start the server. In a development environment, just do:
pnpm dev
For a production build, run for example:
pnpm build
pnpm start
Enjoy the new version.
On any server with Docker and its Compose plugin:
curl -fsSL https://raw.githubusercontent.com/openathleteorg/openathlete/main/scripts/install.sh | sh
OpenAthlete then runs on http://localhost from the published images, with new random secrets in openathlete/.env. Add -s -- --domain openathlete.example.org to serve your domain over HTTPS with automatic certificates. Run the script again to update.
The self-hosting guide covers HTTPS, device sync, AI, backups and upgrades from older setups.
For detailed deployment instructions, see our self-hosting documentation.
Build the application:
cd apps/api
pnpm install
pnpm build
Set up environment variables in .env
Run database migrations:
pnpm database run db:deploy
Start the server:
pnpm start:prod
Build the application:
cd apps/web
pnpm install
pnpm build
Serve the built files using a web server (nginx, Apache, etc.)
Example nginx configuration:
server {
listen 80;
server_name your-domain.com;
root /path/to/apps/web/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
DATABASE_URL="postgresql://user:password@host:5432/openathlete"
JWT_SECRET="your-secret-key"
NODE_ENV="production"
VITE_API_URL="https://api.your-domain.com"
For a complete list of environment variables, see the .env.example files in each app directory.
OpenAthlete is built by one developer in Grenoble, supported by the community. There are three ways to help the project thrive:
- Become a Supporter on OpenAthlete Cloud — The Cloud is free; the Supporter subscription (5€/month or 50€/year) funds development and adds unlimited coached athletes and AI included every month. See openathlete.org.
- Become a Patreon supporter — Recurring support without using the cloud. patreon.com/OpenAthlete.
- Contribute code or feedback — Star the repo, open issues, send PRs, join the Discord.
Self-hosting is fully supported and always free, with no limits. Supporters fund the project's long-term sustainability.
OpenAthlete is actively developed. Here's what's coming next:
See our GitHub Issues for a detailed list of proposed features and known issues.
Distributed under the AGPLv3 License. See LICENSE for more information.
Please see our contributing guide.
We have a list of good first issues that contain small features and bugs which have a relatively limited scope. This is a great place to get started, gain experience, and get familiar with our contribution process.
We also have help wanted issues that are perfect for contributors looking to make a bigger impact.
Don't code but still want to contribute? Join our Discord community and help translate OpenAthlete into your language.
Special thanks to these amazing projects which help power OpenAthlete: