v1.2.1
Changelog
v1.2.1 — 2026-07-23
A muscle map across the app, and a live demo you can try without installing anything.
- 💪 Muscle map. Three places now show which muscles your training actually reaches, drawn on a
front-and-back body diagram shaded like the activity heatmap — more accent means more work.- Stats → Muscle balance aggregates a week, 30 days, 90 days or everything, lists your
hardest-worked muscles with their set counts, and names the ones that got nothing in that
period. That last list is the point of the card: the gaps are what you'd otherwise never notice.
Tap any muscle to read its name and volume. - Routine editor previews what a session hits as you build it, so a hole in the plan shows up
before you train around it for a month. - The finish screen shows what you just trained.
- Load is counted in effective sets — a set counts fully for the exercise's target muscle and
partially for its supporting ones — not in kilograms, because 100 kg of leg press and 12 kg of
lateral raise say nothing about which muscle worked harder. Shading is relative within the
period you're looking at, so the map always reads as a balance rather than an absolute. - Settings → Appearance → Body diagram switches between a male and female figure.
- The exercise dataset spells muscles inconsistently ("delts", "deltoids" and "shoulders" are one
muscle); all 50 spellings it uses are normalised onto the 18 the diagram can draw. Custom
exercises, which only carry a body part, fall back to it. The geometry is ~90 kB and loads on
demand, so the initial bundle is unchanged.
- Stats → Muscle balance aggregates a week, 30 days, 90 days or everything, lists your
- 🐛 Fixed: finishing a workout from its last exercise could blank the whole app. The
per-exercise weight sheet read the running workout without checking it was still there, and
finishing clears it while that sheet is still on screen. ▶️ Live demo at duartesantos8.github.io/openGym —
a browser-only build (VITE_DEMO=1) published to GitHub Pages on every push tomain. It boots
into guest mode with a seeded example profile (12 weeks of Push/Pull/Legs, weigh-ins, PRs) so
every screen has something to show, and it never talks to a server. Passkeys, sync and the admin
dashboard stay exclusive to self-hosted instances, which is where the backend lives.- 🖼️ Builds can point the exercise media elsewhere via
VITE_IMG_BASE/VITE_GIF_BASE— the demo
serves the ~140 MB dataset from a CDN instead of shipping it. The default (img/andgif/next
to the app) is unchanged.