A self-hosted, data-driven workout management and analytics platform for serious lifters who want to track, analyze, and optimize their training.
Documentation · Installation · API Reference
- Smart Workout Tracking - Log sets, reps, and weights with precision
- Progress Analytics - Visualize strength gains with comprehensive charts
- Progressive Overload - Built-in insights to optimize training decisions
- Exercise Library - Comprehensive database with custom exercise support
- Body Weight Tracking - Monitor weight changes alongside performance
- Self-Hosted - Full control over your training data
- React 19 with TypeScript
- Vite for fast development
- Framer Motion for smooth UI transitions
- TailwindCSS for styling
- React Router v7 for navigation
- Node.js with Express 5
- TypeScript
- Prisma ORM (v7)
- PostgreSQL database
- JWT authentication
- Docker & Docker Compose
- Nginx reverse proxy
- Multi-container architecture
- Docker & Docker Compose
All deployment files are in the deploy/ directory. See the Installation Guide for the full walkthrough.
1. Create a directory and download the files
mkdir asap && cd asap
# With bundled database:
curl -O https://raw.githubusercontent.com/asap-open/ASAP/main/deploy/compose.with-db.yaml
curl -O https://raw.githubusercontent.com/asap-open/ASAP/main/deploy/.env.with-db
# Or with your own external database:
curl -O https://raw.githubusercontent.com/asap-open/ASAP/main/deploy/compose.external-db.yaml
curl -O https://raw.githubusercontent.com/asap-open/ASAP/main/deploy/.env.external-db2. Copy the env file, fill in your values, and start
cp .env.with-db .env # or .env.external-db
# edit .env — set JWT_SECRET, DOMAIN_NAME, etc.
docker compose -f compose.with-db.yaml up -dThe app will be available at http://<your-host> (port 80).
- Clone the repository
git clone https://github.com/asap-open/ASAP.git
cd ASAP- Set up environment variables
Create .env files in both client/ and server/ directories:
server/.env
DATABASE_URL="postgresql://postgres:postgres@db:5432/workout_db"
JWT_SECRET="your-super-secret-jwt-key-change-this"
PORT=3000
NODE_ENV=developmentclient/.env
VITE_BACKEND_SERVER_URL=http://localhost:3000
DOMAIN_NAME=localhostHow API routing works: The compiled JS always uses a relative
/apipath. Nginx inside the client container proxies those requests toVITE_BACKEND_SERVER_URLat runtime. Set this to the internal Docker/Kubernetes service name (e.g.http://server:3000), not a public hostname — the same image works across all environments without rebuilding.
- Start the application
docker-compose up -d- Access the application
- Frontend: http://localhost:5173
- Backend API: http://localhost:3000
Backend
cd server
yarn install
yarn devFrontend
cd client
yarn install
yarn devcd server
yarn prisma migrate devcd server
yarn seed├── client/ # React frontend
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Page components
│ │ ├── context/ # React context providers
│ │ ├── layouts/ # Layout components
│ │ └── utils/ # Utilities and API client
│ └── Dockerfile
├── server/ # Express backend
│ ├── src/
│ │ ├── controllers/ # Route controllers
│ │ ├── routes/ # API routes
│ │ ├── middleware/ # Custom middleware
│ │ └── utils/ # Utilities
│ ├── prisma/ # Database schema & migrations
│ └── Dockerfile
├── docs/ # VitePress documentation
└── docker-compose.yaml # Container orchestration
Full documentation is available at the /docs directory. Build and serve locally:
cd docs
yarn install
yarn docs:devVisit http://localhost:5174 to view the documentation.
Full API documentation is available at asap-open.github.io/asap-docs/api/authentication.
Key endpoints:
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/auth/signup |
Register a new user |
POST |
/api/auth/signin |
Sign in (email or username) |
GET |
/api/exercises/search |
Search/filter exercises |
POST |
/api/sessions |
Create workout session |
GET |
/api/progress/heatmap |
Get workout activity heatmap by year |
GET |
/api/progress/metrics |
Get KPI metrics (consistency, streak, volume) |
GET |
/api/progress/volume |
Get volume & weight time-series chart data |
GET |
/api/pbs |
Get personal bests |
POST |
/api/weights |
Log body weight |
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the GPLv3 License — see LICENSE for details.
Built with precision for measurable improvement.
