openGym: Self-hosted workout planning and body-weight tracking with Docker
A Docker-deployed workout tracker for people who want their data to stay on their own server.
GitHub DuarteSantos8/openGym Updated 2026-10-06 Branch main Stars 4.2K Forks 654
JavaScript React 19 Docker Workout tracking Passkeys JSON data storage AGPL-3.0

🧭 Decision Guide

Try it if you

  • You want to run workout planning and body-weight tracking on your own server with Docker.
    The README sections “Why openGym” and “Quick start” state that the project runs on your own box and starts with Docker Compose.
  • You need 1,324 exercises, a muscle map, supersets, and RIR/RPE logging.
    The README “Features” section lists 1,324 exercises, a muscle map, supersets, and RIR/RPE.
  • You want to migrate workout history from FitNotes, Strong, or Hevy.
    The README “Accounts and data” section lists imports from FitNotes, Strong, and Hevy.
  • You need synchronization between a phone and laptop and want passkey sign-in.
    The README introduction describes passkey sign-in and phone/laptop synchronization; “Accounts and data” describes device synchronization.

Skip it if you

  • You cannot provide an HTTPS domain but need to use passkeys on a phone.
    The README “Quick start” section explicitly says that phone passkeys require HTTPS on a domain.
  • You do not want to run Docker or manage the ./data directory on the host.
    The README “Quick start” requires Docker with Compose and says DATA_DIR maps to host-side ./data.
  • You require cloud hosting, a subscription service, or an official hosted account system.
    The README “Why openGym” emphasizes self-hosting, no account on someone else’s server, and no subscription.
  • You require the AI coach to work without an external provider key.
    The README “Optional extras, off by default” section says that the AI coach uses your own provider key.

Requirements

  • Docker with Compose is required.
  • The default web port is 8080 and the API port is 3000.
  • The first startup downloads about 140 MB of exercise media.
  • Phone passkeys require HTTPS on a domain.
  • Node is not required on the host; the README says Docker deployment does not need Node on the host.

First step (verbatim from README)

docker compose up -d

Watch out

  • Before using phone passkeys, configure the HTTPS domain-related settings in .env.
    The README “Quick start” section requires HTTPS on a domain and says this involves changing two lines in .env.
  • When using GHCR images, replace the image lines in docker-compose.yml.
    The README “Quick start” section says the default images come from GitLab Registry and that GHCR requires changing the image lines.
  • When enabling the AI coach, set API_TARGET to coach and configure a provider key.
    The README configuration table lists the coach option for API_TARGET, while the AI coach section requires your own provider key.
  • Audit logging is enabled by default, with AUDIT_MAX set to 5,000 events and AUDIT_DAYS set to 90 days.
    The README configuration table gives the defaults for AUDIT_LOG, AUDIT_MAX, and AUDIT_DAYS.

Not stated in the README

  • The README does not specify minimum CPU, memory, or disk requirements.
  • The README does not state the supported user count or workout-record scale for one instance.
  • The README does not describe feature differences between the Android APK and Docker versions.
  • The README does not provide complete database migration, backup, restore, or disaster-recovery procedures.
  • The README does not explain the long-term maintenance plan behind 10 contributors and 5 releases.
  • The README does not provide a compatibility matrix for passkeys across browsers and reverse-proxy combinations.

💡 Deep Analysis

6
Yes I currently use FitNotes, Strong, or Hevy and want to migrate workout history to my own server while retaining full JSON export later. Does openGym meet that migration requirement?
For: A lifter migrating from FitNotes, Strong, or Hevy who needs historical workouts preserved and JSON export

Yes. The README directly supports imports from these sources and full JSON export, although the result depends on how the source fields map.

  • The Accounts and data section lists imports from FitNotes, Strong, and Hevy; FitNotes-style imports use CSV, while Strong and Hevy can also use an API key. Apple Health weight exports are supported too.
  • The same section says all data can be exported as one JSON file whenever needed, matching the requirement for portability.
  • The Progress section allows saved workouts to be edited, paper workouts to be added, and dates to be corrected; records are re-read from the corrected history.
  • The README does not promise identical handling of every source app’s fields, units, exercise names, or date formats, so migration accuracy is not fully guaranteed.
  • Accounts and data: "Import from FitNotes, Strong, Hevy (CSV or API key) and Apple Health weight exports."
  • Accounts and data: "Export everything as one JSON file whenever you like."
  • Progress: "Edit any saved workout after the fact... Records are re-read from the corrected history."
