A modern open-source workout and fitness tracking application for planning workouts, tracking sets, monitoring body weight, and analyzing training progress. Features 1,300+ exercises with animated demonstrations, guided workouts, automatic progression, muscle maps, personal records, activity statistics, and multi-device support. Built with React, Vite, Node.js, and Docker, with full self-hosting support.

A self-hosted gym & body-weight tracker you actually own.
Plan your week, run guided workouts, track every set and your body weight over time —
on your phone, synced across devices, behind your own passkey login.
No account on someone else's server, no subscription, no ads. Just docker compose up.
![]() Home — today's workout & weight | ![]() Guided workout — animated demos & sets | ![]() Stats — heatmap, charts & PRs |
No signup, nothing to install — it runs entirely in your browser on example data.
There's no server behind the demo, so passkey sign-in, sync across devices and the
admin dashboard only exist in a self-hosted instance.
Most workout apps lock your data behind a login on their servers, nag you to upgrade, or disappear when the startup does. openGym is the opposite: it runs on your box, your data stays in a folder you control, and it's yours to fork. It still feels modern — installable as a home-screen app, passkey sign-in, offline support, sync across your phone and laptop.
You need Docker with Compose.
git clone https://github.com/DuarteSantos8/openGym
cd openGym
cp .env.example .env
docker compose pull # grab prebuilt images (amd64 + arm64) — skip to build from source instead
docker compose up -d
Open http://localhost:8080, tap Create profile, and you're in. First launch downloads
the exercise media (~140 MB) once. Prefer building the images yourself instead of pulling from
ghcr.io? Drop the pull step and run docker compose up -d --build — you don't need Node or
a build step locally either way.
Want it reachable from your phone over the internet with passkeys? You'll need an HTTPS domain — a two-line change in
.env. See docs/SELF_HOSTING.md.
The same codebase also builds a standalone mobile app (Capacitor): no account, no sync, no backend — everything stays on the phone, with native workout-day reminders and share-sheet backups. Self-hosting gets you multi-device sync and profiles for friends & family; the mobile app is the install-and-done flavor.
┌─────────────┐ ┌──────────────────────────────┐
│ Your phone │──HTTPS─▶│ web (nginx) │
│ / laptop │ │ ├─ serves the built app │
└─────────────┘ │ └─ proxies /api ──────────┐│
└──────────────────────────────┘│
▼
┌──────────────────────────┐
│ api (Node + WebAuthn) │
│ └─ ./data (JSON files) │
└──────────────────────────┘
@simplewebauthn/server), storing everything as plain JSON files under ./data/api to the backend so it's all on one origin (passkeys require this)Lives in ./data on your host: db.json (profiles + public passkeys), state-<user>.json
(each user's plan, workouts, body weight, settings), and secret (the session-cookie key).
Back up ./data and you've backed up everything. Passkey private keys never touch the
server — they stay in your phone's secure hardware / your password manager.
All via .env (see .env.example):
| Variable | What it is | Default |
|---|---|---|
RP_ID | Hostname passkeys are bound to | localhost |
ORIGIN | Full URL the app is served from | http://localhost:8080 |
WEB_PORT | Host port for the web UI | 8080 |
RP_NAME | Name shown in the passkey prompt | openGym |
ADMIN_UIDS | User ids that get the admin dashboard (comma-separated) | (none) |
INVITE_ONLY | Require an invite code to create a profile | (off) |
Push notification keys are generated on first run and saved to ./data/vapid.json — nothing to set.
Rough, community-driven — ideas and PRs welcome:
React 19 + Vite (React Router, Zustand) · Node (no framework) · nginx · Docker Compose ·
WebAuthn · exercise data from hasaneyldrm/exercises-dataset.
No database server, no cloud dependencies — the frontend builds inside Docker, so self-hosting
stays a one-command docker compose up.
The training logic — progression rules, 1RM estimation, how a logged session is read back —
lives in pure functions under frontend/src/lib/ with tests next to them: npm test in
frontend/. Vitest is a dev dependency; the app itself ships no runtime dependencies beyond
React, the router and Zustand.
RP_ID/ORIGIN
mismatch.Issues and PRs welcome — see CONTRIBUTING.md. Good first issues: more starter plans, exercise-data languages, import from other trackers. A ⭐ helps more people find it.
openGym is free and stays free: AGPL, no subscription, no paid tier, nothing held back for sponsors. If it replaced a paid tracker for you and you want to chip in, the Sponsor button at the top of the page is there — a star, a bug report or a PR is worth just as much.
GNU AGPL v3.0 — free and open source. You can self-host, use, modify and share it; if you run a modified version as a network service, you must offer that version's source under the same license. Nobody can turn openGym into a closed, proprietary product.
Exercise images/GIFs are fetched from the upstream dataset and keep their own terms — see NOTICE.md.
A comprehensive fitness exercise dataset featuring 1,324 exercises with animated GIFs, thumbnails, target muscles, body parts, equipment, muscle-group data, and step-by-step instructions in 10 languages. Ideal for building workout apps, fitness platforms, exercise recommendation systems, and health-related projects.

A creative and modern developer portfolio template designed to showcase projects, skills, and professional experience. Built with Next.js, React, TypeScript, and Tailwind CSS, featuring a responsive layout, dark mode, SEO optimization, and a clean developer-focused interface.

An elegant and modern developer portfolio template designed to showcase projects, skills, experience, and personal information. Built with Next.js, React, TypeScript, and Tailwind CSS, featuring a fully responsive layout, SEO optimization, customizable styling, and performance-focused architecture.

A modern and minimalist developer portfolio template built with Next.js, React, and Tailwind CSS. Fully responsive, SEO-friendly, and optimized for performance. Perfect for developers, designers, and creators who want to quickly launch a professional personal website.
