← AI GitHub

AI GitHub

openGym

Self-hosted gym & body-weight tracker — plan routines, log workouts (supersets, warm-ups, cardio), see which muscles are trained, fatigued or detrained, import from FitNotes/Strong/Hevy, passkey login. Your data, your server.

Key Takeaways

  • Plan your week, run guided workouts, log every set and your body weight, on your phone, synced across your devices, behind your own passkey login.
  • No account on someone else's server, no subscription, no ads, no telemetry.
  • A routine per weekday over a library of over 5,600 exercises with animated demos, searchable and
  • frontend/ is React 19 and Vite (React Router, Zustand), built to static files inside Docker.

What openGym does

Plan your week, run guided workouts, log every set and your body weight, on your phone, synced across your devices, behind your own passkey login.

Why openGym

No account on someone else's server, no subscription, no ads, no telemetry. One docker compose up and it's running.

The in-browser demo is the real app with example data, if you want to try it before installing anything.

Features

  • A routine per weekday over a library of over 5,600 exercises with animated demos, searchable and

browsable by muscle on a body map. Filter by the equipment you own.

  • Or skip the weekdays altogether: a rotation (A, B, C, A, ...) where the next session is

simply the next one you haven't done, however the week went.

  • Supersets, warm-up sets, drop sets and rest-pause, timed exercises (planks, hangs, carries),

cardio by time and speed, rest time per exercise, planned deloads.

  • Your own exercises, with your own photo, GIF or short video. Location data is stripped on the

timer runs between sets, PRs are detected as you go. On a rest day it tells you when the next

How it works

  • frontend/ is React 19 and Vite (React Router, Zustand), built to static files inside Docker.

  • api/ is plain node:http with two dependencies: @simplewebauthn/server for passkeys and

web-push for notifications. Everything is stored as JSON under ./data.

  • web/ builds the frontend and serves it with nginx, proxying /api so the whole app sits on

The training logic (progression rules, 1RM, how a logged session is read back) lives in pure functions under frontend/src/lib/ with tests beside them. The HTTP API is documented as an OpenAPI spec in api/openapi.yaml, browsable at opengym.ch/api.html.

How sync works

Each profile's data is one document with a server revision. A device sends the revision it last saw along with its changes; if another device wrote in between, the server refuses and returns the current document so the device can merge and retry. Every change carries its own stamp, down to a single setting or routine field, so the merge keeps the newest edit of each one and a deletion stays deleted.

Nothing that hasn't reached the server is discarded on disconnect or sign-out, and the app shows a banner whenever it's working offline.

Explore the project

Read the project documentation for installation, requirements and usage instructions. The overview above draws on the project's README; follow the original documentation when setting it up.

Try it for your workflow

Explore the project’s documentation for setup and usage, or save this page to a collection for later.

Read the project documentation ↗