Not stated in the README:The README does not provide complete field mappings, unit-conversion rules, or importer error-report formats.;It does not specify import duration or file-size limits for very large histories.
No I plan to deploy openGym on Kubernetes with invite-only signup, an admin dashboard, and audit logging for multiple personal profiles. Is it suitable for organizational fitness management?
For: An operator preparing a Kubernetes deployment for multiple personal profiles who needs invite-only signup, an admin dashboard, and audit logging

No, not as a full organizational fitness-management system. It can support a small multi-profile self-hosted instance, but the README does not promise coach approval, team permissions, or high-concurrency operation.

  • The README provides a separate Kubernetes self-hosting guide, so the deployment form is supported.
  • The configuration reference includes INVITE_ONLY, ADMIN_UIDS, and AUDIT_LOG, while Accounts and data lists an optional admin dashboard.
  • However, the project insights state that JSON-file storage is suited to personal or small-scale instances, not large user counts, high concurrency, multi-tenancy, or complex queries.
  • The same analysis says the project targets personal fitness tracking and lacks medical governance, coach approval workflows, and organization-level permissions.

A household or small private deployment may fit, but formal team management exceeds the documented security and data model.

  • Quick start: "there are separate guides for ... Kubernetes"
  • Configuration reference: `ADMIN_UIDS`, `INVITE_ONLY`, and `AUDIT_LOG`
  • Project insights, usage_limitations: "suited to personal or small-scale instances; not large user counts, high concurrency, or multi-tenancy"
  • Project insights, usage_limitations: "not a medical, rehabilitation, or professional sports-team management system"
Not stated in the README:The README does not specify Kubernetes replica counts, capacity planning, disaster recovery, or rolling-upgrade requirements.;It does not define the exact admin-dashboard operations or permission differences between administrator roles.
It depends I only have an ARM64 NAS and want to deploy openGym with Docker, then log workouts from my phone over Passkeys when away from home. Is this a good fit?
For: A personal user with an ARM64 NAS who wants Docker self-hosting and Passkey-based workout logging from a phone

It depends: the base deployment fits an ARM64 NAS, but remote phone use with Passkeys depends on correct HTTPS and domain configuration.

  • The README explicitly provides prebuilt amd64 and arm64 images and says Node.js is not required on the host.
  • Data is kept in a folder controlled by the user, which suits NAS persistence and backups.
  • Phone Passkeys require HTTPS on a domain, with matching RP_ID and ORIGIN; running Compose alone is not sufficient.
  • The first start downloads about 140 MB of exercise media, so the NAS needs enough storage and bandwidth.

It is straightforward on a LAN, but remote use requires a reverse proxy or a service such as Cloudflare Tunnel.

  • Quick start: "prebuilt images, amd64 + arm64"
  • Quick start: "Either way you don't need Node on the host."
  • Quick start: "To reach it from your phone with passkeys you need HTTPS on a domain"
  • Configuration reference: `RP_ID` and `ORIGIN`
docker compose up -d
Not stated in the README:The README does not specify minimum CPU, memory, or storage requirements for ARM64 NAS devices.;It does not document compatibility with specific NAS vendors' Compose implementations.
Yes I train with Push/Pull/Legs or 5×5, record RIR/RPE, and want double progression, estimated 1RM, and muscle-recovery analysis. Is openGym a better fit than a simple weight-and-reps log?
For: An intermediate or advanced lifter using Push/Pull/Legs or 5×5, relying on RIR/RPE and double progression, who wants muscle recovery visibility

Yes. It fits because it combines routines, effort ratings, progression, and muscle status instead of storing only weight and reps.

  • The Planning section includes Push/Pull/Legs, Upper/Lower, Full Body, and 5×5 starter plans, all editable as normal routines.
  • The Training section supports optional RIR or RPE, prefilled previous weights, PR detection, supersets, warm-ups, and drop sets.
  • The Progress section provides linear progression, Greyskull LP, double progression, and time progression; missed reps do not add load, and stalls trigger a deload.
  • It also provides estimated 1RM, training-volume views, recovering muscles, and untrained muscles, matching long-term progression tracking.

