github DuarteSantos8/openGym v1.4.3
v1.4.3: the Halloween update πŸŽƒ

4 hours ago

The community release. Most of what's below was asked for on GitHub and Discord or sent in as a
pull request, the Apple Watch learned a whole bag of tricks, and openGym starts again on iPhones
that 1.4.2 left staring at the logo. Sorry about that one.

openGym starts again on iOS 15.5 to 16.3 (P1). 1.4.2 and the web demo sat on the splash
forever there, because one tiny link check used regex syntax Safari only learned in 16.4.
Rewritten, the build now targets Safari 15 like the app does, and a test reads every built file
for syntax older iPhones can't handle. Should a browser still choke, openGym says so on screen
with the error and a Reload button instead of lifting the logo forever. Thanks h097327 for the
excellent report. Once it starts, iOS 15.5 to 16.1 also gets its missing tints back (the Coach's
header and error bubbles, the admin pills, the focus card's badges, the tinted buttons, the body
map's shades): plain stand-ins close enough that you'd need a colour picker to tell, and a test
makes sure every new tint brings one.

Gym reminder (#614, phone app). Walk into your gym and openGym nudges you to hit Start. Add
your gyms in Settings β†’ Reminders β†’ Gym reminder: "I'm at the gym right now" or a pin on an
OpenStreetMap map, each with its own radius and text. Once a day at most, never after you trained,
never mid-workout, optionally only between certain hours. Off by default, and your gyms stay on
the phone (not on your server, not in backups). Android uses the system's own proximity alerts,
so no Google services are needed. Android can be slow to notice you arrived (up to half an hour),
so near a gym the phone can take a short GPS look and nudge you at the door; that needs openGym's
battery use on Unrestricted (Settings shows it as "Quick arrival check"). And if you logged a
workout on your laptop that your phone hasn't synced yet, the phone asks your server first (3
seconds at most) instead of nagging you anyway.

See what a session hits before you start it. Every routine on the Plan page (the week, the
rotation and the routine list) and today's session on Home carry a tiny body, front and back,
with the muscles it works lit up. No more opening Leg Day to remember it is, in fact, legs. It
keeps going once you start: the exercise chips at the top of a workout end in the same tiny body,
faint where the session is headed and lit where you've already ticked sets, in every layout and
without moving a single set row (#670). Tap it for the big map and done/planned sets per muscle.
Settings β†’ Workout β†’ Fine-tuning turns it off.

Export as a spreadsheet (#647). Settings β†’ Data & backup β†’ Export as spreadsheet (CSV): your
workouts with one row per set (date, workout, exercise, set, weight, reps, RPE or RIR, warm-ups,
drops, supersets, cardio distance and time) and, as a second file, body weight and measurements.
Pick everything or a stretch of days. Opens in Excel or Sheets, makes your coach happy, and openGym
reads it straight back in without losing a set. The importer also learned GymMane's CSV.

Keep what you added (#592). Threw an extra exercise into a routine's workout? The finish
summary lists it under "New in this workout" with one button to add it to the routine, sets, reps
and weight as you did them. Ignore it and the routine stays exactly as it was.

Halloween. Until the end of October a small spider drops in whenever you open openGym (tap
it and it runs), bats cross the header now and then, cobwebs gather in a few corners and a shy
pumpkin hides somewhere on Home. Find it for a little surprise, once a day. Stats gets a skeleton
hanging off the activity card, spiders on threads, a moon with a tiny witch and two pumpkins
peeking out. Rarely, a bigger witch. Workouts get a quiet version that never sits on a set, a
button or a timer: a cobweb and a spider in the header's corner, two bats along the rest bar and
pumpkins on the finish screen (Also during workouts turns that off). Gone on 1 November by
itself, and Settings β†’ Look & Home β†’ Seasonal themes has Auto, On (all year, we won't judge) and
Off, plus Spooky colors for a pumpkin orange accent. Reduce motion gets a still version, and with
the theme off nothing of it is even loaded.

Pick your own app icon (iPhone). Settings β†’ Look & Home β†’ App icon swaps the icon on your
home screen: the original, Light, Mono, one in green, blue, orange, pink or purple, or Halloween,
a pumpkin orange dumbbell with jack-o'-lantern faces under a moon, with a spider in the corner. The
Halloween one stays all year, and while the theme is on, Seasonal themes has a shortcut to it. It's
per phone and iOS asks you to confirm. Android gets the picker in the next version.

In the workout

  • Machine taken? One tap to your backup (#649). A routine exercise with planned backups lists
    each one in its β‹― menu during a workout. Tap it and the backup takes over with the slot's own
    sets, reps, rest and warm-ups, and the exercise it replaced becomes its backup, so going back
    when the bench frees up is one tap too. Your routine stays exactly as it was.
  • Machines with odd weight steps (#688). A machine or cable exercise has a Weight stack under
    Plate loading: type in the weights its pin really picks (5, 11.3, 18.1, the LifeFitness special)
    or fill an even stack and fix the odd ones. Progression, deloads, warm-ups, drops and the + and βˆ’
    buttons then land only on those, and at the top of the stack it holds and says so.
  • Volume while you lift. The progress bar at the top of a workout ends in the session's volume,
    adding up every set you tick, in all four layouts. Handy for deciding whether today was enough
    or you've got one more in you (#774).
  • "No timer" for a single exercise. Rest for this exercise has the same three choices as the
    warm-ups: your default, No timer, or a time of its own. Stretches and carries can finally skip
    the countdown while your squats keep theirs. Saved in routines, shared plans and backups.
  • Rest after this set: tap a set's number and give just that set its own rest for today, a
    long one before the top set or none after a light one (#609, thanks @Space-Hermes).
  • The rest wheel starts where your rest is. Pick a time opens on the rest that applies right
    now (the exercise's, the warm-ups', or your default) instead of sitting at 0:00 (#735, thanks
    @lodepav).
  • A timed per-side hold can drop its 10 second switch-sides pause without losing the set's rest
    (Rest between sides β†’ No timer), and changing an exercise's settings mid-set no longer forgets
    a side you already ticked (#636, thanks @Space-Hermes).
  • Rate your cardio (Discord). A cardio set's menu (tap the set number) has How hard it felt,
    in RPE whatever your sets use, worded for a run instead of reps left. An easy walk then loads
    your fatigue map less than a hard run; unrated cardio counts as it always did.
  • Exercises start the way you do them. A plank, a wall sit or a dead hang starts as a timed
    hold (#694, thanks @lodepav), a one-arm row or a single-leg press per side (#736, thanks
    @lodepav). Jumping jacks, burpees, star jumps and tuck jumps start as sets Γ— reps instead of
    minutes and speed (#717, thanks @zykll18), and so does jump rope, double unders included (#796,
    thanks @sc962). Only fresh picks: what's already in your routines and history stays as it is.
    Those cardio moves can also be switched between Cardio, Reps and Time in their settings (#678).
  • "No automatic progression" remembers what you did (#217, thanks @iggaM23). With Settings β†’
    Workout β†’ Fine-tuning β†’ Planned sessions start from β†’ Your last session, an exercise with
    progression off opens at last time's weight and reps, the way Strong does it, and the card says
    so. "Your plan" (the default) still opens at the routine's own numbers, and deload routines keep
    theirs.
  • "Last time" can mean any workout (#770). Bench on Monday and Thursday? Settings β†’ Workout β†’
    Fine-tuning β†’ Last time means β†’ Any workout lets Thursday start from Monday, for the rows, the
    "last time" line and progression alike. The default stays per routine, so a heavy day and a
    light day keep their own numbers.
  • Count warm-ups in volume, if you like (#719). A switch in Settings β†’ Units & language adds
    your done warm-ups to every volume the app shows: the workout, the summary, history, Stats, the
    report and the Coach. Off by default, and records ignore warm-ups either way.
  • Discard workout is harder to hit by accident. It lived at the bottom of the workout's β‹― menu
    as a red trash, exactly where an exercise's β‹― keeps Remove exercise. Now it's only in the Finish
    sheet, next to Finish and save, still with its "are you sure" (#751).
  • Rest days in the rotation, and the same routine more than once (A β†’ B β†’ C β†’ B β†’ D): Add
    offers a rest day and every routine, including the ones already in the loop (#536).
  • A treadmill's incline can be set in the routine, not only mid-workout. The session opens at it
    unless last time had a grade of its own, and it travels in shared plans.
  • Focus mode: the exercise's β‹― menu has Add set and Add warm-up set, and Focus stays on the screen
    with lots of sets or a long exercise name (#655).
  • In the Compact and List layouts the exercise chips at the top follow along: the one you tap lights
    up, and so does the one you scroll to (#323, thanks @Space-Hermes).
  • Collapse completed exercises: a finished exercise folds up and the ones after it move up with it,
    no more black gap, the last one in the list included (#642, thanks @dpatrongomez).
  • Add exercise β†’ By muscle has the Favourites chip too, for the muscle you picked (#669).

Apple Watch and the Lock Screen

  • Next exercise and Skip rest on the Lock Screen (iPhone, Discord). The Live Activity and the
    Dynamic Island get a small button next to the big one: Skip rest while you rest, Next exercise
    the rest of the time, so a machine somebody grabbed no longer means unlocking the phone. Works
    with openGym asleep. The big button now says Log set, because "Done" sounded a lot like "I'm
    going home".
  • RPE and RIR on the watch. If you rate your sets, the set page has a little effort disc next
    to Done. Tap it, turn the crown, and it goes in with the weight and reps. Leave it alone and
    nothing is logged.
  • A 3-2-1 before a watch workout (#789, thanks @cubetes) while the heart-rate sensor warms up,
    so set 1 has a heart rate too. Tap to skip the wait.
  • Forgot to hit Finish? (#790, thanks @cubetes). After 20 minutes without a set the watch taps
    you and asks "All done?". No answer by 45 minutes and the workout ends on its own, at your last
    set, so Apple Health doesn't count your drive home as a workout.
  • Discard, properly (#776, #783, thanks @cubetes). Finish workout? on the wrist offers Discard
    workout, and discarding on the phone while the watch follows no longer saves it to Apple Health
    anyway. Gone on both, nothing in Apple Health.
  • No more ghost sets in supersets (#791, thanks @cubetes). When the watch flips to the partner
    exercise by itself, taps are ignored for a second, so a slow double tap on Done no longer logs a
    set you never did.
  • Lock the watch mid-workout (Water Lock, like Apple's Workout), so a sleeve or a bent wrist
    can't press the crown out of your workout. Turn the crown to unlock.
  • Bigger numbers and a calmer crown. Weight and reps are larger, Done is easier to spot, the
    page dims properly with the wrist down, and the weigh-in crown turns whole kilos (or pounds):
    tap the digit after the point for the tenth.
  • The watch keeps up. It could miss the phone right after launch, a fresh install could wait
    for your next change before it got your routines, and one odd routine could hide all of them.
    All fixed. Until the phone has sent anything the watch says "Not synced yet" and what to do, and
    Settings β†’ Apple Watch on the phone tells you when it last heard from the watch.
  • A set ticked on the phone while the watch runs the session gets its heart rate from the watch too.
  • Exercise names on the Lock Screen, in the Dynamic Island, on the watch and in the widgets are
    title-cased like in the app, instead of whispering "barbell bench press".
  • After a long run of Lock Screen taps with the app asleep, the Live Activity said "All sets done"
    with sets still to go. It now says "Open openGym for the next set".
  • One "Rest's over" on iOS: the end of a rest could leave two identical banners stacked (#728,
    thanks @2baek2).

Apple Health and Health Connect

  • Your watch's heart rate and other apps' weigh-ins come in (#544, #127). Two new switches next
    to Write to Apple Health / Health Connect: Heart rate from your watch fills in the heart rate of
    every set from workouts of the last day, whatever watch recorded it, and Weigh-ins from other
    apps brings in your scale's weigh-ins from the last 30 days. Both off until you turn them on,
    read only while openGym is open, and they never overwrite a heart rate the Apple Watch already
    logged or a weigh-in you typed.
  • A year of weigh-ins from Health Connect (Android, idea from #801, thanks @antoni-heredia).
    Turning on Weigh-ins from other apps also asks for Health Connect's history permission where
    your phone has it, so the last year comes in. Say no and it reads the 30 days as before.
  • A run is a run (#799, thanks @svillar). A workout that was only running used to land as
    strength training. Now runs, walks, rows, rides, jump rope, HIIT, yoga and stretching each get
    their own type, on the iPhone, the Apple Watch and in Health Connect. Lift anything at all and
    it's strength training, as before.
  • Imported weigh-ins stay put. Weigh-ins you import (an Apple Health export, a Google Health or
    Health Connect CSV, Strong, Hevy) are no longer written back to Apple Health or Health Connect,
    where they landed a second time. Only weigh-ins you enter in openGym go out.

Your body and your stats

  • Lifts against your body weight (#729, thanks @radu781). Exercise progress in Stats and an
    exercise's History have a Bodyweight view: your estimated 1RM or heaviest set as a % of what you
    weighed then, so the line only climbs when you got stronger for your size. Pull-ups and dips count
    you plus the belt, assisted machines you minus the help.
  • Your weekly rate, with a corridor (#759). Under the body-weight chart on Home and in Stats:
    the trend through the last three weeks of weigh-ins, in kg or lb and in % of body weight a week,
    so one salty dinner can't fool it. Tap it to set what you aim for and the card tells you whether
    you're on pace, too fast or too slow.
  • Fatigue, in numbers. Tap a muscle on Stats β†’ Fatigue for its fatigue in percent on a little
    Ready / Recovering / Fatigued bar, plus when it drops back to Recovering and to Ready if you
    leave it alone (thanks @sg41).
  • Custom measurements get their own unit (#699, #718, thanks @zykll18): %, kg or lb, cm or in,
    or none at all for a visceral fat score. The body CSV export names each field's unit, and
    importing that file brings the measurements back too, not just the weigh-ins.
  • Lifted in total. A new Stats tile with everything you've ever lifted, imports included.
    Spoiler: it's a lot.
  • Deleted a weigh-in by mistake? Undo, on the log sheet and in All weigh-ins (#756).
  • Muscle balance: tap a muscle you haven't trained right on the map and its row offers the
    exercises for it (#553). Stats' Week rows lose a stray line over each done/planned figure.
  • Chart dates say each day once over a short span, and months get their year once a chart covers
    more than twelve of them (thanks @lodepav). A weight change too small to show reads 0, not "-0".

The Coach

  • It answers questions. "How many sets of dips is that?" in the chat gets an answer in words
    instead of a whole revised plan (#660, thanks @TheBlackSide243).
  • It remembers both devices (#779, thanks @Klein225). With the Coach open on two devices the
    one that synced last could wipe the other's chat, log and Undo. Now they merge message by
    message, and a plan applied on your phone no longer gets "nothing I would change" on your laptop.
  • A Coach plan goes into your rotation (#778, thanks @Klein225) instead of the weekly schedule
    a rotation ignores. The rotation starts over with the Coach's routines, and Undo puts yours back.
  • Automatic reviews on a phone with its own key finally happen, while the app is open: right
    after the workout that completes the count, or the first time you open it after your weekly
    slot. And a phone connected to your server now hears about a suggestion the server's review left.
  • One tap away for admins (#683, thanks TheBlackSide243): an AI Coach row in Settings opens
    the admin dashboard straight at the Coach card.
  • Gemini works with a fresh AI Studio key again: the default is Gemini 3.8 Flash, and a model your
    key can't use any more is swapped once for one it lists. If nothing fits, the error names the
    model (#758).
  • OpenRouter and other hosts that insist on strict JSON schemas stop failing with
    "additionalProperties must be explicitly set to false" (#701, thanks @choksi2212; #577, thanks
    @funkypenguin).
  • A phone with your own key gets Advanced: the daily runs (0 for no limit, handy with a model on
    your own network), the output-token ceiling a reasoning model needs raised, and the message
    length (#527, thanks @xueyang-dev).
  • Cardio the Coach prescribes on a non-cardio exercise (kettlebell swings for 15 minutes) stays 15
    minutes (#640), and a review that adds a routine with an empty slot gets a second try instead of
    failing (thanks @rudycelekli for both).
  • The questionnaire's weekdays follow the number of training days, and days you picked yourself
    stay put (#620, thanks @Jul11us).

Exercises and equipment

  • Call an exercise what you call it (#624, thanks Space-Hermes). "Add another name" gives it
    other names, like OHP for the overhead press, and the search finds it by those too. They sync and
    travel with your own exercises in shared plans.
  • "I own no dumbbells" (Discord). Settings β†’ Equipment β†’ Dumbbells has a switch for it, since
    an empty list only ever meant "any weight". On, dumbbell lifts leave the library, the picker and
    the Coach's plans, even if the Coach was once told you have some. Your list waits for the day
    you buy a pair.
  • Equipment profiles know more: an inverted row needs a bar (unless it's the under-the-table kind),
    a dumbbell fly or a pullover needs a bench, and the massage ball is no longer a foam roller.
    Profiles you already had keep showing what they did.
  • Your lats show up as "Lats & upper back" in Stats, on the body map and in the muscle picker (#607,
    thanks @Parth-Vasave). The kettlebell suitcase deadlift and the plate deadlift lunge press remember
    your lower back (#693, #700, thanks @JeromeTDev and @choksi2212), and the knee-to-chest push-up
    moved from cardio to chest.
  • German step-by-step instructions for 1,213 more exercises, so everything from before v1.4 explains
    itself in German (#645, thanks @junkerderprovinz), and the lever leg curls say Beinbeugen, not
    Beinstrecken (#631, thanks @AkashBhat14 and @choksi2212).

Getting around

  • Back means back. A page's own back button returns you where you were scrolled, like the edge
    swipe, Body measurements goes back to Stats, and the titles all sit the same distance from their
    back buttons (#704, #763, #764, thanks @kurktchiev and @lajawi).
  • Android back stops touring your tabs. On a tab, Back goes straight to "press again to exit"
    (#705, thanks @chang0022).
  • Settings slides like Settings: in from the right, back from the left. The tabs keep their fade.
  • iPhone first start: the permission screens have one Continue that leads straight to the
    iPhone's own question, so the yes or no is yours to give there, once.
  • Faster on long histories. Home and Stats do far less work per open (Stats about a third less
    on 800 workouts), the main script is a quarter smaller, the installed web app stops asking the
    server about every file on each launch, and other languages load their words in one go.
  • Increase Contrast and Reduce Transparency are honoured (#707, #708, thanks @olestrr): firmer
    colours and hairlines (every button label at 4.5:1 or better), and solid bars instead of frosted.
  • "Where's my code?" (#551, thanks @Maximrabd). Signing a computer in with a code from your
    phone needs the phone connected to your server. A phone app that keeps everything to itself now
    says so under Settings β†’ Account and on the sign-in screen.
  • Support openGym. Settings β†’ About & updates has the coffee jar: Buy Me a Coffee, Ko-fi and
    GitHub Sponsors, and on the iPhone a straight line to writing an App Store review. No pop-ups
    asking for anything, promise.
  • The install tip in About on a Windows or Linux browser points at Chrome's install icon, not at an
    iPhone's Share menu you don't have. Admin β†’ AI Coach: the Remove button for the stored key is red,
    like every other button that deletes something for good.

Languages

  • Hej, Sverige! openGym speaks Swedish, from Settings β†’ Units & language or straight from a
    Swedish phone (#721, thanks @Grizzly163). Exercise names and instructions stay English for now.
  • Spanish that sounds like Spain (#786, thanks @cubetes): over 60 strings reworded, Objetivo
    instead of Meta, Entrenador instead of Coach, and holds that no longer say "sostΓ©n".
  • Arabic exercise names keep their English brackets the right way round when they wrap (#780,
    thanks @kurktchiev).
  • The plate hint says plates, not reps, in Chinese and Korean (#689, #698, thanks @xueyang-dev),
    and the Korean exercise names got a native speaker's review (#500, thanks @ianlyoo).

Import and the MCP server

  • Log a workout by telling your AI about it (#739, thanks @matthewjablack). The MCP server gets
    log_workout: "curls, 12 kg, 12/12/10" lands in your history on every device, saved through your
    own server like a paired phone. It asks back when a name could mean two exercises, never logs the
    same thing twice, and takes 20 workouts an hour at most.
  • MCP: sets_planned counts per-side sets like sets_done (102/102, not 102/54; #691, thanks
    @davidjorgensen), and a profile whose data was deleted stops showing, also where the system can't
    watch files (thanks @rudycelekli).
  • Hevy import: 55 built-in exercises (Seated Leg Curl, Plank, Air Bike, Triceps Dip and friends)
    land on the right openGym exercise, 12 more titles find theirs (from Lu Raises to the Bayesian
    curl), and Side Plank, Squat (Machine) and the cable rear delt fly stay themselves with your Hevy
    API key too. The summary counts an exercise once (thanks @lodepav, and #784, #785, #793, thanks
    @cubetes and @theatosam).
  • Imports keep converted weights to the hundredth (45 lb comes in as 20.41 kg and reads back as 45),
    Hevy notes keep their line breaks (thanks @lodepav), and Strong's measurements export comes in as
    body weight (#591, thanks @ConalMullan).

Android

  • The update actually installs. Switch apps while the new APK comes down and Android quietly
    refused to open the installer. Now the installer waits until you're back in openGym, a second tap
    after a hiccup reuses the APK it already has instead of fetching 300 MB twice, and the leftover is
    cleaned up once you're on the new version. (The fix lives in the updater itself, so it helps from
    the update after 1.4.3 on: for this one, keep openGym open while it downloads.)
  • Which APK is this? Settings β†’ About tells you whether you have Standard (180 px), Plus (240
    px) or HD (360 px), no guessing from the file size.

From the community (thanks!)

  • A superset in List and Compact scrolls to its next member, one-sided exercises included (#574,
    @sgoendoer).
  • The workout summary uses the width of the phone and has a close button at the top (#597,
    @dpatrongomez).
  • Pairing the app with a server under a sub-path such as /gym keeps the sub-path (#601,
    @phaninderg).
  • One builder for an exercise added to or swapped into a running session (#608, @bbolinger).
  • Tailscale Serve as an HTTPS option in the self-hosting docs (#615, @tanishvbuk).
  • German exercise names and steps (#619, #623, @junkerderprovinz).
  • Tests that pass east of UTC+6 (#732, @NaufalDzz).

Self-hosting

  • Wrong address, clear answer. When your api service's ORIGIN isn't the address in your browser,
    the app says which address the server expects and what to change, instead of a bare "cross-origin
    request refused". The server log names the exact ORIGIN= and RP_ID= to set (thanks tcmac, who
    lost a morning to this one).
  • Set your own CONTENT_SECURITY_POLICY? The inline start script changed (it now shows an error
    instead of an endless splash), so its hash did too. If you copied the old hash, take the new one
    from web/Dockerfile; with the old one the app still runs, but loses that message and the
    first-paint right-to-left layout.
  • New docs for what Discord asked: from zero to a working AI Coach (it starts with making yourself
    admin), nginx under /gym in both flavours with the three mistakes that break it, passkeys without
    a fingerprint reader or on plain http, the iPhone web app, and moving your phone's data onto your
    own server. A NAS section (Synology, QNAP, Unraid, TrueNAS, with a two-service compose to paste),
    password sign-in (PASSWORD_LOGIN) and guest mode (ALLOW_GUEST) explained, including why a stack
    without its api quietly turns you into a guest, and a Mac at home with Colima and Tailscale Serve
    (#787, thanks @cubetes).

Security. Follow-ups to v1.4.2's audit. Self-hosters: please update.

  • Pairing the phone app asks you to confirm it's you (passkey, or your password where that
    counts), like adding another device does. A copied browser session can no longer mint a phone
    sign-in that renews itself.
  • On iPhone the paired server's sign-in is no longer part of iCloud or computer backups. A restored
    iPhone pairs again.
  • The Android updater (direct APK only) installs nothing without its checksum and only its own
    download, and the backup folder is only written to while the app still has your permission.
  • Self-hosted images run on this month's patched Node (22.23.4) and nginx (1.30.6), and the server
    and the MCP bridge pick up a fixed ip-address. Thanks to MohamedAfrash and lodepav (#766, #769).

Don't miss a new openGym release

NewReleases is sending notifications on new releases.