Areas we serve

Self-Hosted openGym: Your Workout Log, Passkeys, and Muscle Map on Your Server

Strong wants twelve bucks a year. Hevy wants more. Both of them sit on someone else's database with your PRs, progress photos, and shoulder injury notes in a row you cannot export on a bad day. If you lift seriously, that history is not "app data" — it is a diary you will want in ten years.

openGym (~14k stars, AGPL-3.0) is a self-hosted gym and body-weight tracker that behaves like a modern phone app: plan the week, run guided sessions, log supersets and cardio, track fatigue on a muscle map, and sign in with passkeys. Your server, your ./data folder, no subscription pitch at the end of a set.

What it does well

Planning. Routines per weekday or rotation-based (A/B/C without caring which calendar day it is). 5,600+ exercises with demos, equipment filters, starter templates (PPL, upper/lower, 5×5), supersets, warm-ups, drop sets, rest-pause, timed planks and carries, deload weeks.

Training. Guided workouts with last-weight prefills, rest timers, PR detection, plate math for barbells, per-side reps, RIR/RPE columns, swipe-to-delete sets with undo. Screen stays awake; optional flash alert when rest ends in a loud gym.

Progress. Linear, Greyskull, double/triple progression rules, estimated 1RM curves, structural-balance ratios, year heatmap, muscle map modes (volume, recovery, detraining), body-weight charts, progress photos with before/after slider. Import from FitNotes, Strong, Hevy (CSV or API), Apple Health weight; export full JSON anytime.

Accounts. WebAuthn passkeys by default; optional password login, invite-only signup, guest mode toggle, multi-device sync with field-level merge instead of last-write-wins. Admin dashboard and audit log if you run a small gym club on one instance.

Optional AI coach (your API key, Ollama-friendly) and a read-only MCP server for local assistants — both off unless you opt in.

Why self-host a workout app?

Health data stays personal. Weight trends and photos are sensitive; hosting on a Canadian VPS you control beats trusting a startup's retention policy.

No subscription treadmill. AGPL software on your metal — pay for the box, not per month for export rights.

Family or team instances. Invite-only mode + passkeys works for a household sharing one server without putting everyone's logs in a commercial cloud.

Offline-first habits. PWA on iPhone (no App Store APK drama on Android either — they ship direct APK with update checks). Self-host with HTTPS and add to home screen; same origin matters for passkeys.

Running it

git clone https://github.com/DuarteSantos8/openGym
cd openGym
cp .env.example .env
docker compose pull
docker compose up -d

UI on port 8080 by default (WEB_PORT). Stack: opengym-api (Node, data in ./data) + opengym-web (nginx serves React, proxies /api). Images on ghcr.io/duartesantos8/opengym-{api,web}, amd64 and arm64.

For passkeys from your phone, set RP_ID and ORIGIN to your real HTTPS domain — the project's self-hosting guide covers Caddy, Traefik, Cloudflare Tunnel, and LAN HTTPS.

Back up ./data (users, passkeys, workouts, custom exercise uploads). Plan 1–2 GB RAM for a personal instance; more if you enable the coach build target and hit external LLMs hard.

Who it's for

Good fit: lifters leaving Strong/Hevy, homelabbers who want one more useful container, coaches who need invite-only hosting for athletes.

Skip it: people who want zero ops and are fine with SaaS; anyone unwilling to maintain TLS for passkeys on mobile.

We do the hosting layer — firewall, snapshots, reverse proxy — on Docker hosting in Canada. Tell us if it's solo use or a small group and whether you need the AI coach image; we'll size disk for data/ and walk through ORIGIN on day one.

Tags:
  • openGym
  • Fitness
  • Workout
  • Passkeys
  • Self-Hosted
  • Docker

Need Help With Your Hosting?

Tell us about your application — we respond within 1 hour with honest recommendations.