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.
Install / Use
claude mcp add DuarteSantos8 -- npx -y github:DuarteSantos8/openGymIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
OperationsSupported Platforms
Our assessment of openGym
openGym scores 93/100 on our quality scale, 135th of 744 Operations skills we index (top 19%).
Its MCP Server is 19 KB long, well organised into 14 sections with 1 code example: a thorough specification that gives an agent plenty to work with.
With 6,632 GitHub stars, it is one of the more widely adopted skills in the catalogue.
Maintenance, license and trust
- The repository was last updated today, so openGym is actively maintained.
- It is released under AGPL-3.0, a copyleft license: you can use it, but modified versions you distribute must carry the same license.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
openGym compared with similar skills
All 4 of these similar skills score higher than openGym; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| openGym (this skill)by DuarteSantos8 | 93 | 6.6k | today | MCP Server |
| Agent-Reachby Panniantong | 100 | 93.0k | 22d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 74.6k | today | CLAUDE.md |
| CowAgentby zhayujie | 100 | 47.3k | today | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 86.1k | today | MCP Server |
Frequently asked questions
- How do I install openGym?
- Run
claude mcp add DuarteSantos8 -- npx -y github:DuarteSantos8/openGym. The install tabs above show the steps for each supported agent. - Which AI agents does openGym work with?
- It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
- Is openGym safe to use?
- It is AGPL-3.0-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is openGym still maintained?
- The repository was last updated today, so openGym is actively maintained.
Skill content
View source on GitHubA self-hosted gym and body-weight tracker you actually own.
Plan your week, run guided workouts, log every set and your body weight —<br> on your phone, synced across your devices, behind your own passkey login.
Website · Live demo · Android APK · Self-hosting guide · Roadmap · Changelog
<a href="https://buymeacoffee.com/duartesantos" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" height="45" width="163"></a>
</div> <table align="center"> <tr> <td align="center"><img src="assets/screenshots/home.png" alt="Home screen" width="230"><br><sub><b>Home</b> · today's workout and weight</sub></td> <td align="center"><img src="assets/screenshots/workout.png" alt="Workout screen" width="230"><br><sub><b>Guided workout</b> · demos and sets</sub></td> <td align="center"><img src="assets/screenshots/stats.png" alt="Stats screen" width="230"><br><sub><b>Stats</b> · heatmap, charts and PRs</sub></td> </tr> </table>Why openGym
Most workout apps keep your data on their servers, push you towards a subscription, or vanish when the company does. openGym runs on your own box, keeps your data in a folder you control, and is yours to fork. It still behaves like a modern app: installable on the home screen, passkey sign-in, works offline, syncs between your phone and your laptop.
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
Planning
- A routine per weekday over a library of 1,324 exercises with animated demos, searchable and browsable by muscle on a body map. Filter by the equipment you own.
- Four starter plans (Push/Pull/Legs, Upper/Lower, Full Body, 5×5) that load as ordinary, editable routines.
- Move a session to another day without touching the weekly plan. The week starts on Monday or Sunday, your choice.
- 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 device before upload.
Training
- Guided sessions: today's workout starts itself, weights are pre-filled from last time, a rest timer runs between sets, PRs are detected as you go. On a rest day it tells you when the next session is.
- A quiet workout screen: one menu per exercise, the set number as the set's own menu, card or list view. Switches in Settings bring the old button rows back if you liked them.
- Optional effort column as RIR or RPE, colour-coded, with a plain-language line per level.
- Plate math for barbell, EZ bar, trap bar and Smith machine, worked out from the plates you own.
- Bodyweight exercises know they carry no load: log reps, add a dip belt if you use one.
- Per-side reps for lunges and single-arm work, the screen stays awake while you train, and a rest-timer alert can flash the screen for loud gyms.
- Swipe a set left to delete it (with Undo) or right to copy it. Pyramid sets with their own reps and rest per set, and a scroll wheel for any rest time up to 15 minutes.
Progress
- Progression rules per routine or per exercise: linear, Greyskull LP, double progression through a visible rep range, or adding time. Each target explains why it is that number; missed reps never add load, stalls trigger a deload.
- Estimated 1RM per exercise with its own curve, Structural Balance ratios (Poliquin, Thibaudeau, ATG), a year-long activity heatmap.
- A muscle map in three modes: where your volume went, what is still recovering, and what has gone untrained.
- Body-weight chart against a goal line, and progress photos on a timeline with a before/after slider.
- Edit any saved workout after the fact, log one you did on paper, or move it to the right date. Records are re-read from the corrected history.
Accounts and data
- Passkeys (Face ID, Touch ID, fingerprint) with per-profile data synced across devices. Password sign-in can be switched on per instance; new devices pair with a one-time code or QR.
- Two devices editing at once merge field by field instead of overwriting each other (see sync).
- Import from FitNotes, Strong, Hevy (CSV or API key) and Apple Health weight exports. Export everything as one JSON file whenever you like.
- Share a plan as a small file or print it as a PDF.
- Optional admin dashboard with invite-only signup and an activity log.
- 18 languages, including right-to-left Arabic and Traditional Chinese. Exercise names and instructions are translated for most of them.
Optional extras, off by default
- An AI coach that drafts a week of routines and later suggests changes based on what you logged. You approve every change. It runs on your server with your own provider key (Anthropic, OpenAI, Gemini or any OpenAI-compatible endpoint, Ollama included).
- An MCP server so an assistant like Claude Desktop can answer questions about your training history. Read-only and local; not part of the Docker build.
The full list of what changed release by release is in the changelog.
Quick start
You need Docker with Compose.
git clone https://github.com/DuarteSantos8/openGym
cd openGym
cp .env.example .env
docker compose pull # prebuilt images, amd64 + arm64 (skip this to build from source)
docker compose up -d
Open http://localhost:8080, tap Create profile, and you're in. The first start downloads the exercise media (about 140 MB) once.
To reach it from your phone with passkeys you need HTTPS on a domain; that's a two-line change in
.env. The self-hosting guide walks through Cloudflare Tunnel, Caddy,
Traefik and nginx, and there are separate guides for
HTTPS on a LAN and Kubernetes.
<details> <summary><b>Configuration reference</b> (all through <code>.env</code>)</summary>[!NOTE] Images are published from the same tag to
registry.gitlab.com/duartesantos8/opengym/{api,web}(whatdocker-compose.ymlpulls) andghcr.io/duartesantos8/opengym-{api,web}. Swap theimage:lines if you prefer GHCR, or rundocker compose up -d --buildto build locally. Either way you don't need Node on the host.
| Variable | What it does | 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 |
| NGINX_PORT | Port the web container listens on inside the container | 80 |
| BACKEND | Name of the API service that /api is proxied to | api |
| PORT | Port the API listens on; the web container proxies to the same value | 3000 |
| RP_NAME | Name shown in the passkey prompt | openGym |
| SESSION_DAYS | How long a sign-in lasts, in days | 90 |
| ADMIN_UIDS | User ids that get the admin dashboard, comma-separated | (none) |
| FIRST_USER_ADMIN | 1: the first profile created on an empty instance becomes its admin | (off) |
| INVITE_ONLY | Require an invite code to create a profile | (off) |
| ALLOW_GUEST | Offer "Continue without account"; 0 requires a profile | (on) |
| PASSWORD_LOGIN | Offer name-and-password sign-in next to passkeys | (off) |
| TRUST_PROXY | Let the sign-in throttle read the client address from proxy headers | 1 in docker-compose.yml |
| AUDIT_LOG | Record sign-ins and admin actions; 0 records nothing | (on) |
| AUDIT_MAX | Events kept in the activity log; 0 for no limit | 5000 |
| AUDIT_DAYS | Days kept in the activity log; 0 keeps until AUDIT_MAX | 90 |
| AUDIT_IP | Record the caller's address: off, net (network only) or full | off |
| VAPID_SUBJECT | Contact URL sent with push notifications | your ORIGIN |
| API_TARGET | API image to build: default, or coach with the Claude Agent SDK and Codex CLI | default |
| COACH_DISABLED | 1 forces the AI coach off instance-wide | (unset) |
Push-notification keys are generated on first run into ./data/vapid.json. DATA_DIR is pinned to
/data inside the container and mapped to ./data on the host; change the volume, not the
variable. The self-hosting guide covers every option in detail.
Phone app
The same codebase builds a standalone app with Capacitor: no account, no server, everything stays on the phone, with native reminders and a rest countdown in the notification shade.
- Android: download the signed APK from the latest release
or the website. Each build sits next to its
.sha256, and the app checks for updates itself. openGym is deliberately not on the Play Store. - iPhone: Apple doesn't allow installs outside the App Store. Self-host and add the PWA to your home screen from Safari, or build the native app onto your own device with Xcode.
Details and build instructions: docs/MOBILE.md.
How it works
<p align="center"> <picture> <source media="(prefers-color-scheme: dark)" srcset="docs/diagrams/architecture-dark.png"> <img src="docs/diagrams/architecture.png" alt="Architecture: the phone talks HTTPS to nginx (web), which serves the app and proxies /api to the Node api; the api stores JSON in ./data. A one-shot media service downloads exercise media on first start; the AI coach and MCP server are optional." width="520"> </picture> </p>frontend/is React 19 and Vite (React Router, Zustand), built to static files inside Docker.api/is plainnode:httpw
Truncated for display — read the full file on GitHub.
Related Skills
Agent-Reach
93.0kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
74.6kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
CowAgent
47.3kOpen-source personal AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-agent, multi-model, multi-channel. Lightweight, extensible, one-line install.
Scrapling
86.1k🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
