MCP Directory
ServersClientsBlog

xASO - App Store Optimization

AI-powered App Store Optimization platform for mobile apps

Go to xASO
MCP Directory

Model Context Protocol Directory

MKSF LTD
Suite 8805 5 Brayford Square
London, E1 0SG

MCP Directory

  • About
  • Blog
  • Documentation
  • Contact

Menu

  • Servers
  • Clients

© 2026 model-context-protocol.com

The Model Context Protocol (MCP) is an open standard for AI model communication.
Powered by Mert KoseogluSoftware Forge
  1. Home
  2. Clients
  3. openGym

openGym

GitHub
Website

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.

21,374
1,252
<div align="center"> <img src="assets/banner.png" alt="openGym" width="720">

A 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.

Discord
Online
GitHub stars

<a href="https://trendshift.io/repositories/88268?utm_source=repository-badge&amp;utm_medium=badge&amp;utm_campaign=badge-repository-88268" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/repositories/88268" alt="DuarteSantos8%2FopenGym | Trendshift" width="250" height="55"/></a>
<a href="https://trendshift.io/repositories/88268?utm_source=trendshift-badge&amp;utm_medium=badge&amp;utm_campaign=badge-trendshift-88268" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/trendshift/repositories/88268/weekly?language=JavaScript" alt="DuarteSantos8%2FopenGym | Trendshift" width="250" height="55"/></a>

Release
Downloads
Tests
Pipeline
Coverage
License: AGPL v3

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>
<a href="https://ko-fi.com/opengym" target="_blank"><img src="https://ko-fi.com/img/githubbutton_sm.svg" alt="Support openGym on Ko-fi" height="45"></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 over 5,600 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, triple progression (reps, then sets, then load), 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.
  • 19 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 exercise animations are
part of the image, so there's nothing else to download.

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.

[!NOTE]
Images are published from the same tag to ghcr.io/duartesantos8/opengym-{api,web}
(what docker-compose.yml pulls) and registry.gitlab.com/duartesantos8/opengym/{api,web}. Swap
the image: lines if you prefer GitLab's registry, or run docker compose up -d --build to build
locally. Either way you don't need Node on the host.

<details> <summary><b>Configuration reference</b> (all through <code>.env</code>)</summary>
VariableWhat it doesDefault
RP_IDHostname passkeys are bound tolocalhost
ORIGINFull URL the app is served fromhttp://localhost:8080
WEB_PORTHost port for the web UI8080
NGINX_PORTPort the web container listens on inside the container80
BACKENDName of the API service that /api is proxied toapi
PORTPort the API listens on; the web container proxies to the same value3000
RP_NAMEName shown in the passkey promptopenGym
SESSION_DAYSHow long a sign-in lasts, in days90
ADMIN_UIDSUser ids that get the admin dashboard, comma-separated(none)
FIRST_USER_ADMIN1: the first profile created on an empty instance becomes its admin(off)
INVITE_ONLYRequire an invite code to create a profile(off)
ALLOW_GUESTOffer "Continue without account"; 0 requires a profile(on)
PASSWORD_LOGINOffer name-and-password sign-in next to passkeys(off)
TRUST_PROXYLet the sign-in throttle read the client address from proxy headers1 in docker-compose.yml
AUDIT_LOGRecord sign-ins and admin actions; 0 records nothing(on)
AUDIT_MAXEvents kept in the activity log; 0 for no limit5000
AUDIT_DAYSDays kept in the activity log; 0 keeps until AUDIT_MAX90
AUDIT_IPRecord the caller's address: off, net (network only) or fulloff
ALLOWED_PRIVATE_IPSPrivate addresses push endpoints may resolve to (FakeDNS, split-horizon DNS): comma-separated IPs, a-b ranges or CIDR blocks(none)
VAPID_SUBJECTContact URL sent with push notificationsyour ORIGIN
API_TARGETAPI image to build: default, or coach with the Claude Agent SDK and Codex CLIdefault
COACH_DISABLED1 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.

</details>

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. The exercise media ship inside the web image; 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 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
    one origin, which passkeys require.

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.

<p align="center"> <picture> <source media="(prefers-color-scheme: dark)" srcset="docs/diagrams/sync-dark.png"> <img src="docs/diagrams/sync.png" alt="Sync: a device saves with the revision it last saw; if another device wrote in between, the server answers 409 with the current document, the device merges and saves again." width="560"> </picture> </p>

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.

Your data

Everything lives in ./data on your host:

FileContents
db.jsonProfiles and public passkey data
db.json.bakA copy of the last good db.json, used if the main file can't be read
state-<user>.jsonEach user's plan, workouts, body weight and settings
audit.logAdmin activity log (no IP addresses unless you turn that on)
secretSession-cookie signing key

