openGym logo

openGym

Self-hosted gym and body-weight tracker with workout planning and muscle recovery tracking

Alternative to: strong, hevy, fitnotes

openGym screenshotopenGym screenshotopenGym screenshot

About Versions (28)

v1.3.8

2026-09-20

Twenty-four reports closed: the keyboard that would not stay open on iPhone and iPad, notifications that arrived with notifications switched off, reps you could not read on a narrow phone, and assisted pull-ups that recorded your progress backwards. Plus the four things this milestone promised — reorder your routines, a Smith machine with no bar, two-decimal weights, and deleting an account for real. Eleven community pull requests from six contributors. Web bundle, APK and API image.

The fixes people actually hit

  • ⌨️ The keyboard stays open (FabianReitz, hectorroaz, #242). On iPhone and iPad, tapping a field threw the keyboard straight back out about four times in five — worst on “Create new profile”, where a new user could not type a name. The page-alignment guard blurred the field you had just tapped, because its “is the keyboard open?” check compares two numbers that both move while the keyboard animates in. Measured on iOS 26.6: innerHeight fell 684 → 374 while the visual viewport sat at 158, so the keyboard read as closed ~100 ms after every tap. Nothing acts on that check while a text field has focus now.
  • 🔔 Notifications respect the switch (shibbrich1, #239). The rest-timer alert asked for the browser permission itself and then fired whether or not Push was on — and a permission cannot be handed back. Off is off.
  • 📱 Reps are readable again on a narrow phone (seals187, #235). A row with weight, reps, an effort column and the +/− buttons left the number nothing: at 320 px the reps field was empty and 102.5 kg showed as “102”. Every number field now reserves the widest value it shows and the buttons give way first — checked across 108 combinations of width, layout, effort mode and per-side rows.
  • 🏋️ Assisted pull-ups and dips count the right way (dpatrongomez, kvalev, #232, #176). The stack carries part of your weight, so less assistance is the harder set — but 30 kg stayed the record over 20 kg, and progression answered a clean session by offering more help. Eight catalogue exercises are affected, and assisted on a custom exercise marks any other.
  • 📋 List view keeps your place (xwr3, #224) — it opens at the exercise you are on, not at the top of the session.
  • ➕ Extra sets stay out of the plan (kvalev, #233). A heavier bonus set used to raise next session’s weight, and a hard one taken short reported the whole session as missed.
  • 🌐 Subpath deployments work (leon332157, #238). Behind a proxy that strips its prefix there is nothing to configure; one that passes the prefix through takes BASE_PATH=/gym.

The four this milestone promised

  • ↕️ Reorder your routines (hjeroen-git, #142) — arrows in Plan, and the Start screen, the day sheets and every picker follow the same order.
  • 🔩 “No bar” (Aoto Ideguchi, #138) — a Smith machine that carries its own carriage now counts plates from zero instead of snapping back to a 9 kg bar.
  • 🔢 Two-decimal weights (Aoto Ideguchi, #139) — Settings → Weight decimals, for quarter plates and microplates. 62.75 stays 62.75 instead of rounding to 62.8.
  • 🗑️ Delete an account (shibbrich1, #107) — the admin dashboard can remove a profile and everything attached to it, not just disable it. It asks twice and offers their data as a download first; it refuses to delete you or the last admin.

Community pull requests

  • kurktchiev: the iOS Home Screen icon behind an auth proxy (#184), an unknown path no longer serves a shell that cannot load (#185), and a way back to the Start screen on a day that already has a plan (#237).
  • Space-Hermes: typo-tolerant exercise search (#206), Olympic-lift muscle groups (#207), shared plans keep their kg/lb unit (#210), and a Coach test that no longer fails around midnight (#208).
  • aaron-rai: the activity heatmap follows your week-start setting (#220).
  • ncbachh: rename a workout while it is running (#228).
  • Strazdonis: the big weight read-out can be typed into (#234).
  • mkoester: standard ß in the German pack (#190).

Found by a QA sweep of every screen, and fixed

  • 🔍 Search: “wrist” returned 200 abdominal exercises, because the typo tolerance matched body parts and equipment as well as names. Fuzzy matching is now name-only, and only for words with no exact hit anywhere.
  • ⚖️ Switching kg ↔ lb left each workout’s stored total and session body weight in the old unit, so History, the calendar and the heatmap showed kilo totals under a pound label. Body weight also converts at 0.1 now, not in plate steps, so a round trip comes home.
  • 📤 Sharing a plan stripped a custom exercise down to its name and body part: it arrived with no equipment, no muscles, and no way to edit or delete it.
  • 📥 Importing a second export re-created the custom exercises the first one had made, splitting the history in two; imported volume counted warm-up sets; hyphenated names (“Stiff-Legged Deadlift”) were filed under the wrong body part.
  • 📊 Tapping an exercise in Stats → Strength threw instead of opening its history.
  • 🛠️ Admin: a profile whose stored file held a malformed entry blanked the whole dashboard, and that account could then not be disabled. The API answers 400 (or 413) for a request the client got wrong instead of 500 with a stack trace, and refuses an array as the state document — which used to wipe the profile and silently reset its revision.
  • 📐 Phone-width layout: the double-progression row wraps into pairs, list-row titles keep their width, page headers give way before their button, drop-set rows and cardio speeds are readable, and the column header lines up over per-side rows.
  • 🇷🇺 Muscle names no longer leak internal ids (“gluteal”, “hip-flexors”) into the picker, the config sheet or the Muscles list, and a day with one routine says “1 routine”.

Known and not fixed: counts in Russian and the other Slavic packs use the English two-form plural rule, so “2 дней” where it should read “2 дня”. It affects every counter in the app and is being done properly rather than patched here.

ImageTagsDigest
registry.gitlab.com/duartesantos8/opengym/api1.3.8 1.3 latestsha256:aa5ef20ce0fa8c8e274dc2772fdb7e3745f0f66c41988db8bda5452711a177da
registry.gitlab.com/duartesantos8/opengym/web1.3.8 1.3 latestsha256:ab15e3ec654f8ccaa6f3d89adc557f726242b59680b7fd913ea651d348cb9463

Both images are linux/amd64 + linux/arm64. Android: openGym-1.3.8.apk, SHA-256 955a70e8a55a8540bbdc3071634bffff7048ef461028ea225c892a5d9b17796d — check it with sha256sum -c openGym-1.3.8.apk.sha256. Signed with the same certificate as every release since v1.2.7 (0d22a49e…), so it installs over your current one. Built from f91cde1c.


Published on GitHub on 2026-09-20, mirroring the GitLab release of the same tag, where the artefacts above were built. The same images are on GHCR, built from this release by GitHub Actions: ghcr.io/duartesantos8/opengym-api:1.3.8 and ghcr.io/duartesantos8/opengym-web:1.3.8.