Fitness#MCP

openGym: a self-hosted gym and body-weight tracker you actually own

openGym is a self-hosted gym tracker: training data in JSON on your own server, 1,324 animated exercises, progression rules and muscle maps. AGPL-3.0.

Project facts

GitHub Ecosystem
Repositorygithub.com/DuarteSantos8/openGym
License
AGPL-3.0
Language
JavaScript
Stars
4,203
Data checked
2026-10-06

Snapshot figures reflect the check date and may change over time.

Year three of your training log on Hevy or Strong, and the app is still asking for a subscription — while every set you’ve ever logged sits on someone else’s servers. openGym is a self-hosted gym and body-weight tracker: your plan, every logged set and your weight curve live in a folder on your own box, under the AGPL-3.0 license. As of 2026-10-06 the repo has 4,203 stars and the latest release, v1.3.9, shipped on 2026-09-28. Its sharpest feature isn’t logging — it’s the muscle map that tells you which muscles are still recovering and which have quietly gone untrained.

openGym guided session screen: bench-press animation, weights prefilled from last time, plate math and RIR inputs

Core features

  • Guided sessions: today’s workout starts itself — weights prefilled from last time, a rest timer between sets, PRs detected as you lift. Supersets, warm-up sets, drop sets, rest-pause, timed holds (planks, hangs) and cardio logged by time and speed all live in the same flow.
  • 1,324 exercises: each with an animated demo, browsable by muscle on a body map and filterable by the equipment you actually own. Missing exercises? Build your own with your photo, GIF or short video — location data is stripped on-device before upload.
  • Progression rules that explain themselves: linear, Greyskull LP and double progression, with each target stating why it is that number. Missed reps never add load, stalls schedule a deload, and there’s an estimated-1RM curve plus Structural Balance ratios in three flavors (Poliquin, Thibaudeau, ATG).
  • A three-state muscle map: where your volume went, what is still recovering, what has gone untrained — alongside a 12-month activity heatmap and a weight chart against your goal line. In the session screenshot above, the “Bar 20 kg · 28.8 kg per side” plate math and the “Every rep last time — 2.5 kg more” linear-progression hint are exactly this logic running live.
  • Your data, your folder: one JSON file per profile under ./data — back up the folder, back up everything. Two devices writing at once merge on revision instead of overwriting each other; offline logging catches up when you’re back. Passkey private keys never leave your device; the server holds only public keys.
  • Migration without lock-in: import from FitNotes, Strong, Hevy (CSV or API key) and Apple Health weight exports, and export everything as one JSON whenever you like. 17 languages including right-to-left Arabic. Android gets a signed APK (deliberately not on the Play Store); on iPhone you add the PWA from Safari. To let an AI read your training history, there’s an optional read-only MCP server — the same idea as whoop-mcp-server for wearable data — plus an opt-in AI coach that runs on your own provider key and never changes anything without approval.

openGym stats screen: a 12-month activity heatmap and the muscle balance map colored by sets worked

Typical use cases

  • Lifters who care about data ownership: training history, weight curve and PRs on your own disk, with no subscription, ads or telemetry.
  • Basement gyms and dead-spot coverage: the PWA works offline, syncs when you’re back, and two phones logging the same session don’t clobber each other.
  • Anyone leaving subscription trackers: Hevy and Strong histories import directly, so you don’t start from zero.

Quick start

Try before installing: the in-browser demo is the real app with example data. To self-host you need Docker:

git clone https://github.com/DuarteSantos8/openGym
cd openGym
cp .env.example .env
docker compose pull      # prebuilt images, amd64 + arm64
docker compose up -d

Open localhost:8080, create a profile, and the first start pulls down roughly 140 MB of exercise media. Passkeys from your phone require HTTPS — the self-hosting guide walks through Cloudflare Tunnel, Caddy, Traefik and nginx. The architecture is three moving parts: nginx serves the static frontend and proxies /api to a Node API that stores JSON files; the AI coach and MCP server in the diagram below are optional extras.

openGym architecture: nginx serves the web app and proxies /api to the Node api, data lives in ./data, AI coach and MCP are optional

Summary

openGym fits lifters who want their training data to actually be theirs and don’t mind running one Docker container. iPhone users who won’t self-host are the awkward case — Apple blocks sideloading, the native app sits past March 2027 on the roadmap, and until then it’s PWA only. Three caveats: the exercise images and animations carry disputed ownership (the dataset credits Gym visual, while ExerciseDB/AscendAPI also claims them), they are not covered by the AGPL, and your instance downloads them on first start — clear the rights before any commercial deployment. The roadmap puts a database backend in v1.4.0 (January 2027), flagged as the one compatibility break. And AGPL-3.0 means a modified instance run as a network service must publish its source. The stack is worth a look too: React 19 and Vite on the frontend, a plain node:http API with exactly two dependencies (@simplewebauthn/server and web-push), and an OpenAPI spec for the whole HTTP surface. The maintainer openly documents drafting most of the code with Claude Code, guarded by unit tests, a staging instance and real-phone checks; a default install calls no AI service. Releases come roughly every two weeks, and v1.3.9 alone folded in 39 community pull requests. Moving personal data back onto your own server is the same direction as Xnote, the self-hosted notes system we covered earlier.