Back up ./data and you've backed up everything. Passkey private keys never reach the server; they
stay in your phone's secure hardware or your password manager.

Documentation

The documentation index sorts every guide by who it's for. The most used ones:

I want toRead
Get a quick answerFAQ
Set up my own instanceSelf-hosting
Use the Android or iPhone appPhone app
Bring my history from another appImporting data
Turn on the AI coachAI coach
Contribute codeContributing
Report a security problemSecurity

Roadmap

A release roughly every two weeks, each small and themed. The full plan is in
ROADMAP.md, and the issues sit in the
GitHub milestones. The next two releases
finish the community wishes, then comes a new exercise database and a themed release every
two weeks after it.

ReleaseWhenTheme
v1.3.10released Oct 2026New design, rotation, swipe actions, safer sync
v1.3.11nextFixes, about thirty community pull requests, Health Connect, measurements
v1.3.12Nov 2026Community features: focus view, widget, timer rework
v1.4.0Nov 2026A new exercise database
v1.4.1 to v1.4.4Dec 2026 and Jan 2027Programmes, the progression engine, cardio
v1.4.5 to v1.4.10Jan to Apr 2027Search, accounts, the iOS app, Android and health, looks
laterDatabase storage

Community

  • Discord for release announcements, self-hosting help and
    quick back-and-forth. Usually the fastest way to get an answer.
  • Discussions for questions and ideas
    you want the next person to find by searching.
  • Issues for reproducible bugs and agreed-on
    work. Login trouble is almost always an RP_ID/ORIGIN mismatch; the
    self-hosting guide covers it.
  • Pull requests are welcome; start with
    CONTRIBUTING.md.
<a href="https://github.com/DuarteSantos8/openGym/graphs/contributors"> <img src="https://contrib.rocks/image?repo=DuarteSantos8/openGym&max=60" alt="Contributors"> </a>

Where the code lives

GitHub is the home of the project. gitlab.com/DuarteSantos8/opengym
is a mirror, updated by a GitHub Actions workflow on every push to main and every release tag. It
exists because its CI builds the release artifacts: the signed APK, the multi-arch images and the
SBOMs. Nothing is merged there by hand. In the changelog, !NN refers to a GitLab merge request
from the weeks in August and September 2026 when the project lived there.

How openGym is built

People have asked about this, so plainly: openGym is developed with
Claude Code
, Anthropic's coding agent. A large share of the
code, tests and documentation is drafted in Claude Code sessions, and the repository carries a
CLAUDE.md with the project context those sessions start from.

What that does and doesn't mean:

  • A person decides and ships. What goes in, what gets reviewed and merged, and every release
    are the maintainer's call. Changes are tested on a staging instance and on real phones before
    they are tagged.
  • Tests hold the logic in place. The training logic is covered by unit tests, and pull requests
    run the frontend, API and MCP suites in CI. That is the guard against plausible-looking code
    that is wrong, whoever or whatever wrote it.
  • The app itself doesn't need an LLM. Nothing in a default install calls an AI service. The AI
    coach and the MCP server are opt-in, and the coach only talks to the provider you configure, with
    your own key.

Community pull requests are written by their authors, with whatever tools they like, and reviewed
the same way.

Support

openGym is free and stays free: AGPL, no paid tier, nothing held back for sponsors. If it replaced a
paid tracker for you and you'd like to chip in, there's a coffee button below. A star, a bug report
or a pull request helps just as much.

<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="60" width="217"> </a>

Star History Chart

License

openGym's own code is licensed under the GNU AGPL v3.0. You can self-host, use,
modify and share it; if you run a modified version as a network service, you have to offer that
version's source under the same license.

[!IMPORTANT]
The exercise media is not covered by that license. The stills and animations are
© Aliaksandr Makatserchyk, Gym visual, licensed for use in openGym only:
180 px in this repository and on self-hosted servers, larger only inside the app packages. A
non-commercial fork may keep them unmodified with the notice; anything else needs your own licence
from gymvisual.com. The exercise text in catalogue/ is openGym's and open to contributions.

Contributing: pull requests are signed off once with the Contributor License Agreement:
you keep the copyright in your work, openGym may use and relicense it (so the app can stay in the
App Store and Google Play long term), and every version released under the AGPL stays AGPL.

Full third-party notices, including the body-diagram geometry, are in NOTICE.md.

Repository

DU
DuarteSantos8

DuarteSantos8/openGym

Created

July 18, 2026

Updated

October 12, 2026

Language

JavaScript

Category

AI