The limitation is that these indicators depend on exercise classification and accurate logging; they are not medical or precise physiological measurements.

  • Planning: "Four starter plans (Push/Pull/Legs, Upper/Lower, Full Body, 5×5)"
  • Training: "Optional effort column as RIR or RPE"
  • Progress: "linear, Greyskull LP, double progression"
  • Progress: "A muscle map in three modes: where your volume went, what is still recovering, and what has gone untrained."
Not stated in the README:The README does not specify the recovery model's time windows, weighting formula, or intensity calibration.;It does not say whether Structural Balance ratios can use custom standards.
Yes I want the AI coach to use my own Anthropic, OpenAI, Gemini, or Ollama credentials, while Claude Desktop queries workout history read-only. Can openGym support both?
For: An open-source developer who wants to use Anthropic, OpenAI, Gemini, or Ollama on their own server and query history through Claude Desktop

Yes, but these are two optional features with different deployment boundaries, and MCP is not part of the core Docker build.

  • The Optional extras section says the AI coach runs on the server with the user’s own provider key and supports Anthropic, OpenAI, Gemini, OpenAI-compatible endpoints, and Ollama.
  • The coach drafts a training week or suggests changes, while the README explicitly requires user approval for every change.
  • The MCP server is intended for Claude Desktop and is read-only and local, matching a history-query requirement.
  • The README also states that MCP is not part of the Docker build, so it requires separate setup from its own documentation; docker compose up -d should not be assumed to enable it.

This fits users who want controlled AI assistance rather than automatic plan mutation.

  • Optional extras, off by default: "your own provider key (Anthropic, OpenAI, Gemini or any OpenAI-compatible endpoint, Ollama included)"
  • Optional extras, off by default: "You approve every change."
  • Optional extras, off by default: "Read-only and local; not part of the Docker build."
Not stated in the README:The README does not specify supported model versions, context limits, or failure behavior for the AI coach.;It does not provide the complete Claude Desktop configuration format or detailed MCP permission boundaries.
It depends I log workouts offline on my phone and review or edit them on a laptop; sometimes both devices edit records at once. Can openGym avoid simple last-write-wins overwrites?
For: A personal user switching between a phone and laptop who needs offline workouts and simultaneous edits on two devices

It depends. The README explicitly supports offline use, multi-device sync, and merging concurrent edits, but it does not describe a full version-control system.

  • The Why openGym section says the app is installable on the home screen, works offline, and syncs between phone and laptop.
  • The Accounts and data section explicitly says edits from two devices merge instead of overwriting each other.
  • The workout interface also keeps the screen awake and provides rest timers and alerts, fitting gym-phone use.
  • However, the project insights note that complex conflicts may still require review. The supplied README excerpt does not define conflict precedence, maximum offline duration, or a history-recovery interface.

It is suitable for normal workout logging, but simultaneous edits to the same complex routine should not be assumed to resolve perfectly.

  • Why openGym: "works offline, syncs between your phone and your laptop."
  • Accounts and data: "Two devices editing at once merge instead of overwriting each other"
  • Training: "the screen stays awake" and "a rest-timer alert"
Not stated in the README:The README does not explain field-level merge rules or how conflicts are presented.;It does not state how long a device can remain offline before reliable reconciliation is no longer assured.

✨ Highlights

  • Includes 1,324 exercises, animated demos, and a muscle map
  • Self-host with Docker; data is stored in host-side ./data
  • Supports passkeys, offline use, and cross-device sync
  • Imports data from FitNotes, Strong, and Hevy
  • The AI coach is off by default and requires your own provider key

🔧 Engineering

  • The React 19 frontend provides planning, guided workouts, PRs, and heatmaps
  • Supports supersets, RIR/RPE, progression rules, and deloads
  • The node:http API stores JSON data and provides an OpenAPI specification
  • Docker deployment provides prebuilt amd64 and arm64 images

⚠️ Risks

  • Phone-based passkeys require HTTPS on a domain
  • The first startup downloads about 140 MB of exercise media
  • The AI coach requires a provider key for Anthropic, OpenAI, Gemini, or another supported endpoint
  • The project uses AGPL-3.0, so modified distributions require attention to license obligations

👥 For who?

  • Individuals who want to manage workout data on their own server with Docker
  • Users with existing history from FitNotes, Strong, or Hevy
  • Open-source developers seeking examples using React 19 and passkeys
  • Self-hosting users with an HTTPS domain who train with a phone