The open-source, AI-powered endurance training platform.
Learn more Β»
Discord
Β·
Website
Β·
Documentation
Β·
API Docs
Β·
Issues
The open-source, AI-powered endurance training platform. You are in charge of your own data, training plans, and performance optimization.
Training platforms are awesome. They make our athletic lives easier. We use them for tracking workouts, planning training sessions, and monitoring progress. However, most tools are very limited in terms of control, customization, and data ownership.
That's where OpenAthlete comes in. Self-hosted or cloud-hosted. Privacy-first by design. API-driven and ready to be deployed on your own domain. Full control of your training data and AI-powered insights.
- π€ AI-Powered Training - Generate workouts, analyze performance, and get intelligent training suggestions
- π Comprehensive Tracking - Track workouts, visualize progress, and monitor fatigue metrics (CTL/ATL/TSB)
- π Device Integrations - Connect with Strava, Garmin, Suunto, Polar, Coros, and more
- π€ Voice Feedback - Record post-session voice notes analyzed by AI for tone, stress, and motivation
- π¨βπ« Coach Mode - Hybrid coaching system where coaches can validate AI adjustments
- π± Mobile Apps - Native iOS (on TestFlight) and Android (coming soon) apps for on-the-go training management
- π Privacy-First - Your data stays yours. Self-hostable with full control
- π Open Source - Transparent, extensible, and community-driven
| Feature | π’ OpenAthlete | π΅ TrainingPeaks | π Strava |
|---|---|---|---|
| Business Model | Open Source / SaaS | Proprietary | Proprietary |
| Self-Hostable | β Yes | β No | β No |
| AI Planning | β Adaptive & Custom | β No | |
| Privacy | β You own the data | β They own the data | β They sell the data |
| Cost | Free (Self-hosted) | $19.99/mo | $11.99/mo |
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.
- React 19 - Modern UI framework
- NestJS - Scalable Node.js backend
- TypeScript - Type-safe development
- Prisma - Next-generation ORM
- PostgreSQL - Robust database
- Tailwind CSS - Utility-first CSS
- ShadCN UI - Beautiful component library
- Vite - Next-generation frontend tooling
- OpenAI - AI-powered training insights
To get a local copy up and running, please follow these simple steps.
Here is what you need to be able to run OpenAthlete.
- Node.js (Version: >=22.14.0) - We recommend using nvm for version management
- pnpm (Version: >=9.x) - Fast, disk space efficient package manager
- PostgreSQL (Version: >=13.x) - Database
- Git - Version control
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
- Frontend: Copy
apps/web/.env.exampletoapps/web/.envand update with your configuration - Backend: Copy
apps/api/.env.exampletoapps/api/.envand update with your configuration - At minimum, you'll need:
DATABASE_URL- PostgreSQL connection stringJWT_SECRET- Secret key for JWT tokens (generate withopenssl rand -base64 32)VITE_API_URL- Backend API URL (for frontend)
- Frontend: Copy
-
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:
- Frontend at
http://localhost:5173 - Backend API at
http://localhost:3000
- Frontend at
-
Run 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
.envvariables changesCompare your
.envfiles with the.env.examplefiles 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.
OpenAthlete can be deployed using Docker. Docker configurations are provided in the repository.
Make sure you have docker & docker compose installed on the server / system.
- Clone the repository:
git clone https://github.com/openathleteorg/openathlete.git
cd openathlete-
Prepare your configuration: Copy
.env.examplefiles and update them:cp apps/api/.env.example apps/api/.env
cp apps/web/.env.example apps/web/.env
Update the appropriate values in your `.env` files, then proceed.
3. Start OpenAthlete via docker compose:
```bash
docker compose up -d
- Open a browser to your configured URL. The first time you run OpenAthlete, you'll need to create your first user.
-
Stop the OpenAthlete stack
docker compose down
-
Pull the latest changes
git pull
-
Update env vars as necessary.
-
Re-start the OpenAthlete stack
docker compose up -d
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 actively developed. Here's what's coming next:
- π§© Modular Training Logic - Custom goals, coach import, and flexible training methodologies
- π Enhanced Dashboards - Intuitive data visualizations and performance analytics
- π More Integrations - Wahoo, Coros, Zwift, Oura, and more
- π Weekly Training View - Better calendar and planning interface
- π Advanced AI Features - More intelligent training suggestions and injury prevention
- π± Mobile App Enhancements - Improved mobile experience and offline support
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:
Made with β€οΈ by athletes, for athletes