diff --git a/CHANGELOG.md b/CHANGELOG.md index e9660c0..b2ffb32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ **July 2026** +A new Running exercise joins the library with its own animated stride figure. + +Exercise figures no longer glitch mid-rep — bars, hands, and feet stay planted instead of snapping or windmilling. + +Many exercise figures were re-posed for accuracy — the butterfly stretch now sits on the floor, the bench press bar travels straight up, and seated machine figures keep their feet on the ground. + +Fixed a crash when a workout that was open on screen got deleted from another device. + +Ad hoc workouts on the Today board now file under their routine's goal instead of Unassigned. + +The Progress tab title now opens with a rotating daily motto, like the Today board. + Cardio routines can now set a target heart rate — the run screen on watch and iPhone shows your live pulse with a cue to push harder or ease off. The exercise screen now uses the full display in landscape by hiding the tab bar. diff --git a/EXERCISE-LIBRARY.md b/EXERCISE-LIBRARY.md index d339a29..23d7130 100644 --- a/EXERCISE-LIBRARY.md +++ b/EXERCISE-LIBRARY.md @@ -15,7 +15,7 @@ Data flows one way: you edit the **source**, run `render.py --export`, and the **bundle** is overwritten. Never hand-edit anything under `Workouts/Resources/ExerciseMotions/` — it is regenerated. -As of this writing the catalog is **64 exercises**. +As of this writing the catalog is **65 exercises**. ``` Exercise Library/ ← authoring source (repo root) @@ -23,7 +23,7 @@ Exercise Library/ ← authoring source (repo root) ├── skeleton.json ← shared rig: bone lengths + joint ROM ├── render.py kinematics.py ← the render pipeline + the FK math ├── contact-sheet.png demo-sheet.png ← generated QA sheets -└── / ← one folder per exercise, 64 of them +└── / ← one folder per exercise, 65 of them ├── info.md ← AUTHORED: the reference page ├── motion.json ← AUTHORED: the rig script (canonical visual source) ├── frames/frame-N.svg ← generated: one SVG per key frame @@ -35,8 +35,8 @@ Exercise Library/ ← authoring source (repo root) ▼ Workouts/Resources/ExerciseMotions/ ← bundle (flat, unique basenames) ├── skeleton.json -├── .motion.json ← 64 -└── .info.md ← 64 +├── .motion.json ← 65 +└── .info.md ← 65 │ Bundle.main lookups ▼ @@ -208,7 +208,7 @@ three kinds of file: The generated SVGs and GIFs do **not** ship — the app renders the figure live from the rig instead. The rename to `.motion.json` / `.info.md` is -what lets Xcode's flat resource copy hold all 64 without collision. +what lets Xcode's flat resource copy hold all 65 without collision. ## The app-side consumers (`Workouts/ExerciseFigure/`) diff --git a/Exercise Library/Running/frames/frame-1.svg b/Exercise Library/Running/frames/frame-1.svg new file mode 100644 index 0000000..3fc97c4 --- /dev/null +++ b/Exercise Library/Running/frames/frame-1.svg @@ -0,0 +1,38 @@ + + Running + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + near + + far + + diff --git a/Exercise Library/Running/frames/frame-2.svg b/Exercise Library/Running/frames/frame-2.svg new file mode 100644 index 0000000..b37266d --- /dev/null +++ b/Exercise Library/Running/frames/frame-2.svg @@ -0,0 +1,37 @@ + + Running + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + near + + far + + diff --git a/Exercise Library/Running/frames/frame-3.svg b/Exercise Library/Running/frames/frame-3.svg new file mode 100644 index 0000000..9ec69ad --- /dev/null +++ b/Exercise Library/Running/frames/frame-3.svg @@ -0,0 +1,36 @@ + + Running + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + near + + far + + diff --git a/Exercise Library/Running/frames/frame-4.svg b/Exercise Library/Running/frames/frame-4.svg new file mode 100644 index 0000000..e9bfed3 --- /dev/null +++ b/Exercise Library/Running/frames/frame-4.svg @@ -0,0 +1,38 @@ + + Running + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + near + + far + + diff --git a/Exercise Library/Running/info.md b/Exercise Library/Running/info.md new file mode 100644 index 0000000..bfa531a --- /dev/null +++ b/Exercise Library/Running/info.md @@ -0,0 +1,43 @@ +# Running + +Steady, easy-pace running — an upright posture with a slight forward lean from +the ankles, a light midfoot landing under the hips, and a relaxed, efficient +stride. Run in place, on a treadmill, or outdoors; your Apple Watch records +the real effort — heart rate, calories, and duration — as a running workout. + +- **Category:** Cardio +- **Type:** Aerobic / conditioning +- **Targets:** Heart, lungs, legs, endurance +- **Prescription:** 15–30 minutes at a conversational-to-brisk pace +- **Defaults:** 1 × 1200 s + +## Setup + +Stand tall with a slight forward lean from the ankles, not the waist. Let +your watch start the session so the effort is tracked on your wrist. + +## Execution + +1. Ease in for the first minute or two, letting your heart rate climb. +2. Land lightly on your midfoot, under your hips — not out in front. +3. Drive your knees forward and let your arms swing opposite your legs. +4. Favor a quicker cadence over a longer stride; settle into a pace you can + hold for the whole block. +5. Cool down with an easy minute before you stop. + +## Cues + +- Keep your posture tall, with the lean coming from the ankles. +- Relax your shoulders and keep your elbows around 90 degrees. +- Aim for a pace where you could speak in short sentences, not full paragraphs. + +## Common Mistakes + +- Overstriding — reaching the foot out ahead of the hips on landing. +- Starting too hard and fading long before the time is up. +- Hunching forward at the waist instead of leaning from the ankles. + +## Progression + +Add minutes, lift the pace, or fold in short faster intervals to raise the +challenge over time. diff --git a/Exercise Library/Running/motion.json b/Exercise Library/Running/motion.json new file mode 100644 index 0000000..6cdf62d --- /dev/null +++ b/Exercise Library/Running/motion.json @@ -0,0 +1,50 @@ +{ + "name": "Running", + "primary": 4, + "camera": {"zoom": 0.7}, + "working": ["leg_r", "leg_l"], + "frames": [ + { + "hold": 0.08, "tween": 0.38, + "root": {"pos": [160, 65], "pitch": 10}, + "spine": [0, 0], + "neck": 4, "head": -8, + "shoulder_r": -30, "elbow_r": 90, + "shoulder_l": 35, "elbow_l": 90, + "hip_r": 25, "knee_r": 30, "ankle_r": 0, + "hip_l": -12, "knee_l": 88, "ankle_l": -18, + "pins": {"foot_r": [161, 149]} + }, + { + "hold": 0.06, "tween": 0.32, + "root": {"pos": [160, 62], "pitch": 10}, + "spine": [0, 0], + "neck": 4, "head": -8, + "shoulder_r": 4, "elbow_r": 70, + "shoulder_l": 4, "elbow_l": 70, + "hip_r": -12, "knee_r": 55, "ankle_r": -5, + "hip_l": 56, "knee_l": 100, "ankle_l": -5 + }, + { + "hold": 0.08, "tween": 0.38, + "root": {"pos": [160, 65], "pitch": 10}, + "spine": [0, 0], + "neck": 4, "head": -8, + "shoulder_r": 35, "elbow_r": 90, + "shoulder_l": -30, "elbow_l": 90, + "hip_l": 25, "knee_l": 30, "ankle_l": 0, + "hip_r": -12, "knee_r": 88, "ankle_r": -18, + "pins": {"foot_l": [159, 149]} + }, + { + "hold": 0.06, "tween": 0.32, + "root": {"pos": [160, 62], "pitch": 10}, + "spine": [0, 0], + "neck": 4, "head": -8, + "shoulder_r": 4, "elbow_r": 70, + "shoulder_l": 4, "elbow_l": 70, + "hip_l": -12, "knee_l": 55, "ankle_l": -5, + "hip_r": 56, "knee_r": 100, "ankle_r": -5 + } + ] +} diff --git a/Exercise Library/Running/preview.gif b/Exercise Library/Running/preview.gif new file mode 100644 index 0000000..69ef891 Binary files /dev/null and b/Exercise Library/Running/preview.gif differ diff --git a/Exercise Library/Running/visual.svg b/Exercise Library/Running/visual.svg new file mode 100644 index 0000000..e9bfed3 --- /dev/null +++ b/Exercise Library/Running/visual.svg @@ -0,0 +1,38 @@ + + Running + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + near + + far + + diff --git a/README.md b/README.md index cba0cd0..1c11b99 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ your own iCloud Drive. **Bodyweight Core** circuit with its own warm-up) appear automatically on first launch; editing one makes it your own copy, and deleted starters can be restored from Settings. -- **Exercise library** — a bundled library of 65 exercises to populate your +- **Exercise library** — a bundled library of 67 exercises to populate your splits, authored in `Exercise Library/` with per-exercise setup, cues, mistakes, progressions, and an anatomically-rigged 3D stick-figure visual system — covering every common movement pattern and gym station (see the