diff --git a/Exercise Library/Arm Circles/frames/frame-1.svg b/Exercise Library/Arm Circles/frames/frame-1.svg
new file mode 100644
index 0000000..f7bd91a
--- /dev/null
+++ b/Exercise Library/Arm Circles/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Arm Circles/frames/frame-2.svg b/Exercise Library/Arm Circles/frames/frame-2.svg
new file mode 100644
index 0000000..de88cc6
--- /dev/null
+++ b/Exercise Library/Arm Circles/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Arm Circles/frames/frame-3.svg b/Exercise Library/Arm Circles/frames/frame-3.svg
new file mode 100644
index 0000000..3e6bb33
--- /dev/null
+++ b/Exercise Library/Arm Circles/frames/frame-3.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Arm Circles/frames/frame-4.svg b/Exercise Library/Arm Circles/frames/frame-4.svg
new file mode 100644
index 0000000..496715e
--- /dev/null
+++ b/Exercise Library/Arm Circles/frames/frame-4.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Arm Circles/info.md b/Exercise Library/Arm Circles/info.md
new file mode 100644
index 0000000..0d395a5
--- /dev/null
+++ b/Exercise Library/Arm Circles/info.md
@@ -0,0 +1,38 @@
+# Arm Circles
+
+Big, slow circles of both arms together to warm the shoulders, wake up the
+rotator cuff, and open the chest before pressing or pulling.
+
+- **Category:** Mobility / warm-up
+- **Type:** Shoulder mobility
+- **Targets:** Deltoids, rotator cuff, upper back
+- **Prescription:** 10 slow backward circles, then 10 forward
+- **Defaults:** 2 × 10 bodyweight
+
+## Setup
+
+Stand tall, feet shoulder-width, arms relaxed at your sides.
+
+## Execution
+
+1. Reach both arms forward and up until they pass overhead.
+2. Carry them back and down behind you, tracing the biggest circle you can.
+3. Sweep them low and forward again to begin the next circle.
+4. Complete the set, then circle in the opposite direction.
+
+## Cues
+
+- Keep the arms long — draw the circle from the shoulder, not the elbow.
+- Stand tall; don't let the low back arch as the arms pass overhead.
+- Keep the tempo slow and even, breathing throughout.
+
+## Common Mistakes
+
+- Tiny, rushed circles instead of full, slow ones.
+- Shrugging the shoulders toward the ears at the top.
+- Arching the low back to force the arms higher.
+
+## Progression
+
+Small circles → full-range circles → slow both directions → pause briefly with
+the arms overhead each rep.
diff --git a/Exercise Library/Arm Circles/motion.json b/Exercise Library/Arm Circles/motion.json
new file mode 100644
index 0000000..728948e
--- /dev/null
+++ b/Exercise Library/Arm Circles/motion.json
@@ -0,0 +1,48 @@
+{
+ "name": "Arm Circles",
+ "primary": 2,
+ "camera": {"yaw": 40, "zoom": 0.6},
+ "working": ["arm_r", "arm_l"],
+ "frames": [
+ {
+ "hold": 0.15, "tween": 0.8,
+ "root": {"pos": [160, 66]},
+ "spine": [0, 0], "neck": 2, "head": -4,
+ "shoulder_r": {"flexion": 90, "abduction": 12}, "elbow_r": 5,
+ "shoulder_l": {"flexion": 90, "abduction": 12}, "elbow_l": 5,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.15, "tween": 0.8,
+ "root": {"pos": [160, 66]},
+ "spine": [0, 0], "neck": 2, "head": -4,
+ "shoulder_r": {"flexion": 172, "abduction": 30}, "elbow_r": 5,
+ "shoulder_l": {"flexion": 172, "abduction": 30}, "elbow_l": 5,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.15, "tween": 0.8,
+ "root": {"pos": [160, 66]},
+ "spine": [0, 0], "neck": 2, "head": -4,
+ "shoulder_r": {"flexion": 90, "abduction": 92}, "elbow_r": 5,
+ "shoulder_l": {"flexion": 90, "abduction": 92}, "elbow_l": 5,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.15, "tween": 0.8,
+ "root": {"pos": [160, 66]},
+ "spine": [0, 0], "neck": 2, "head": -4,
+ "shoulder_r": {"flexion": 8, "abduction": 22}, "elbow_r": 5,
+ "shoulder_l": {"flexion": 8, "abduction": 22}, "elbow_l": 5,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ }
+ ]
+}
diff --git a/Exercise Library/Arm Circles/orbit.gif b/Exercise Library/Arm Circles/orbit.gif
new file mode 100644
index 0000000..5ce54b4
Binary files /dev/null and b/Exercise Library/Arm Circles/orbit.gif differ
diff --git a/Exercise Library/Arm Circles/preview.gif b/Exercise Library/Arm Circles/preview.gif
new file mode 100644
index 0000000..6efb6bc
Binary files /dev/null and b/Exercise Library/Arm Circles/preview.gif differ
diff --git a/Exercise Library/Arm Circles/visual.svg b/Exercise Library/Arm Circles/visual.svg
new file mode 100644
index 0000000..de88cc6
--- /dev/null
+++ b/Exercise Library/Arm Circles/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Butterfly Stretch/frames/frame-1.svg b/Exercise Library/Butterfly Stretch/frames/frame-1.svg
new file mode 100644
index 0000000..856dcdc
--- /dev/null
+++ b/Exercise Library/Butterfly Stretch/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Butterfly Stretch/frames/frame-2.svg b/Exercise Library/Butterfly Stretch/frames/frame-2.svg
new file mode 100644
index 0000000..b35730a
--- /dev/null
+++ b/Exercise Library/Butterfly Stretch/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Butterfly Stretch/info.md b/Exercise Library/Butterfly Stretch/info.md
new file mode 100644
index 0000000..6619d12
--- /dev/null
+++ b/Exercise Library/Butterfly Stretch/info.md
@@ -0,0 +1,40 @@
+# Butterfly Stretch
+
+Sit tall, press the soles of the feet together, and let the knees fall open to
+release the inner thighs and hips. A gentle seated opener for tight groins
+after squatting, running, or a long day in a chair.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Inner thighs (adductors, groin), hips
+- **Prescription:** Hold 45 s, letting the knees settle a little lower with each breath
+- **Defaults:** 1 × 45 s
+
+## Setup
+
+Sit on the floor with a tall spine. Bring the soles of the feet together and
+draw the heels in toward the pelvis, letting the knees drop out to the sides.
+
+## Execution
+
+1. Hold the feet or ankles and lengthen up through the crown of the head.
+2. Let the knees relax open and down toward the floor under their own weight.
+3. Hinge gently forward from the hips to deepen the stretch.
+4. Breathe slowly, easing a little lower on each exhale.
+
+## Cues
+
+- Lead the forward lean from the hips, keeping the chest open and the back long.
+- Let gravity lower the knees — don't force them down with the hands.
+- Draw the heels closer to the pelvis for more inner-thigh, further away for less.
+
+## Common Mistakes
+
+- Rounding the back to reach the feet instead of hinging at the hips.
+- Bouncing the knees to push the range.
+- Pulling hard on the feet and yanking the knees toward the floor.
+
+## Progression
+
+Heels further from the pelvis → heels drawn closer for a deeper groin stretch →
+gentle forward fold over the legs, resting the forearms toward the floor.
diff --git a/Exercise Library/Butterfly Stretch/motion.json b/Exercise Library/Butterfly Stretch/motion.json
new file mode 100644
index 0000000..cd1bee3
--- /dev/null
+++ b/Exercise Library/Butterfly Stretch/motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Butterfly Stretch",
+ "primary": 2,
+ "camera": {"yaw": 52},
+ "working": ["leg_r", "leg_l"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 118], "pitch": 4},
+ "spine": [20, 18],
+ "neck": 12, "head": -14,
+ "shoulder_r": {"flexion": 94, "abduction": 12}, "elbow_r": 40,
+ "shoulder_l": {"flexion": 94, "abduction": 12}, "elbow_l": 40,
+ "hip_r": {"flexion": 82, "abduction": 38, "rotation": 44}, "knee_r": 108,
+ "hip_l": {"flexion": 82, "abduction": 38, "rotation": 44}, "knee_l": 108,
+ "pins": {"hand_r": [178, 158], "hand_l": [198, 159]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [160, 118], "pitch": 4},
+ "spine": [26, 24],
+ "neck": 14, "head": -16,
+ "shoulder_r": {"flexion": 98, "abduction": 12}, "elbow_r": 34,
+ "shoulder_l": {"flexion": 98, "abduction": 12}, "elbow_l": 34,
+ "hip_r": {"flexion": 82, "abduction": 44, "rotation": 46}, "knee_r": 110,
+ "hip_l": {"flexion": 82, "abduction": 44, "rotation": 46}, "knee_l": 110,
+ "pins": {"hand_r": [176, 159], "hand_l": [200, 160]}
+ }
+ ]
+}
diff --git a/Exercise Library/Butterfly Stretch/preview.gif b/Exercise Library/Butterfly Stretch/preview.gif
new file mode 100644
index 0000000..29291ec
Binary files /dev/null and b/Exercise Library/Butterfly Stretch/preview.gif differ
diff --git a/Exercise Library/Butterfly Stretch/visual.svg b/Exercise Library/Butterfly Stretch/visual.svg
new file mode 100644
index 0000000..b35730a
--- /dev/null
+++ b/Exercise Library/Butterfly Stretch/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/COVERAGE.md b/Exercise Library/COVERAGE.md
index b5d115a..c80d1a7 100644
--- a/Exercise Library/COVERAGE.md
+++ b/Exercise Library/COVERAGE.md
@@ -33,12 +33,13 @@ it is a considered exclusion, not a gap.
| Elbow extension | Tricep Press, Triceps Pushdown | — | Dip |
| Shoulder raise (lateral/rear) | Rear Delt Fly | Lateral Raise | — |
| Hip abduction / adduction | Abductor, Adductor | — | — |
-| Calf | Calfs | — | — |
+| Calf | Calfs | — | Standing Calf Raise |
| Core anti-extension | — | — | Plank, Dead Bug, Hollow Body Hold |
| Core rotation / anti-rotation | Rotary | — | Bird Dog |
| Core lateral | — | — | Side Plank |
| Core flexion | Abdominal | — | Crunch, Reverse Crunch, Leg Raises |
-| Mobility / warm-up | — | — | Cat-Cow *(morning wake-up set: next phase)* |
+| Mobility / warm-up | — | — | Cat-Cow, March in Place, Leg Swings, Neck Rolls, Arm Circles, Torso Twist, Standing Side Bend, Hip Circles |
+| Static stretch | — | — | Standing Forward Fold, Standing Quad Stretch, Standing Calf Stretch, Chest Opener, Overhead Triceps Stretch, Kneeling Hip Flexor Stretch, Butterfly Stretch, Cobra Stretch, Child's Pose |
## Gym-floor census
@@ -57,6 +58,8 @@ entries) a user logging by that station's name will find.
| Pull-up / dip station (incl. assisted machine) | Pull-Up, Dip |
| Dumbbell rack | Dumbbell Bench Press, Dumbbell Fly, Dumbbell Row, Dumbbell Shoulder Press, Dumbbell Curl, Lateral Raise, Goblet Squat, Lunge |
| Floor / mat | Bodyweight Squat, Push-Up, Crunch, Glute Bridge, Plank, Side Plank, Bird Dog, Dead Bug, Hollow Body Hold, Leg Raises, Reverse Crunch, Cat-Cow |
+| Open floor (warm-up / mobility) | March in Place, Leg Swings, Neck Rolls, Arm Circles, Torso Twist, Standing Side Bend, Hip Circles, Standing Calf Raise |
+| Stretching mat (cool-down) | Standing Forward Fold, Standing Quad Stretch, Standing Calf Stretch, Chest Opener, Overhead Triceps Stretch, Kneeling Hip Flexor Stretch, Butterfly Stretch, Cobra Stretch, Child's Pose |
## Considered exclusions (the "most gyms" line)
@@ -73,8 +76,13 @@ entries) a user logging by that station's name will find.
("barbell or dumbbells" in their pages), not separate entries.
- **Kettlebells, T-bar row, pullover machine, cardio equipment** — out; not
strength stations found in most gyms (cardio is out of the app's scope).
-- **Morning wake-up mobility set** (neck rolls, arm circles, …) — deliberately
- deferred to the next library phase; Cat-Cow holds the mobility row today.
+- **Morning wake-up mobility & stretching set** — landed. Dynamic warm-up
+ drills (March in Place, Leg Swings, Neck Rolls, Arm Circles, Torso Twist,
+ Standing Side Bend, Hip Circles) now fill the mobility row alongside Cat-Cow,
+ and a static-stretch group (Standing Forward Fold, Standing Quad/Calf
+ Stretch, Chest Opener, Overhead Triceps Stretch, Kneeling Hip Flexor Stretch,
+ Butterfly Stretch, Cobra Stretch, Child's Pose) covers the cool-down mat.
+ Standing Calf Raise adds the bodyweight calf cell.
## Standing exercises and `camera.zoom`
diff --git a/Exercise Library/Chest Opener/frames/frame-1.svg b/Exercise Library/Chest Opener/frames/frame-1.svg
new file mode 100644
index 0000000..bfaca98
--- /dev/null
+++ b/Exercise Library/Chest Opener/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Chest Opener/frames/frame-2.svg b/Exercise Library/Chest Opener/frames/frame-2.svg
new file mode 100644
index 0000000..f4483bb
--- /dev/null
+++ b/Exercise Library/Chest Opener/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Chest Opener/info.md b/Exercise Library/Chest Opener/info.md
new file mode 100644
index 0000000..bfa0cdd
--- /dev/null
+++ b/Exercise Library/Chest Opener/info.md
@@ -0,0 +1,44 @@
+# Chest Opener
+
+Stand tall, clasp the hands behind the back, and lift the chest to peel open
+the front of the shoulders and pecs — the antidote to a day rounded over a
+desk or a phone.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Chest (pectorals), front of the shoulders, biceps
+- **Prescription:** Hold 30 s, breathing wide into the chest, then release and repeat once
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Stand tall with the feet hip-width and the knees soft. Reach both arms behind
+the low back and interlace the fingers, palms together.
+
+## Execution
+
+1. Draw the shoulder blades down and together and straighten the elbows as far
+ as is comfortable.
+2. Lift the clasped hands gently away from the body until you feel the chest
+ open.
+3. Raise the breastbone and let the gaze drift slightly upward.
+4. Hold and breathe wide into the front of the chest, then release slowly.
+
+## Cues
+
+- Lead with the chest, not the chin — length before lift.
+- Keep the shoulders drawing down away from the ears.
+- Squeeze the shoulder blades together to deepen the stretch instead of
+ cranking the arms up.
+
+## Common Mistakes
+
+- Shrugging the shoulders up toward the ears.
+- Arching hard through the low back instead of opening the chest.
+- Yanking the hands higher than the shoulders can comfortably allow.
+
+## Progression
+
+Hands lower on the back with straighter elbows → clasp a strap and walk the
+hands closer → hinge forward with the arms rising overhead for a deeper pec and
+shoulder stretch.
diff --git a/Exercise Library/Chest Opener/motion.json b/Exercise Library/Chest Opener/motion.json
new file mode 100644
index 0000000..2147024
--- /dev/null
+++ b/Exercise Library/Chest Opener/motion.json
@@ -0,0 +1,31 @@
+{
+ "name": "Chest Opener",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["arm_r", "arm_l", "spine"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 66], "pitch": 2},
+ "spine": [-1, -1],
+ "neck": -2, "head": -6,
+ "shoulder_r": -26, "elbow_r": 34,
+ "shoulder_l": -26, "elbow_l": 34,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [158, 150], "foot_l": [162, 150]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [160, 66], "pitch": -4},
+ "spine": [-6, -6],
+ "neck": -11, "head": -15,
+ "shoulder_r": -55, "elbow_r": 20,
+ "shoulder_l": -55, "elbow_l": 20,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [158, 150], "foot_l": [162, 150],
+ "hand_r": [150, 41], "hand_l": [154, 42]}
+ }
+ ]
+}
diff --git a/Exercise Library/Chest Opener/preview.gif b/Exercise Library/Chest Opener/preview.gif
new file mode 100644
index 0000000..fc8cff7
Binary files /dev/null and b/Exercise Library/Chest Opener/preview.gif differ
diff --git a/Exercise Library/Chest Opener/visual.svg b/Exercise Library/Chest Opener/visual.svg
new file mode 100644
index 0000000..f4483bb
--- /dev/null
+++ b/Exercise Library/Chest Opener/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Child's Pose/frames/frame-1.svg b/Exercise Library/Child's Pose/frames/frame-1.svg
new file mode 100644
index 0000000..2570846
--- /dev/null
+++ b/Exercise Library/Child's Pose/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Child's Pose/frames/frame-2.svg b/Exercise Library/Child's Pose/frames/frame-2.svg
new file mode 100644
index 0000000..35c10e7
--- /dev/null
+++ b/Exercise Library/Child's Pose/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Child's Pose/info.md b/Exercise Library/Child's Pose/info.md
new file mode 100644
index 0000000..36e8d71
--- /dev/null
+++ b/Exercise Library/Child's Pose/info.md
@@ -0,0 +1,40 @@
+# Child's Pose
+
+A restful kneeling fold that decompresses the spine and settles the breath —
+the reset between harder efforts, or the quiet close to a morning routine.
+
+- **Category:** Mobility / warm-up
+- **Type:** Spinal decompression (timed hold)
+- **Targets:** Lower back, hips, thighs, shoulders
+- **Prescription:** Hold for 30 s, breathing slowly into the back of the ribs, then repeat once
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Kneel with the knees about hip-width and the big toes together, then sit the
+hips back toward the heels.
+
+## Execution
+
+1. Walk the hands forward and fold the chest down over the thighs.
+2. Stretch the arms long on the floor overhead and rest the forehead on the mat.
+3. Let the weight sink back toward the heels and the hips grow heavy.
+4. Breathe slowly into the back of the ribs, lengthening a little with each
+ exhale.
+
+## Cues
+
+- Reach the fingertips forward and the hips back to grow long through the spine.
+- Let the belly rest between the thighs so the breath can slow.
+- Keep the forehead heavy and the neck completely relaxed.
+
+## Common Mistakes
+
+- Holding tension in the shoulders instead of letting them melt down.
+- Lifting the hips away from the heels and losing the settle.
+- Forcing the range and gripping the low back rather than releasing it.
+
+## Progression
+
+Knees together for a deeper fold, or wide knees to let the chest sink lower →
+add a side-reach (walk the hands to each side) to open the lats
diff --git a/Exercise Library/Child's Pose/motion.json b/Exercise Library/Child's Pose/motion.json
new file mode 100644
index 0000000..f146115
--- /dev/null
+++ b/Exercise Library/Child's Pose/motion.json
@@ -0,0 +1,29 @@
+{
+ "name": "Child's Pose",
+ "primary": 2,
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 2.4, "tween": 2.0,
+ "root": {"pos": [201, 108], "yaw": 180, "pitch": 89},
+ "spine": [15, 20],
+ "neck": 15, "head": -13,
+ "shoulder_r": 168, "elbow_r": 8,
+ "shoulder_l": 168, "elbow_l": 8,
+ "hip_r": 86, "knee_r": 104, "ankle_r": -52,
+ "hip_l": 86, "knee_l": 104, "ankle_l": -52,
+ "pins": {"hand_r": [80, 150], "hand_l": [84, 151]}
+ },
+ {
+ "hold": 2.6, "tween": 2.0,
+ "root": {"pos": [202, 110], "yaw": 180, "pitch": 92},
+ "spine": [16, 22],
+ "neck": 17, "head": -15,
+ "shoulder_r": 172, "elbow_r": 6,
+ "shoulder_l": 172, "elbow_l": 6,
+ "hip_r": 90, "knee_r": 108, "ankle_r": -52,
+ "hip_l": 90, "knee_l": 108, "ankle_l": -52,
+ "pins": {"hand_r": [78, 150], "hand_l": [82, 151]}
+ }
+ ]
+}
diff --git a/Exercise Library/Child's Pose/preview.gif b/Exercise Library/Child's Pose/preview.gif
new file mode 100644
index 0000000..9dc1f34
Binary files /dev/null and b/Exercise Library/Child's Pose/preview.gif differ
diff --git a/Exercise Library/Child's Pose/visual.svg b/Exercise Library/Child's Pose/visual.svg
new file mode 100644
index 0000000..35c10e7
--- /dev/null
+++ b/Exercise Library/Child's Pose/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Cobra Stretch/frames/frame-1.svg b/Exercise Library/Cobra Stretch/frames/frame-1.svg
new file mode 100644
index 0000000..870b8d3
--- /dev/null
+++ b/Exercise Library/Cobra Stretch/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Cobra Stretch/frames/frame-2.svg b/Exercise Library/Cobra Stretch/frames/frame-2.svg
new file mode 100644
index 0000000..9ff9b44
--- /dev/null
+++ b/Exercise Library/Cobra Stretch/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Cobra Stretch/info.md b/Exercise Library/Cobra Stretch/info.md
new file mode 100644
index 0000000..0b6cf1e
--- /dev/null
+++ b/Exercise Library/Cobra Stretch/info.md
@@ -0,0 +1,42 @@
+# Cobra Stretch
+
+A gentle prone press-up that opens the front of the body and coaxes the spine
+into extension after a night curled up.
+
+- **Category:** Mobility / warm-up
+- **Type:** Spinal extension mobility
+- **Targets:** Lumbar and thoracic spine, abdominals, chest and hip flexors
+- **Prescription:** 2 sets of 8 slow press-ups, pausing a breath at the top of each
+- **Defaults:** 2 × 8 bodyweight
+
+## Setup
+
+Lie face down with the legs long and the tops of the feet on the floor. Set the
+hands flat under the shoulders, elbows tucked close to the ribs.
+
+## Execution
+
+1. Press the hands lightly into the floor and lengthen the chest forward.
+2. Peel the breastbone off the mat, letting the spine extend one segment at a
+ time.
+3. Keep the hips, pubic bone, and legs pinned to the floor throughout.
+4. Rise only as far as the low back stays comfortable, then lower slowly back
+ to flat.
+
+## Cues
+
+- Lead with the chest, not the chin — length before height.
+- Draw the shoulders down away from the ears.
+- Let the hands share the load; don't hang the whole body weight on the low back.
+
+## Common Mistakes
+
+- Cranking the head back and crunching the neck.
+- Pressing to straight arms and lifting the hips off the mat (that's up-dog, not
+ cobra).
+- Shrugging the shoulders up around the ears.
+
+## Progression
+
+Sphinx (forearms down) → low cobra → full cobra with straighter arms →
+upward-facing dog with the thighs lifted
diff --git a/Exercise Library/Cobra Stretch/motion.json b/Exercise Library/Cobra Stretch/motion.json
new file mode 100644
index 0000000..ab4c459
--- /dev/null
+++ b/Exercise Library/Cobra Stretch/motion.json
@@ -0,0 +1,31 @@
+{
+ "name": "Cobra Stretch",
+ "primary": 2,
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 0.6, "tween": 1.1,
+ "root": {"pos": [188, 147], "yaw": 180, "pitch": 76},
+ "spine": [0, 6],
+ "neck": 6, "head": -46,
+ "shoulder_r": 92, "elbow_r": 100,
+ "shoulder_l": 92, "elbow_l": 100,
+ "hip_r": 0, "knee_r": 0, "ankle_r": -50,
+ "hip_l": 0, "knee_l": 0, "ankle_l": -50,
+ "pins": {"hand_r": [104, 150], "hand_l": [108, 151],
+ "foot_r": [270, 150], "foot_l": [274, 151]}
+ },
+ {
+ "hold": 1.3, "tween": 1.1,
+ "root": {"pos": [188, 147], "yaw": 180, "pitch": 68},
+ "spine": [-13, -16],
+ "neck": -10, "head": -18,
+ "shoulder_r": 95, "elbow_r": 14,
+ "shoulder_l": 95, "elbow_l": 14,
+ "hip_r": 0, "knee_r": 0, "ankle_r": -50,
+ "hip_l": 0, "knee_l": 0, "ankle_l": -50,
+ "pins": {"hand_r": [104, 150], "hand_l": [108, 151],
+ "foot_r": [270, 150], "foot_l": [274, 151]}
+ }
+ ]
+}
diff --git a/Exercise Library/Cobra Stretch/preview.gif b/Exercise Library/Cobra Stretch/preview.gif
new file mode 100644
index 0000000..4a4c392
Binary files /dev/null and b/Exercise Library/Cobra Stretch/preview.gif differ
diff --git a/Exercise Library/Cobra Stretch/visual.svg b/Exercise Library/Cobra Stretch/visual.svg
new file mode 100644
index 0000000..9ff9b44
--- /dev/null
+++ b/Exercise Library/Cobra Stretch/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Hip Circles/frames/frame-1.svg b/Exercise Library/Hip Circles/frames/frame-1.svg
new file mode 100644
index 0000000..37bd7c7
--- /dev/null
+++ b/Exercise Library/Hip Circles/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Hip Circles/frames/frame-2.svg b/Exercise Library/Hip Circles/frames/frame-2.svg
new file mode 100644
index 0000000..ee85bfb
--- /dev/null
+++ b/Exercise Library/Hip Circles/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Hip Circles/frames/frame-3.svg b/Exercise Library/Hip Circles/frames/frame-3.svg
new file mode 100644
index 0000000..2a41979
--- /dev/null
+++ b/Exercise Library/Hip Circles/frames/frame-3.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Hip Circles/frames/frame-4.svg b/Exercise Library/Hip Circles/frames/frame-4.svg
new file mode 100644
index 0000000..933e46f
--- /dev/null
+++ b/Exercise Library/Hip Circles/frames/frame-4.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Hip Circles/info.md b/Exercise Library/Hip Circles/info.md
new file mode 100644
index 0000000..d0ee98b
--- /dev/null
+++ b/Exercise Library/Hip Circles/info.md
@@ -0,0 +1,37 @@
+# Hip Circles
+
+Hands on the hips, circle the pelvis slowly like a hula-hoop warm-up to loosen
+the hips and low back and prime the whole midsection.
+
+- **Category:** Mobility / warm-up
+- **Type:** Hip mobility
+- **Targets:** Hips, pelvis, lumbar spine
+- **Prescription:** 8 slow circles in each direction
+- **Defaults:** 2 × 8 bodyweight
+
+## Setup
+
+Stand with feet shoulder-width, hands resting on the hips, knees soft.
+
+## Execution
+
+1. Push the hips forward, then around to one side.
+2. Carry them back, then to the other side, tracing one big smooth circle.
+3. Keep the head and shoulders roughly still over the feet as the hips travel.
+4. Complete the circles, then reverse the direction.
+
+## Cues
+
+- Draw the circle with the hips, not the whole body.
+- Keep both feet flat and planted throughout.
+- Let the upper body counter-lean gently so the head stays centered.
+
+## Common Mistakes
+
+- Circling the shoulders instead of the hips.
+- Letting a foot lift as the hips swing across.
+- Rushing — the circle should be slow and even.
+
+## Progression
+
+Small circles → bigger hula-hoop circles → slow tempo in both directions.
diff --git a/Exercise Library/Hip Circles/motion.json b/Exercise Library/Hip Circles/motion.json
new file mode 100644
index 0000000..2098a41
--- /dev/null
+++ b/Exercise Library/Hip Circles/motion.json
@@ -0,0 +1,52 @@
+{
+ "name": "Hip Circles",
+ "primary": 2,
+ "camera": {"yaw": 45, "zoom": 0.7},
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 0.12, "tween": 0.6,
+ "root": {"pos": [160, 72]},
+ "spine": [{"lateral": 0, "flexion": -2}, {"lateral": 0, "flexion": -2}],
+ "neck": 0, "head": 0,
+ "shoulder_r": {"flexion": -8, "abduction": 50}, "elbow_r": 125,
+ "shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
+ "hip_r": 3, "knee_r": 5, "ankle_r": 0,
+ "hip_l": 3, "knee_l": 5, "ankle_l": 0,
+ "pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
+ },
+ {
+ "hold": 0.12, "tween": 0.6,
+ "root": {"pos": [145, 67]},
+ "spine": [{"lateral": 8, "flexion": 0}, {"lateral": 8, "flexion": 0}],
+ "neck": 0, "head": 0,
+ "shoulder_r": {"flexion": -8, "abduction": 50}, "elbow_r": 125,
+ "shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
+ "hip_r": 3, "knee_r": 5, "ankle_r": 0,
+ "hip_l": 3, "knee_l": 5, "ankle_l": 0,
+ "pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
+ },
+ {
+ "hold": 0.12, "tween": 0.6,
+ "root": {"pos": [160, 63]},
+ "spine": [{"lateral": 0, "flexion": 2}, {"lateral": 0, "flexion": 2}],
+ "neck": 0, "head": 0,
+ "shoulder_r": {"flexion": -8, "abduction": 50}, "elbow_r": 125,
+ "shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
+ "hip_r": 3, "knee_r": 5, "ankle_r": 0,
+ "hip_l": 3, "knee_l": 5, "ankle_l": 0,
+ "pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
+ },
+ {
+ "hold": 0.12, "tween": 0.6,
+ "root": {"pos": [175, 67]},
+ "spine": [{"lateral": -8, "flexion": 0}, {"lateral": -8, "flexion": 0}],
+ "neck": 0, "head": 0,
+ "shoulder_r": {"flexion": -8, "abduction": 50}, "elbow_r": 125,
+ "shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
+ "hip_r": 3, "knee_r": 5, "ankle_r": 0,
+ "hip_l": 3, "knee_l": 5, "ankle_l": 0,
+ "pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
+ }
+ ]
+}
diff --git a/Exercise Library/Hip Circles/orbit.gif b/Exercise Library/Hip Circles/orbit.gif
new file mode 100644
index 0000000..c7f7f7d
Binary files /dev/null and b/Exercise Library/Hip Circles/orbit.gif differ
diff --git a/Exercise Library/Hip Circles/preview.gif b/Exercise Library/Hip Circles/preview.gif
new file mode 100644
index 0000000..223bae0
Binary files /dev/null and b/Exercise Library/Hip Circles/preview.gif differ
diff --git a/Exercise Library/Hip Circles/visual.svg b/Exercise Library/Hip Circles/visual.svg
new file mode 100644
index 0000000..ee85bfb
--- /dev/null
+++ b/Exercise Library/Hip Circles/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Kneeling Hip Flexor Stretch/frames/frame-1.svg b/Exercise Library/Kneeling Hip Flexor Stretch/frames/frame-1.svg
new file mode 100644
index 0000000..a12dcc7
--- /dev/null
+++ b/Exercise Library/Kneeling Hip Flexor Stretch/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Kneeling Hip Flexor Stretch/frames/frame-2.svg b/Exercise Library/Kneeling Hip Flexor Stretch/frames/frame-2.svg
new file mode 100644
index 0000000..a1674bd
--- /dev/null
+++ b/Exercise Library/Kneeling Hip Flexor Stretch/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Kneeling Hip Flexor Stretch/info.md b/Exercise Library/Kneeling Hip Flexor Stretch/info.md
new file mode 100644
index 0000000..5f541d9
--- /dev/null
+++ b/Exercise Library/Kneeling Hip Flexor Stretch/info.md
@@ -0,0 +1,43 @@
+# Kneeling Hip Flexor Stretch
+
+Drop into a half-kneel and press the hips forward to open the front of the back
+hip. The go-to release for tight hip flexors after long hours of sitting or
+heavy squatting.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Hip flexors, quadriceps, front of the hip
+- **Prescription:** Hold 30 s per side, pressing the hips gently forward
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Kneel on one knee with the other foot planted flat in front, the front knee
+stacked over the ankle at about ninety degrees. Rest the hands on the front
+thigh. Pad the back knee if needed.
+
+## Execution
+
+1. Tuck the tailbone under to flatten the low back.
+2. Ease the hips forward until you feel a stretch across the front of the back
+ hip and thigh.
+3. Keep the trunk tall and the front shin vertical.
+4. Hold and breathe, then switch sides.
+
+## Cues
+
+- Squeeze the glute of the kneeling leg to deepen the hip-flexor stretch.
+- Tuck the tailbone first — don't just arch the low back forward.
+- Keep the front knee tracking over the foot, not caving inward.
+
+## Common Mistakes
+
+- Letting the front knee drift far past the toes.
+- Arching the low back instead of tucking the pelvis and pressing the hips.
+- Leaning the whole torso forward rather than shifting the hips.
+
+## Progression
+
+Hands on the front thigh → reach the same-side arm overhead and lean away for
+a deeper stretch → add a gentle back-foot lift toward the glute to bring in the
+quad.
diff --git a/Exercise Library/Kneeling Hip Flexor Stretch/motion.json b/Exercise Library/Kneeling Hip Flexor Stretch/motion.json
new file mode 100644
index 0000000..fd570f7
--- /dev/null
+++ b/Exercise Library/Kneeling Hip Flexor Stretch/motion.json
@@ -0,0 +1,29 @@
+{
+ "name": "Kneeling Hip Flexor Stretch",
+ "primary": 2,
+ "working": ["leg_l"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 108], "pitch": 4},
+ "spine": [11, 11],
+ "neck": 8, "head": -12,
+ "shoulder_r": 54, "elbow_r": 36,
+ "shoulder_l": 54, "elbow_l": 36,
+ "hip_r": 86, "knee_r": 90, "ankle_r": 6,
+ "hip_l": -16, "knee_l": 74, "ankle_l": -55,
+ "pins": {"foot_r": [206, 150], "hand_r": [202, 112], "hand_l": [206, 114]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [162, 110], "pitch": 6},
+ "spine": [15, 15],
+ "neck": 9, "head": -13,
+ "shoulder_r": 58, "elbow_r": 32,
+ "shoulder_l": 58, "elbow_l": 32,
+ "hip_r": 90, "knee_r": 90, "ankle_r": 6,
+ "hip_l": -28, "knee_l": 56, "ankle_l": -55,
+ "pins": {"foot_r": [210, 150], "hand_r": [206, 110], "hand_l": [210, 112]}
+ }
+ ]
+}
diff --git a/Exercise Library/Kneeling Hip Flexor Stretch/preview.gif b/Exercise Library/Kneeling Hip Flexor Stretch/preview.gif
new file mode 100644
index 0000000..17199e1
Binary files /dev/null and b/Exercise Library/Kneeling Hip Flexor Stretch/preview.gif differ
diff --git a/Exercise Library/Kneeling Hip Flexor Stretch/visual.svg b/Exercise Library/Kneeling Hip Flexor Stretch/visual.svg
new file mode 100644
index 0000000..a1674bd
--- /dev/null
+++ b/Exercise Library/Kneeling Hip Flexor Stretch/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Leg Swings/frames/frame-1.svg b/Exercise Library/Leg Swings/frames/frame-1.svg
new file mode 100644
index 0000000..21464ba
--- /dev/null
+++ b/Exercise Library/Leg Swings/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Leg Swings/frames/frame-2.svg b/Exercise Library/Leg Swings/frames/frame-2.svg
new file mode 100644
index 0000000..20810b5
--- /dev/null
+++ b/Exercise Library/Leg Swings/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Leg Swings/info.md b/Exercise Library/Leg Swings/info.md
new file mode 100644
index 0000000..d199798
--- /dev/null
+++ b/Exercise Library/Leg Swings/info.md
@@ -0,0 +1,42 @@
+# Leg Swings
+
+Stand on one leg and swing the other freely front to back, letting the hip
+open and close through a growing range. A dynamic mobility drill that loosens
+the hips, hamstrings, and hip flexors before squats, running, or lower-body
+work.
+
+- **Category:** Mobility / warm-up
+- **Type:** Dynamic mobility
+- **Targets:** Hip mobility, hamstrings, hip flexors
+- **Prescription:** 10–12 swings per leg, building range gradually
+- **Defaults:** 2 × 10 bodyweight
+
+## Setup
+
+Balance on one leg, standing tall. Rest a hand on a wall or rail for support
+if you need it, and let the working leg hang loose.
+
+## Execution
+
+1. Swing the free leg forward to a comfortable height, keeping it fairly
+ straight.
+2. Let it swing back through under the hip and behind you.
+3. Keep the torso upright and quiet — the motion is all at the hip.
+4. Swing smoothly for the set, then switch legs.
+
+## Cues
+
+- Move from the hip; don't heave with the low back.
+- Start with small swings and let the range grow rep by rep.
+- Stay tall — resist the urge to fold forward as the leg swings back.
+
+## Common Mistakes
+
+- Arching and rounding the spine to fling the leg higher.
+- Swinging so hard you lose balance and the motion turns jerky.
+- Twisting the torso instead of keeping it square and still.
+
+## Progression
+
+Add side-to-side swings across the body once front-to-back feels smooth, and
+gradually widen the arc as the hip warms up.
diff --git a/Exercise Library/Leg Swings/motion.json b/Exercise Library/Leg Swings/motion.json
new file mode 100644
index 0000000..691e0d0
--- /dev/null
+++ b/Exercise Library/Leg Swings/motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Leg Swings",
+ "primary": 1,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r"],
+ "frames": [
+ {
+ "hold": 0.16, "tween": 0.72,
+ "root": {"pos": [156, 66], "pitch": 5},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 6, "elbow_r": 10,
+ "shoulder_l": 52, "elbow_l": 12,
+ "hip_r": 72, "knee_r": 8, "ankle_r": -4,
+ "hip_l": -2, "knee_l": 3, "ankle_l": 0,
+ "pins": {"foot_l": [168, 150]}
+ },
+ {
+ "hold": 0.16, "tween": 0.72,
+ "root": {"pos": [156, 66], "pitch": 5},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 6, "elbow_r": 10,
+ "shoulder_l": 52, "elbow_l": 12,
+ "hip_r": -28, "knee_r": 5, "ankle_r": -16,
+ "hip_l": -2, "knee_l": 3, "ankle_l": 0,
+ "pins": {"foot_l": [168, 150]}
+ }
+ ]
+}
diff --git a/Exercise Library/Leg Swings/orbit.gif b/Exercise Library/Leg Swings/orbit.gif
new file mode 100644
index 0000000..febc6bc
Binary files /dev/null and b/Exercise Library/Leg Swings/orbit.gif differ
diff --git a/Exercise Library/Leg Swings/preview.gif b/Exercise Library/Leg Swings/preview.gif
new file mode 100644
index 0000000..187019d
Binary files /dev/null and b/Exercise Library/Leg Swings/preview.gif differ
diff --git a/Exercise Library/Leg Swings/visual.svg b/Exercise Library/Leg Swings/visual.svg
new file mode 100644
index 0000000..21464ba
--- /dev/null
+++ b/Exercise Library/Leg Swings/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/March in Place/frames/frame-1.svg b/Exercise Library/March in Place/frames/frame-1.svg
new file mode 100644
index 0000000..640ae40
--- /dev/null
+++ b/Exercise Library/March in Place/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/March in Place/frames/frame-2.svg b/Exercise Library/March in Place/frames/frame-2.svg
new file mode 100644
index 0000000..159f732
--- /dev/null
+++ b/Exercise Library/March in Place/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/March in Place/frames/frame-3.svg b/Exercise Library/March in Place/frames/frame-3.svg
new file mode 100644
index 0000000..d0ef991
--- /dev/null
+++ b/Exercise Library/March in Place/frames/frame-3.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/March in Place/frames/frame-4.svg b/Exercise Library/March in Place/frames/frame-4.svg
new file mode 100644
index 0000000..159f732
--- /dev/null
+++ b/Exercise Library/March in Place/frames/frame-4.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/March in Place/info.md b/Exercise Library/March in Place/info.md
new file mode 100644
index 0000000..60da866
--- /dev/null
+++ b/Exercise Library/March in Place/info.md
@@ -0,0 +1,39 @@
+# March in Place
+
+A rhythmic warm-up staple — drive one knee up while the opposite arm swings
+through, then switch, marching on the spot. It wakes the hip flexors, primes
+the calves and ankles, and lifts the heart rate before the real work.
+
+- **Category:** Mobility / warm-up
+- **Type:** Dynamic warm-up
+- **Targets:** Hip flexors, calves, coordination
+- **Prescription:** 30–60 seconds at a steady, controlled cadence
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Stand tall with feet hip-width, arms relaxed at your sides, eyes forward.
+
+## Execution
+
+1. Drive one knee up toward hip height, staying tall through the spine.
+2. Swing the opposite arm forward as the knee rises — natural, like walking.
+3. Plant that foot and lift the other knee, letting the arms switch.
+4. Keep alternating in an even, unhurried rhythm.
+
+## Cues
+
+- Stand tall — no hunching or leaning back to swing the knee up.
+- Opposite arm to opposite knee, the same coordination as walking.
+- Land softly through the whole foot, not with a hard heel strike.
+
+## Common Mistakes
+
+- Shuffling low, barely lifting the knees.
+- Rushing into a stiff, bouncy jog instead of a controlled march.
+- Same-side arm and knee moving together, which kills the rhythm.
+
+## Progression
+
+Lift the knees higher, quicken the cadence, or add a light arm reach overhead
+to turn it into a fuller-body warm-up.
diff --git a/Exercise Library/March in Place/motion.json b/Exercise Library/March in Place/motion.json
new file mode 100644
index 0000000..8e3f770
--- /dev/null
+++ b/Exercise Library/March in Place/motion.json
@@ -0,0 +1,52 @@
+{
+ "name": "March in Place",
+ "primary": 1,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r", "leg_l"],
+ "frames": [
+ {
+ "hold": 0.18, "tween": 0.42,
+ "root": {"pos": [160, 62], "pitch": 4},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": -28, "elbow_r": 82,
+ "shoulder_l": 34, "elbow_l": 78,
+ "hip_r": 68, "knee_r": 88, "ankle_r": -8,
+ "hip_l": 2, "knee_l": 4, "ankle_l": 0,
+ "pins": {"foot_l": [162, 150]}
+ },
+ {
+ "hold": 0.14, "tween": 0.4,
+ "root": {"pos": [160, 64], "pitch": 4},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 3, "elbow_r": 64,
+ "shoulder_l": 3, "elbow_l": 64,
+ "hip_r": 4, "knee_r": 4, "ankle_r": 0,
+ "hip_l": 4, "knee_l": 4, "ankle_l": 0,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150]}
+ },
+ {
+ "hold": 0.18, "tween": 0.42,
+ "root": {"pos": [160, 62], "pitch": 4},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 34, "elbow_r": 78,
+ "shoulder_l": -28, "elbow_l": 82,
+ "hip_r": 2, "knee_r": 4, "ankle_r": 0,
+ "hip_l": 68, "knee_l": 88, "ankle_l": -8,
+ "pins": {"foot_r": [158, 148]}
+ },
+ {
+ "hold": 0.14, "tween": 0.4,
+ "root": {"pos": [160, 64], "pitch": 4},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 3, "elbow_r": 64,
+ "shoulder_l": 3, "elbow_l": 64,
+ "hip_r": 4, "knee_r": 4, "ankle_r": 0,
+ "hip_l": 4, "knee_l": 4, "ankle_l": 0,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150]}
+ }
+ ]
+}
diff --git a/Exercise Library/March in Place/orbit.gif b/Exercise Library/March in Place/orbit.gif
new file mode 100644
index 0000000..5c9061a
Binary files /dev/null and b/Exercise Library/March in Place/orbit.gif differ
diff --git a/Exercise Library/March in Place/preview.gif b/Exercise Library/March in Place/preview.gif
new file mode 100644
index 0000000..e7c0601
Binary files /dev/null and b/Exercise Library/March in Place/preview.gif differ
diff --git a/Exercise Library/March in Place/visual.svg b/Exercise Library/March in Place/visual.svg
new file mode 100644
index 0000000..640ae40
--- /dev/null
+++ b/Exercise Library/March in Place/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Neck Rolls/frames/frame-1.svg b/Exercise Library/Neck Rolls/frames/frame-1.svg
new file mode 100644
index 0000000..29ff1cd
--- /dev/null
+++ b/Exercise Library/Neck Rolls/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Neck Rolls/frames/frame-2.svg b/Exercise Library/Neck Rolls/frames/frame-2.svg
new file mode 100644
index 0000000..c965772
--- /dev/null
+++ b/Exercise Library/Neck Rolls/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Neck Rolls/frames/frame-3.svg b/Exercise Library/Neck Rolls/frames/frame-3.svg
new file mode 100644
index 0000000..2373891
--- /dev/null
+++ b/Exercise Library/Neck Rolls/frames/frame-3.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Neck Rolls/frames/frame-4.svg b/Exercise Library/Neck Rolls/frames/frame-4.svg
new file mode 100644
index 0000000..6c4a834
--- /dev/null
+++ b/Exercise Library/Neck Rolls/frames/frame-4.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Neck Rolls/info.md b/Exercise Library/Neck Rolls/info.md
new file mode 100644
index 0000000..3215820
--- /dev/null
+++ b/Exercise Library/Neck Rolls/info.md
@@ -0,0 +1,41 @@
+# Neck Rolls
+
+Slow, gentle circles of the head to loosen the neck and upper spine before
+training or after a long day at a desk.
+
+- **Category:** Mobility / warm-up
+- **Type:** Neck mobility
+- **Targets:** Cervical spine, upper trapezius, levator scapulae
+- **Prescription:** 3–5 slow circles in each direction, stopping short of any pinch
+- **Defaults:** 2 × 5 bodyweight
+
+## Setup
+
+Stand tall, feet hip-width, shoulders relaxed and down, arms hanging quietly at
+your sides.
+
+## Execution
+
+1. Drop the chin toward the chest.
+2. Roll one ear down toward that shoulder, then carry the head back into a
+ gentle look-up.
+3. Bring the other ear toward the far shoulder and back down to the chest — one
+ smooth, continuous circle.
+4. Finish the circles, then reverse the direction.
+
+## Cues
+
+- Move slowly — a single circle should take several seconds.
+- Keep the shoulders down and still; only the head travels.
+- Ease off the moment you feel a pinch, especially at the look-up.
+
+## Common Mistakes
+
+- Whipping the head around quickly.
+- Shrugging a shoulder up to meet the ear.
+- Forcing the range at the top of the circle.
+
+## Progression
+
+Small pain-free arcs → full slow circles → add a brief pause at each ear and at
+the chin tuck.
diff --git a/Exercise Library/Neck Rolls/motion.json b/Exercise Library/Neck Rolls/motion.json
new file mode 100644
index 0000000..71fc19d
--- /dev/null
+++ b/Exercise Library/Neck Rolls/motion.json
@@ -0,0 +1,52 @@
+{
+ "name": "Neck Rolls",
+ "primary": 1,
+ "camera": {"yaw": 35, "zoom": 0.66},
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 0.2, "tween": 0.9,
+ "root": {"pos": [160, 64]},
+ "spine": [0, {"lateral": 0}],
+ "neck": {"flexion": 44, "rotation": 0}, "head": 8,
+ "shoulder_r": 5, "elbow_r": 6,
+ "shoulder_l": 5, "elbow_l": 6,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.2, "tween": 0.9,
+ "root": {"pos": [160, 64]},
+ "spine": [0, {"lateral": 14}],
+ "neck": {"flexion": 6, "rotation": 16}, "head": 0,
+ "shoulder_r": 5, "elbow_r": 6,
+ "shoulder_l": 5, "elbow_l": 6,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.2, "tween": 0.9,
+ "root": {"pos": [160, 64]},
+ "spine": [0, {"lateral": 0}],
+ "neck": {"flexion": -24, "rotation": 0}, "head": -12,
+ "shoulder_r": 5, "elbow_r": 6,
+ "shoulder_l": 5, "elbow_l": 6,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.2, "tween": 0.9,
+ "root": {"pos": [160, 64]},
+ "spine": [0, {"lateral": -14}],
+ "neck": {"flexion": 6, "rotation": -16}, "head": 0,
+ "shoulder_r": 5, "elbow_r": 6,
+ "shoulder_l": 5, "elbow_l": 6,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ }
+ ]
+}
diff --git a/Exercise Library/Neck Rolls/orbit.gif b/Exercise Library/Neck Rolls/orbit.gif
new file mode 100644
index 0000000..712dbc7
Binary files /dev/null and b/Exercise Library/Neck Rolls/orbit.gif differ
diff --git a/Exercise Library/Neck Rolls/preview.gif b/Exercise Library/Neck Rolls/preview.gif
new file mode 100644
index 0000000..bb8cfe0
Binary files /dev/null and b/Exercise Library/Neck Rolls/preview.gif differ
diff --git a/Exercise Library/Neck Rolls/visual.svg b/Exercise Library/Neck Rolls/visual.svg
new file mode 100644
index 0000000..29ff1cd
--- /dev/null
+++ b/Exercise Library/Neck Rolls/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Overhead Triceps Stretch/frames/frame-1.svg b/Exercise Library/Overhead Triceps Stretch/frames/frame-1.svg
new file mode 100644
index 0000000..9cecc1f
--- /dev/null
+++ b/Exercise Library/Overhead Triceps Stretch/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Overhead Triceps Stretch/frames/frame-2.svg b/Exercise Library/Overhead Triceps Stretch/frames/frame-2.svg
new file mode 100644
index 0000000..806dffa
--- /dev/null
+++ b/Exercise Library/Overhead Triceps Stretch/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Overhead Triceps Stretch/info.md b/Exercise Library/Overhead Triceps Stretch/info.md
new file mode 100644
index 0000000..689f475
--- /dev/null
+++ b/Exercise Library/Overhead Triceps Stretch/info.md
@@ -0,0 +1,42 @@
+# Overhead Triceps Stretch
+
+Reach one arm overhead and let the hand drop behind the neck, then use the
+other hand to ease the elbow back. A simple way to lengthen the triceps and
+open the underside of the shoulder between pressing sets.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Triceps (back of the upper arm), lats, shoulder
+- **Prescription:** Hold 30 s per side, easing the elbow back gently
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Stand tall with the feet hip-width. Raise one arm overhead and bend the elbow
+so the hand drops down behind the neck.
+
+## Execution
+
+1. Reach the free hand up and rest it on the raised elbow.
+2. Draw the elbow gently back and toward the midline until the triceps
+ lengthens.
+3. Let the trunk lean a touch away from the raised arm to deepen the stretch.
+4. Hold and breathe, then release and switch arms.
+
+## Cues
+
+- Ease the elbow back, not down — coax it, never wrench it.
+- Keep the ribs from flaring by drawing them softly down.
+- Lengthen tall through the spine before adding the side lean.
+
+## Common Mistakes
+
+- Cranking the head forward to meet the arm instead of dropping the hand behind.
+- Flaring the ribs and arching the low back to fake more range.
+- Shrugging the working shoulder up toward the ear.
+
+## Progression
+
+Walk the hand further down the spine → add a gentle side bend away from the
+raised arm → hold a strap between the top and bottom hands to link both
+shoulders.
diff --git a/Exercise Library/Overhead Triceps Stretch/motion.json b/Exercise Library/Overhead Triceps Stretch/motion.json
new file mode 100644
index 0000000..ed2e7e9
--- /dev/null
+++ b/Exercise Library/Overhead Triceps Stretch/motion.json
@@ -0,0 +1,31 @@
+{
+ "name": "Overhead Triceps Stretch",
+ "primary": 2,
+ "camera": {"yaw": 40, "zoom": 0.73},
+ "working": ["arm_r"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 64], "pitch": 2},
+ "spine": [0, 0],
+ "neck": 8, "head": -6,
+ "shoulder_r": {"flexion": 143, "abduction": 10}, "elbow_r": 98,
+ "shoulder_l": {"flexion": 130, "abduction": 6}, "elbow_l": 44,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [158, 150], "foot_l": [162, 150]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [160, 64], "pitch": 2},
+ "spine": [{"lateral": -5}, {"lateral": -5}],
+ "neck": 14, "head": -6,
+ "shoulder_r": {"flexion": 172, "abduction": 10}, "elbow_r": 150,
+ "shoulder_l": {"flexion": 158, "abduction": -6}, "elbow_l": 70,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [158, 150], "foot_l": [162, 150],
+ "hand_l": [164, -51]}
+ }
+ ]
+}
diff --git a/Exercise Library/Overhead Triceps Stretch/preview.gif b/Exercise Library/Overhead Triceps Stretch/preview.gif
new file mode 100644
index 0000000..a1d9a49
Binary files /dev/null and b/Exercise Library/Overhead Triceps Stretch/preview.gif differ
diff --git a/Exercise Library/Overhead Triceps Stretch/visual.svg b/Exercise Library/Overhead Triceps Stretch/visual.svg
new file mode 100644
index 0000000..806dffa
--- /dev/null
+++ b/Exercise Library/Overhead Triceps Stretch/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Calf Raise/frames/frame-1.svg b/Exercise Library/Standing Calf Raise/frames/frame-1.svg
new file mode 100644
index 0000000..9f88684
--- /dev/null
+++ b/Exercise Library/Standing Calf Raise/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Calf Raise/frames/frame-2.svg b/Exercise Library/Standing Calf Raise/frames/frame-2.svg
new file mode 100644
index 0000000..4b0455d
--- /dev/null
+++ b/Exercise Library/Standing Calf Raise/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Calf Raise/info.md b/Exercise Library/Standing Calf Raise/info.md
new file mode 100644
index 0000000..6871747
--- /dev/null
+++ b/Exercise Library/Standing Calf Raise/info.md
@@ -0,0 +1,40 @@
+# Standing Calf Raise
+
+Rise onto the balls of both feet, lifting the heels as high as they'll go,
+then lower under control. The simplest way to train the calves and strengthen
+the ankles — no equipment, just bodyweight and a slow tempo.
+
+- **Category:** Mobility / warm-up
+- **Type:** Bodyweight calf raise
+- **Targets:** Gastrocnemius, soleus, ankle stability
+- **Prescription:** 2–3 × 15–20, slow up and down with a pause at the top
+- **Defaults:** 3 × 15 bodyweight
+
+## Setup
+
+Stand tall with feet hip-width, weight even across both feet. Rest a hand on
+a wall for balance if needed.
+
+## Execution
+
+1. Press through the balls of the feet and lift both heels as high as you can.
+2. Pause for a beat at the top, standing tall on your toes.
+3. Lower the heels slowly back to the floor under control.
+4. Repeat for the set without bouncing off the bottom.
+
+## Cues
+
+- Push all the way up to a full stretch at the top of each rep.
+- Keep the knees straight but soft, so the calves do the work.
+- Lower slowly — the descent builds as much strength as the lift.
+
+## Common Mistakes
+
+- Short, bouncy reps that never reach a full heel lift.
+- Rolling the weight to the outside of the feet.
+- Bending the knees to bob up instead of driving through the ankles.
+
+## Progression
+
+Pause longer at the top, slow the lowering phase, then progress to single-leg
+raises or add load with a dumbbell or a step for extra range.
diff --git a/Exercise Library/Standing Calf Raise/motion.json b/Exercise Library/Standing Calf Raise/motion.json
new file mode 100644
index 0000000..d54574c
--- /dev/null
+++ b/Exercise Library/Standing Calf Raise/motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Standing Calf Raise",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r", "leg_l"],
+ "frames": [
+ {
+ "hold": 0.3, "tween": 0.6,
+ "root": {"pos": [160, 64], "pitch": 2},
+ "spine": [0, 0],
+ "neck": 2, "head": -4,
+ "shoulder_r": 4, "elbow_r": 6,
+ "shoulder_l": 4, "elbow_l": 6,
+ "hip_r": 4, "knee_r": 4, "ankle_r": 0,
+ "hip_l": 4, "knee_l": 4, "ankle_l": 0,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150]}
+ },
+ {
+ "hold": 0.4, "tween": 0.9,
+ "root": {"pos": [160, 55], "pitch": 2},
+ "spine": [0, 0],
+ "neck": 2, "head": -4,
+ "shoulder_r": 4, "elbow_r": 6,
+ "shoulder_l": 4, "elbow_l": 6,
+ "hip_r": 4, "knee_r": 3, "ankle_r": -48,
+ "hip_l": 4, "knee_l": 3, "ankle_l": -48,
+ "pins": {"foot_r": [158, 139], "foot_l": [162, 141]}
+ }
+ ]
+}
diff --git a/Exercise Library/Standing Calf Raise/orbit.gif b/Exercise Library/Standing Calf Raise/orbit.gif
new file mode 100644
index 0000000..4101a8e
Binary files /dev/null and b/Exercise Library/Standing Calf Raise/orbit.gif differ
diff --git a/Exercise Library/Standing Calf Raise/preview.gif b/Exercise Library/Standing Calf Raise/preview.gif
new file mode 100644
index 0000000..c3f1b52
Binary files /dev/null and b/Exercise Library/Standing Calf Raise/preview.gif differ
diff --git a/Exercise Library/Standing Calf Raise/visual.svg b/Exercise Library/Standing Calf Raise/visual.svg
new file mode 100644
index 0000000..4b0455d
--- /dev/null
+++ b/Exercise Library/Standing Calf Raise/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Calf Stretch/frames/frame-1.svg b/Exercise Library/Standing Calf Stretch/frames/frame-1.svg
new file mode 100644
index 0000000..67f237a
--- /dev/null
+++ b/Exercise Library/Standing Calf Stretch/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Calf Stretch/frames/frame-2.svg b/Exercise Library/Standing Calf Stretch/frames/frame-2.svg
new file mode 100644
index 0000000..d8b1001
--- /dev/null
+++ b/Exercise Library/Standing Calf Stretch/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Calf Stretch/info.md b/Exercise Library/Standing Calf Stretch/info.md
new file mode 100644
index 0000000..8292db5
--- /dev/null
+++ b/Exercise Library/Standing Calf Stretch/info.md
@@ -0,0 +1,41 @@
+# Standing Calf Stretch
+
+A staggered-stance lean that lengthens the back calf: press the rear heel into
+the floor with the leg long while the front knee bends and the hips travel
+forward. The classic wall or curb stretch, done anywhere.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Calf (gastrocnemius, soleus), Achilles tendon
+- **Prescription:** Hold 30 s per side, keeping the back heel pinned down
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Stand in a split stance, one foot a stride behind the other, both toes pointing
+forward. Rest the hands on the front thigh.
+
+## Execution
+
+1. Straighten the back leg and press its heel flat into the floor.
+2. Bend the front knee and ease the hips forward until the back calf lengthens.
+3. Keep the back knee straight and the rear foot pointing straight ahead.
+4. Hold, breathing easily, then switch sides.
+
+## Cues
+
+- Drive the back heel down — the stretch lives in keeping it planted.
+- Point the back toes forward, not turned out, to load the calf evenly.
+- Move the hips forward for more; don't collapse the back knee.
+
+## Common Mistakes
+
+- Letting the back heel lift, which cuts off the stretch.
+- Turning the back foot out to cheat more range.
+- Rounding the back instead of hinging the hips forward.
+
+## Progression
+
+Bend the back knee slightly to shift the stretch to the lower soleus →
+drop the back heel off a step or curb for a deeper range → hold longer as the
+ankle mobility improves.
diff --git a/Exercise Library/Standing Calf Stretch/motion.json b/Exercise Library/Standing Calf Stretch/motion.json
new file mode 100644
index 0000000..7cd97db
--- /dev/null
+++ b/Exercise Library/Standing Calf Stretch/motion.json
@@ -0,0 +1,31 @@
+{
+ "name": "Standing Calf Stretch",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_l"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 66], "pitch": 12},
+ "spine": [4, 4],
+ "neck": 6, "head": -10,
+ "shoulder_r": 24, "elbow_r": 42,
+ "shoulder_l": 24, "elbow_l": 42,
+ "hip_r": 22, "knee_r": 22, "ankle_r": 6,
+ "knee_l": 2, "ankle_l": 10,
+ "pins": {"foot_r": [188, 150], "foot_l": [142, 150]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [160, 68], "pitch": 21},
+ "spine": [6, 6],
+ "neck": 9, "head": -17,
+ "shoulder_r": 40, "elbow_r": 34,
+ "shoulder_l": 40, "elbow_l": 34,
+ "hip_r": 44, "knee_r": 46, "ankle_r": 8,
+ "knee_l": 2, "ankle_l": 12,
+ "pins": {"foot_r": [198, 150], "foot_l": [132, 150],
+ "hand_r": [186, 110], "hand_l": [190, 112]}
+ }
+ ]
+}
diff --git a/Exercise Library/Standing Calf Stretch/preview.gif b/Exercise Library/Standing Calf Stretch/preview.gif
new file mode 100644
index 0000000..dd14bf4
Binary files /dev/null and b/Exercise Library/Standing Calf Stretch/preview.gif differ
diff --git a/Exercise Library/Standing Calf Stretch/visual.svg b/Exercise Library/Standing Calf Stretch/visual.svg
new file mode 100644
index 0000000..d8b1001
--- /dev/null
+++ b/Exercise Library/Standing Calf Stretch/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Forward Fold/frames/frame-1.svg b/Exercise Library/Standing Forward Fold/frames/frame-1.svg
new file mode 100644
index 0000000..fe27016
--- /dev/null
+++ b/Exercise Library/Standing Forward Fold/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Forward Fold/frames/frame-2.svg b/Exercise Library/Standing Forward Fold/frames/frame-2.svg
new file mode 100644
index 0000000..d4634a9
--- /dev/null
+++ b/Exercise Library/Standing Forward Fold/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Forward Fold/info.md b/Exercise Library/Standing Forward Fold/info.md
new file mode 100644
index 0000000..ca204cf
--- /dev/null
+++ b/Exercise Library/Standing Forward Fold/info.md
@@ -0,0 +1,39 @@
+# Standing Forward Fold
+
+Hinge at the hips and round down toward the toes, letting the head and arms
+hang heavy while the back of the legs lengthens. A calming mobility drill that
+decompresses the spine and opens the hamstrings and posterior chain.
+
+- **Category:** Mobility / warm-up
+- **Type:** Standing mobility
+- **Targets:** Hamstrings, low back, posterior chain
+- **Prescription:** 5–8 slow roll-downs, or hold the bottom 20–30 seconds
+- **Defaults:** 2 × 8 bodyweight
+
+## Setup
+
+Stand tall with feet hip-width, knees soft, arms relaxed at your sides.
+
+## Execution
+
+1. Hinge at the hips and begin folding forward, chin tucking toward the chest.
+2. Round down one segment at a time, letting the arms and head hang heavy.
+3. Fold as far as the hamstrings allow — hands drifting toward the floor.
+4. Reverse slowly, stacking the spine back up to standing.
+
+## Cues
+
+- Let gravity do the work; keep the neck and shoulders loose.
+- Soften the knees if the hamstrings clamp down.
+- Feel a stretch, never a sharp pull in the low back.
+
+## Common Mistakes
+
+- Bouncing at the bottom to force more range.
+- Locking the knees hard and straining the low back.
+- Snapping back up instead of rolling through the spine.
+
+## Progression
+
+Deepen the fold as the hamstrings loosen, pause and breathe at the bottom, or
+walk the hands toward the shins for a gentle assisted stretch.
diff --git a/Exercise Library/Standing Forward Fold/motion.json b/Exercise Library/Standing Forward Fold/motion.json
new file mode 100644
index 0000000..cb9f8da
--- /dev/null
+++ b/Exercise Library/Standing Forward Fold/motion.json
@@ -0,0 +1,31 @@
+{
+ "name": "Standing Forward Fold",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r", "leg_l", "spine"],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 1.2,
+ "root": {"pos": [160, 64], "pitch": 5},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 5, "elbow_r": 5,
+ "shoulder_l": 5, "elbow_l": 5,
+ "hip_r": 5, "knee_r": 6, "ankle_r": 0,
+ "hip_l": 5, "knee_l": 6, "ankle_l": 0,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150]}
+ },
+ {
+ "hold": 0.6, "tween": 1.2,
+ "root": {"pos": [147, 66], "pitch": 134},
+ "spine": [11, 13],
+ "neck": 16, "head": -56,
+ "shoulder_r": 90, "elbow_r": 6,
+ "shoulder_l": 90, "elbow_l": 6,
+ "hip_r": 34, "knee_r": 14, "ankle_r": 10,
+ "hip_l": 34, "knee_l": 14, "ankle_l": 10,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150],
+ "hand_r": [159, 151], "hand_l": [163, 152]}
+ }
+ ]
+}
diff --git a/Exercise Library/Standing Forward Fold/orbit.gif b/Exercise Library/Standing Forward Fold/orbit.gif
new file mode 100644
index 0000000..2857ece
Binary files /dev/null and b/Exercise Library/Standing Forward Fold/orbit.gif differ
diff --git a/Exercise Library/Standing Forward Fold/preview.gif b/Exercise Library/Standing Forward Fold/preview.gif
new file mode 100644
index 0000000..ba4484b
Binary files /dev/null and b/Exercise Library/Standing Forward Fold/preview.gif differ
diff --git a/Exercise Library/Standing Forward Fold/visual.svg b/Exercise Library/Standing Forward Fold/visual.svg
new file mode 100644
index 0000000..d4634a9
--- /dev/null
+++ b/Exercise Library/Standing Forward Fold/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Quad Stretch/frames/frame-1.svg b/Exercise Library/Standing Quad Stretch/frames/frame-1.svg
new file mode 100644
index 0000000..11f83ae
--- /dev/null
+++ b/Exercise Library/Standing Quad Stretch/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Quad Stretch/frames/frame-2.svg b/Exercise Library/Standing Quad Stretch/frames/frame-2.svg
new file mode 100644
index 0000000..5333973
--- /dev/null
+++ b/Exercise Library/Standing Quad Stretch/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Quad Stretch/info.md b/Exercise Library/Standing Quad Stretch/info.md
new file mode 100644
index 0000000..d7dc106
--- /dev/null
+++ b/Exercise Library/Standing Quad Stretch/info.md
@@ -0,0 +1,42 @@
+# Standing Quad Stretch
+
+Balance on one leg, catch the opposite foot, and draw the heel toward the seat
+to lengthen the front of the thigh. A quick, equipment-free way to loosen the
+quads after running or squatting.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Quadriceps (front of the thigh), hip flexors
+- **Prescription:** Hold 30 s per side, keeping the knees together
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Stand tall next to a wall for balance if needed. Shift the weight onto one leg
+and bend the other knee, reaching back with the same-side hand to hold the
+foot or ankle.
+
+## Execution
+
+1. Draw the heel gently toward the glute until the front of the thigh
+ lengthens.
+2. Keep the knees pressed together and the thigh pointing straight down.
+3. Stand tall — tuck the tailbone so the low back doesn't arch.
+4. Hold and breathe, then lower the foot and switch sides.
+
+## Cues
+
+- Keep the bent knee pointing at the floor, not flaring out to the side.
+- Squeeze the glute of the stretching leg to add a hip-flexor stretch.
+- Reach the free arm out or up for balance instead of gripping a wall hard.
+
+## Common Mistakes
+
+- Letting the knee drift forward and the back arch to reach further.
+- Pulling the heel hard into the glute and cranking the knee.
+- Hunching or leaning far forward to grab the foot.
+
+## Progression
+
+Hold a wall or chair lightly → free-standing for balance → add a slight
+forward hinge of the trunk to deepen the hip-flexor component.
diff --git a/Exercise Library/Standing Quad Stretch/motion.json b/Exercise Library/Standing Quad Stretch/motion.json
new file mode 100644
index 0000000..a3a2227
--- /dev/null
+++ b/Exercise Library/Standing Quad Stretch/motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Standing Quad Stretch",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 64], "pitch": 2},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": -30, "elbow_r": 40,
+ "shoulder_l": {"flexion": 118, "abduction": 12}, "elbow_l": 12,
+ "hip_r": -6, "knee_r": 120, "ankle_r": -30,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_l": [162, 150]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [160, 64], "pitch": 2},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": -46, "elbow_r": 72,
+ "shoulder_l": {"flexion": 122, "abduction": 14}, "elbow_l": 10,
+ "hip_r": -8, "knee_r": 145, "ankle_r": -48,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_l": [162, 150], "foot_r": [154, 38], "hand_r": [156, 36]}
+ }
+ ]
+}
diff --git a/Exercise Library/Standing Quad Stretch/preview.gif b/Exercise Library/Standing Quad Stretch/preview.gif
new file mode 100644
index 0000000..29126b1
Binary files /dev/null and b/Exercise Library/Standing Quad Stretch/preview.gif differ
diff --git a/Exercise Library/Standing Quad Stretch/visual.svg b/Exercise Library/Standing Quad Stretch/visual.svg
new file mode 100644
index 0000000..5333973
--- /dev/null
+++ b/Exercise Library/Standing Quad Stretch/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Standing Side Bend/frames/frame-1.svg b/Exercise Library/Standing Side Bend/frames/frame-1.svg
new file mode 100644
index 0000000..fab651d
--- /dev/null
+++ b/Exercise Library/Standing Side Bend/frames/frame-1.svg
@@ -0,0 +1,18 @@
+
diff --git a/Exercise Library/Standing Side Bend/frames/frame-2.svg b/Exercise Library/Standing Side Bend/frames/frame-2.svg
new file mode 100644
index 0000000..3fb0280
--- /dev/null
+++ b/Exercise Library/Standing Side Bend/frames/frame-2.svg
@@ -0,0 +1,18 @@
+
diff --git a/Exercise Library/Standing Side Bend/frames/frame-3.svg b/Exercise Library/Standing Side Bend/frames/frame-3.svg
new file mode 100644
index 0000000..f85e7b9
--- /dev/null
+++ b/Exercise Library/Standing Side Bend/frames/frame-3.svg
@@ -0,0 +1,18 @@
+
diff --git a/Exercise Library/Standing Side Bend/frames/frame-4.svg b/Exercise Library/Standing Side Bend/frames/frame-4.svg
new file mode 100644
index 0000000..3fb0280
--- /dev/null
+++ b/Exercise Library/Standing Side Bend/frames/frame-4.svg
@@ -0,0 +1,18 @@
+
diff --git a/Exercise Library/Standing Side Bend/info.md b/Exercise Library/Standing Side Bend/info.md
new file mode 100644
index 0000000..a63745e
--- /dev/null
+++ b/Exercise Library/Standing Side Bend/info.md
@@ -0,0 +1,40 @@
+# Standing Side Bend
+
+Reach one arm overhead and lean to the opposite side, alternating, to lengthen
+the side body and open the ribs and lats.
+
+- **Category:** Mobility / warm-up
+- **Type:** Lateral flexion mobility
+- **Targets:** Obliques, quadratus lumborum, lats
+- **Prescription:** 8 slow bends to each side, reaching long
+- **Defaults:** 2 × 8 bodyweight
+
+## Setup
+
+Stand tall, feet hip-width, one arm relaxed and the other ready to reach
+overhead.
+
+## Execution
+
+1. Raise one arm overhead and reach it up and over as you bend to the opposite
+ side.
+2. Feel a long stretch down the whole reaching side; keep both feet planted.
+3. Return to tall through center, then reach the other arm over and bend the
+ other way.
+
+## Cues
+
+- Reach up and over — think length, not a sideways crunch.
+- Keep the hips level and both feet flat on the floor.
+- Bend straight to the side; don't twist or lean forward.
+
+## Common Mistakes
+
+- Collapsing down into the bend instead of reaching long.
+- Shoving the hips out to the side to counterbalance.
+- Rotating the trunk forward out of the pure side bend.
+
+## Progression
+
+Short range → full reach-and-over → add a brief hold at the end range on each
+side.
diff --git a/Exercise Library/Standing Side Bend/motion.json b/Exercise Library/Standing Side Bend/motion.json
new file mode 100644
index 0000000..052b171
--- /dev/null
+++ b/Exercise Library/Standing Side Bend/motion.json
@@ -0,0 +1,52 @@
+{
+ "name": "Standing Side Bend",
+ "primary": 1,
+ "camera": {"yaw": 90, "zoom": 0.66},
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 0.5, "tween": 1.0,
+ "root": {"pos": [160, 72]},
+ "spine": [{"lateral": 16}, {"lateral": 15}],
+ "neck": 0,
+ "shoulder_l": {"flexion": 14, "abduction": 126}, "elbow_l": 50,
+ "shoulder_r": {"flexion": 4, "abduction": 8}, "elbow_r": 14,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [155, 150], "foot_l": [165, 150]}
+ },
+ {
+ "hold": 0.3, "tween": 0.9,
+ "root": {"pos": [160, 72]},
+ "spine": [{"lateral": 0}, {"lateral": 0}],
+ "neck": 0,
+ "shoulder_l": {"flexion": 4, "abduction": 8}, "elbow_l": 14,
+ "shoulder_r": {"flexion": 4, "abduction": 8}, "elbow_r": 14,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [155, 150], "foot_l": [165, 150]}
+ },
+ {
+ "hold": 0.5, "tween": 1.0,
+ "root": {"pos": [160, 72]},
+ "spine": [{"lateral": -16}, {"lateral": -15}],
+ "neck": 0,
+ "shoulder_r": {"flexion": 14, "abduction": 126}, "elbow_r": 50,
+ "shoulder_l": {"flexion": 4, "abduction": 8}, "elbow_l": 14,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [155, 150], "foot_l": [165, 150]}
+ },
+ {
+ "hold": 0.3, "tween": 0.9,
+ "root": {"pos": [160, 72]},
+ "spine": [{"lateral": 0}, {"lateral": 0}],
+ "neck": 0,
+ "shoulder_l": {"flexion": 4, "abduction": 8}, "elbow_l": 14,
+ "shoulder_r": {"flexion": 4, "abduction": 8}, "elbow_r": 14,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [155, 150], "foot_l": [165, 150]}
+ }
+ ]
+}
diff --git a/Exercise Library/Standing Side Bend/orbit.gif b/Exercise Library/Standing Side Bend/orbit.gif
new file mode 100644
index 0000000..1ca9ef8
Binary files /dev/null and b/Exercise Library/Standing Side Bend/orbit.gif differ
diff --git a/Exercise Library/Standing Side Bend/preview.gif b/Exercise Library/Standing Side Bend/preview.gif
new file mode 100644
index 0000000..e1ea39c
Binary files /dev/null and b/Exercise Library/Standing Side Bend/preview.gif differ
diff --git a/Exercise Library/Standing Side Bend/visual.svg b/Exercise Library/Standing Side Bend/visual.svg
new file mode 100644
index 0000000..fab651d
--- /dev/null
+++ b/Exercise Library/Standing Side Bend/visual.svg
@@ -0,0 +1,18 @@
+
diff --git a/Exercise Library/Torso Twist/frames/frame-1.svg b/Exercise Library/Torso Twist/frames/frame-1.svg
new file mode 100644
index 0000000..0f17f39
--- /dev/null
+++ b/Exercise Library/Torso Twist/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Torso Twist/frames/frame-2.svg b/Exercise Library/Torso Twist/frames/frame-2.svg
new file mode 100644
index 0000000..50c5f6c
--- /dev/null
+++ b/Exercise Library/Torso Twist/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Torso Twist/info.md b/Exercise Library/Torso Twist/info.md
new file mode 100644
index 0000000..349ed59
--- /dev/null
+++ b/Exercise Library/Torso Twist/info.md
@@ -0,0 +1,37 @@
+# Torso Twist
+
+Relaxed standing rotation from side to side, letting the arms swing freely, to
+warm the spine and obliques before lifting.
+
+- **Category:** Mobility / warm-up
+- **Type:** Spinal rotation
+- **Targets:** Obliques, thoracic spine, lower back
+- **Prescription:** 10 easy twists to each side, arms loose
+- **Defaults:** 2 × 10 bodyweight
+
+## Setup
+
+Stand with feet shoulder-width, knees soft, arms hanging loose.
+
+## Execution
+
+1. Turn the trunk gently to one side, letting the arms swing across the body.
+2. Let that momentum carry you back through center to the other side.
+3. Keep a smooth, relaxed rhythm turning side to side.
+
+## Cues
+
+- Let the arms be floppy — they trail the twist, they don't drive it.
+- Rotate from the waist and mid-back while the hips stay mostly forward.
+- Keep the neck loose and let the head follow the shoulders.
+
+## Common Mistakes
+
+- Yanking the arms to force more rotation.
+- Letting the feet peel off the floor as you turn.
+- Twisting so hard the low back pinches.
+
+## Progression
+
+Small easy twists → fuller rotation → slow, controlled turns with a brief pause
+at each end.
diff --git a/Exercise Library/Torso Twist/motion.json b/Exercise Library/Torso Twist/motion.json
new file mode 100644
index 0000000..7e168bc
--- /dev/null
+++ b/Exercise Library/Torso Twist/motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Torso Twist",
+ "primary": 1,
+ "camera": {"yaw": 90, "zoom": 0.7},
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 0.3, "tween": 1.1,
+ "root": {"pos": [160, 64]},
+ "spine": [{"rotation": 18}, {"rotation": 14}],
+ "neck": {"rotation": -8},
+ "shoulder_r": 40, "elbow_r": 22,
+ "shoulder_l": 40, "elbow_l": 22,
+ "hip_r": 2, "knee_r": 3, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 3, "ankle_l": 0,
+ "pins": {"foot_r": [151, 150], "foot_l": [169, 150]}
+ },
+ {
+ "hold": 0.3, "tween": 1.1,
+ "root": {"pos": [160, 64]},
+ "spine": [{"rotation": -18}, {"rotation": -14}],
+ "neck": {"rotation": 8},
+ "shoulder_r": 40, "elbow_r": 22,
+ "shoulder_l": 40, "elbow_l": 22,
+ "hip_r": 2, "knee_r": 3, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 3, "ankle_l": 0,
+ "pins": {"foot_r": [151, 150], "foot_l": [169, 150]}
+ }
+ ]
+}
diff --git a/Exercise Library/Torso Twist/orbit.gif b/Exercise Library/Torso Twist/orbit.gif
new file mode 100644
index 0000000..547e092
Binary files /dev/null and b/Exercise Library/Torso Twist/orbit.gif differ
diff --git a/Exercise Library/Torso Twist/preview.gif b/Exercise Library/Torso Twist/preview.gif
new file mode 100644
index 0000000..1eb7d25
Binary files /dev/null and b/Exercise Library/Torso Twist/preview.gif differ
diff --git a/Exercise Library/Torso Twist/visual.svg b/Exercise Library/Torso Twist/visual.svg
new file mode 100644
index 0000000..0f17f39
--- /dev/null
+++ b/Exercise Library/Torso Twist/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Scripts/generate_starter_splits.swift b/Scripts/generate_starter_splits.swift
index 27198de..8b31802 100644
--- a/Scripts/generate_starter_splits.swift
+++ b/Scripts/generate_starter_splits.swift
@@ -49,7 +49,7 @@ struct ExerciseDocument: Codable {
var order: Int
var sets: Int
var reps: Int
- var weight: Int
+ var weight: Double
var loadType: Int
var durationSeconds: Int
var machineSettings: [MachineSetting]? = nil
@@ -73,7 +73,7 @@ struct SplitDocument: Codable {
// `machine: true` emits `machineSettings: []` — marks the exercise machine-based
// (empty = nothing recorded yet), which lights up the machine-settings UI without
// the user having to flip the editor toggle first.
-struct Ex { let name: String; var weight = 0; var sets = 4; var reps = 10; var load = 1; var dur = 0; var machine = false }
+struct Ex { let name: String; var weight: Double = 0; var sets = 4; var reps = 10; var load = 1; var dur = 0; var machine = false }
struct Sp { let name: String; let color: String; let icon: String; let activity: Int; let ex: [Ex] }
let seeds: [Sp] = [
@@ -108,6 +108,73 @@ let seeds: [Sp] = [
Ex(name: "Crunch", sets: 3, reps: 12, load: 0),
Ex(name: "Reverse Crunch", sets: 3, reps: 12, load: 0),
]),
+ Sp(name: "Full Body Machines", color: "purple", icon: "figure.strengthtraining.traditional", activity: 0, ex: [
+ Ex(name: "Leg Press", weight: 100, machine: true),
+ Ex(name: "Chest Press", weight: 40, machine: true),
+ Ex(name: "Seated Row", weight: 70, machine: true),
+ Ex(name: "Shoulder Press", weight: 30, machine: true),
+ Ex(name: "Lat Pull Down", weight: 80, machine: true),
+ Ex(name: "Abdominal", weight: 40, machine: true),
+ ]),
+ Sp(name: "Free Weight Basics", color: "red", icon: "dumbbell.fill", activity: 0, ex: [
+ Ex(name: "Goblet Squat", weight: 25, sets: 3, reps: 10),
+ Ex(name: "Dumbbell Bench Press", weight: 25, sets: 3, reps: 8),
+ Ex(name: "Dumbbell Row", weight: 30, sets: 3, reps: 8),
+ Ex(name: "Dumbbell Shoulder Press", weight: 20, sets: 3, reps: 8),
+ Ex(name: "Romanian Deadlift", weight: 65, sets: 3, reps: 8),
+ Ex(name: "Dumbbell Curl", weight: 20, sets: 3, reps: 10),
+ ]),
+ Sp(name: "Upper Body Warm-Up", color: "cyan", icon: "figure.arms.open", activity: 1, ex: [
+ Ex(name: "Arm Circles", sets: 2, reps: 10, load: 0),
+ Ex(name: "Torso Twist", sets: 2, reps: 10, load: 0),
+ Ex(name: "Standing Side Bend", sets: 2, reps: 8, load: 0),
+ Ex(name: "Cat-Cow", sets: 1, reps: 8, load: 0),
+ Ex(name: "Push-Up", sets: 2, reps: 8, load: 0),
+ ]),
+ Sp(name: "Lower Body Warm-Up", color: "mint", icon: "figure.walk", activity: 1, ex: [
+ Ex(name: "March in Place", sets: 1, reps: 0, load: 2, dur: 60),
+ Ex(name: "Leg Swings", sets: 2, reps: 10, load: 0),
+ Ex(name: "Hip Circles", sets: 2, reps: 8, load: 0),
+ Ex(name: "Bodyweight Squat", sets: 2, reps: 12, load: 0),
+ Ex(name: "Glute Bridge", sets: 2, reps: 10, load: 0),
+ Ex(name: "Standing Calf Raise", sets: 2, reps: 12, load: 0),
+ ]),
+ Sp(name: "Morning Wake-Up", color: "yellow", icon: "sun.max.fill", activity: 1, ex: [
+ Ex(name: "March in Place", sets: 1, reps: 0, load: 2, dur: 45),
+ Ex(name: "Neck Rolls", sets: 1, reps: 5, load: 0),
+ Ex(name: "Arm Circles", sets: 1, reps: 10, load: 0),
+ Ex(name: "Torso Twist", sets: 1, reps: 10, load: 0),
+ Ex(name: "Standing Side Bend", sets: 1, reps: 8, load: 0),
+ Ex(name: "Hip Circles", sets: 1, reps: 8, load: 0),
+ Ex(name: "Leg Swings", sets: 1, reps: 10, load: 0),
+ Ex(name: "Standing Calf Raise", sets: 1, reps: 12, load: 0),
+ Ex(name: "Standing Forward Fold", sets: 1, reps: 0, load: 2, dur: 30),
+ ]),
+ Sp(name: "Morning Mobility", color: "pink", icon: "figure.yoga", activity: 1, ex: [
+ Ex(name: "Cat-Cow", sets: 1, reps: 10, load: 0),
+ Ex(name: "Bird Dog", sets: 1, reps: 8, load: 0),
+ Ex(name: "Dead Bug", sets: 1, reps: 8, load: 0),
+ Ex(name: "Glute Bridge", sets: 1, reps: 12, load: 0),
+ Ex(name: "Cobra Stretch", sets: 1, reps: 8, load: 0),
+ Ex(name: "Child's Pose", sets: 1, reps: 0, load: 2, dur: 45),
+ Ex(name: "Standing Forward Fold", sets: 1, reps: 0, load: 2, dur: 30),
+ ]),
+ Sp(name: "Full Body Stretch", color: "brown", icon: "figure.flexibility", activity: 1, ex: [
+ Ex(name: "Standing Forward Fold", sets: 1, reps: 0, load: 2, dur: 30),
+ Ex(name: "Standing Quad Stretch", sets: 2, reps: 0, load: 2, dur: 30),
+ Ex(name: "Standing Calf Stretch", sets: 2, reps: 0, load: 2, dur: 30),
+ Ex(name: "Chest Opener", sets: 1, reps: 0, load: 2, dur: 30),
+ Ex(name: "Overhead Triceps Stretch", sets: 2, reps: 0, load: 2, dur: 30),
+ Ex(name: "Kneeling Hip Flexor Stretch", sets: 2, reps: 0, load: 2, dur: 30),
+ Ex(name: "Child's Pose", sets: 1, reps: 0, load: 2, dur: 45),
+ ]),
+ Sp(name: "Evening Stretch", color: "indigo", icon: "figure.mind.and.body", activity: 1, ex: [
+ Ex(name: "Cat-Cow", sets: 1, reps: 10, load: 0),
+ Ex(name: "Butterfly Stretch", sets: 1, reps: 0, load: 2, dur: 45),
+ Ex(name: "Kneeling Hip Flexor Stretch", sets: 2, reps: 0, load: 2, dur: 30),
+ Ex(name: "Cobra Stretch", sets: 1, reps: 8, load: 0),
+ Ex(name: "Child's Pose", sets: 1, reps: 0, load: 2, dur: 45),
+ ]),
]
// MARK: - Emit
@@ -123,7 +190,7 @@ try FileManager.default.createDirectory(at: outDir, withIntermediateDirectories:
for (order, sp) in seeds.enumerated() {
let slug = sp.name.lowercased().replacingOccurrences(of: " ", with: "-")
let doc = SplitDocument(
- schemaVersion: 2,
+ schemaVersion: 3,
id: deterministicULID(label: "starter.\(slug)"),
name: sp.name, color: sp.color, systemImage: sp.icon, order: order,
createdAt: fixedDate, updatedAt: fixedDate,
diff --git a/Workouts/Resources/ExerciseMotions/Arm Circles.info.md b/Workouts/Resources/ExerciseMotions/Arm Circles.info.md
new file mode 100644
index 0000000..0d395a5
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Arm Circles.info.md
@@ -0,0 +1,38 @@
+# Arm Circles
+
+Big, slow circles of both arms together to warm the shoulders, wake up the
+rotator cuff, and open the chest before pressing or pulling.
+
+- **Category:** Mobility / warm-up
+- **Type:** Shoulder mobility
+- **Targets:** Deltoids, rotator cuff, upper back
+- **Prescription:** 10 slow backward circles, then 10 forward
+- **Defaults:** 2 × 10 bodyweight
+
+## Setup
+
+Stand tall, feet shoulder-width, arms relaxed at your sides.
+
+## Execution
+
+1. Reach both arms forward and up until they pass overhead.
+2. Carry them back and down behind you, tracing the biggest circle you can.
+3. Sweep them low and forward again to begin the next circle.
+4. Complete the set, then circle in the opposite direction.
+
+## Cues
+
+- Keep the arms long — draw the circle from the shoulder, not the elbow.
+- Stand tall; don't let the low back arch as the arms pass overhead.
+- Keep the tempo slow and even, breathing throughout.
+
+## Common Mistakes
+
+- Tiny, rushed circles instead of full, slow ones.
+- Shrugging the shoulders toward the ears at the top.
+- Arching the low back to force the arms higher.
+
+## Progression
+
+Small circles → full-range circles → slow both directions → pause briefly with
+the arms overhead each rep.
diff --git a/Workouts/Resources/ExerciseMotions/Arm Circles.motion.json b/Workouts/Resources/ExerciseMotions/Arm Circles.motion.json
new file mode 100644
index 0000000..728948e
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Arm Circles.motion.json
@@ -0,0 +1,48 @@
+{
+ "name": "Arm Circles",
+ "primary": 2,
+ "camera": {"yaw": 40, "zoom": 0.6},
+ "working": ["arm_r", "arm_l"],
+ "frames": [
+ {
+ "hold": 0.15, "tween": 0.8,
+ "root": {"pos": [160, 66]},
+ "spine": [0, 0], "neck": 2, "head": -4,
+ "shoulder_r": {"flexion": 90, "abduction": 12}, "elbow_r": 5,
+ "shoulder_l": {"flexion": 90, "abduction": 12}, "elbow_l": 5,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.15, "tween": 0.8,
+ "root": {"pos": [160, 66]},
+ "spine": [0, 0], "neck": 2, "head": -4,
+ "shoulder_r": {"flexion": 172, "abduction": 30}, "elbow_r": 5,
+ "shoulder_l": {"flexion": 172, "abduction": 30}, "elbow_l": 5,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.15, "tween": 0.8,
+ "root": {"pos": [160, 66]},
+ "spine": [0, 0], "neck": 2, "head": -4,
+ "shoulder_r": {"flexion": 90, "abduction": 92}, "elbow_r": 5,
+ "shoulder_l": {"flexion": 90, "abduction": 92}, "elbow_l": 5,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.15, "tween": 0.8,
+ "root": {"pos": [160, 66]},
+ "spine": [0, 0], "neck": 2, "head": -4,
+ "shoulder_r": {"flexion": 8, "abduction": 22}, "elbow_r": 5,
+ "shoulder_l": {"flexion": 8, "abduction": 22}, "elbow_l": 5,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Butterfly Stretch.info.md b/Workouts/Resources/ExerciseMotions/Butterfly Stretch.info.md
new file mode 100644
index 0000000..6619d12
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Butterfly Stretch.info.md
@@ -0,0 +1,40 @@
+# Butterfly Stretch
+
+Sit tall, press the soles of the feet together, and let the knees fall open to
+release the inner thighs and hips. A gentle seated opener for tight groins
+after squatting, running, or a long day in a chair.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Inner thighs (adductors, groin), hips
+- **Prescription:** Hold 45 s, letting the knees settle a little lower with each breath
+- **Defaults:** 1 × 45 s
+
+## Setup
+
+Sit on the floor with a tall spine. Bring the soles of the feet together and
+draw the heels in toward the pelvis, letting the knees drop out to the sides.
+
+## Execution
+
+1. Hold the feet or ankles and lengthen up through the crown of the head.
+2. Let the knees relax open and down toward the floor under their own weight.
+3. Hinge gently forward from the hips to deepen the stretch.
+4. Breathe slowly, easing a little lower on each exhale.
+
+## Cues
+
+- Lead the forward lean from the hips, keeping the chest open and the back long.
+- Let gravity lower the knees — don't force them down with the hands.
+- Draw the heels closer to the pelvis for more inner-thigh, further away for less.
+
+## Common Mistakes
+
+- Rounding the back to reach the feet instead of hinging at the hips.
+- Bouncing the knees to push the range.
+- Pulling hard on the feet and yanking the knees toward the floor.
+
+## Progression
+
+Heels further from the pelvis → heels drawn closer for a deeper groin stretch →
+gentle forward fold over the legs, resting the forearms toward the floor.
diff --git a/Workouts/Resources/ExerciseMotions/Butterfly Stretch.motion.json b/Workouts/Resources/ExerciseMotions/Butterfly Stretch.motion.json
new file mode 100644
index 0000000..cd1bee3
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Butterfly Stretch.motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Butterfly Stretch",
+ "primary": 2,
+ "camera": {"yaw": 52},
+ "working": ["leg_r", "leg_l"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 118], "pitch": 4},
+ "spine": [20, 18],
+ "neck": 12, "head": -14,
+ "shoulder_r": {"flexion": 94, "abduction": 12}, "elbow_r": 40,
+ "shoulder_l": {"flexion": 94, "abduction": 12}, "elbow_l": 40,
+ "hip_r": {"flexion": 82, "abduction": 38, "rotation": 44}, "knee_r": 108,
+ "hip_l": {"flexion": 82, "abduction": 38, "rotation": 44}, "knee_l": 108,
+ "pins": {"hand_r": [178, 158], "hand_l": [198, 159]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [160, 118], "pitch": 4},
+ "spine": [26, 24],
+ "neck": 14, "head": -16,
+ "shoulder_r": {"flexion": 98, "abduction": 12}, "elbow_r": 34,
+ "shoulder_l": {"flexion": 98, "abduction": 12}, "elbow_l": 34,
+ "hip_r": {"flexion": 82, "abduction": 44, "rotation": 46}, "knee_r": 110,
+ "hip_l": {"flexion": 82, "abduction": 44, "rotation": 46}, "knee_l": 110,
+ "pins": {"hand_r": [176, 159], "hand_l": [200, 160]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Chest Opener.info.md b/Workouts/Resources/ExerciseMotions/Chest Opener.info.md
new file mode 100644
index 0000000..bfa0cdd
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Chest Opener.info.md
@@ -0,0 +1,44 @@
+# Chest Opener
+
+Stand tall, clasp the hands behind the back, and lift the chest to peel open
+the front of the shoulders and pecs — the antidote to a day rounded over a
+desk or a phone.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Chest (pectorals), front of the shoulders, biceps
+- **Prescription:** Hold 30 s, breathing wide into the chest, then release and repeat once
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Stand tall with the feet hip-width and the knees soft. Reach both arms behind
+the low back and interlace the fingers, palms together.
+
+## Execution
+
+1. Draw the shoulder blades down and together and straighten the elbows as far
+ as is comfortable.
+2. Lift the clasped hands gently away from the body until you feel the chest
+ open.
+3. Raise the breastbone and let the gaze drift slightly upward.
+4. Hold and breathe wide into the front of the chest, then release slowly.
+
+## Cues
+
+- Lead with the chest, not the chin — length before lift.
+- Keep the shoulders drawing down away from the ears.
+- Squeeze the shoulder blades together to deepen the stretch instead of
+ cranking the arms up.
+
+## Common Mistakes
+
+- Shrugging the shoulders up toward the ears.
+- Arching hard through the low back instead of opening the chest.
+- Yanking the hands higher than the shoulders can comfortably allow.
+
+## Progression
+
+Hands lower on the back with straighter elbows → clasp a strap and walk the
+hands closer → hinge forward with the arms rising overhead for a deeper pec and
+shoulder stretch.
diff --git a/Workouts/Resources/ExerciseMotions/Chest Opener.motion.json b/Workouts/Resources/ExerciseMotions/Chest Opener.motion.json
new file mode 100644
index 0000000..2147024
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Chest Opener.motion.json
@@ -0,0 +1,31 @@
+{
+ "name": "Chest Opener",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["arm_r", "arm_l", "spine"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 66], "pitch": 2},
+ "spine": [-1, -1],
+ "neck": -2, "head": -6,
+ "shoulder_r": -26, "elbow_r": 34,
+ "shoulder_l": -26, "elbow_l": 34,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [158, 150], "foot_l": [162, 150]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [160, 66], "pitch": -4},
+ "spine": [-6, -6],
+ "neck": -11, "head": -15,
+ "shoulder_r": -55, "elbow_r": 20,
+ "shoulder_l": -55, "elbow_l": 20,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [158, 150], "foot_l": [162, 150],
+ "hand_r": [150, 41], "hand_l": [154, 42]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Child's Pose.info.md b/Workouts/Resources/ExerciseMotions/Child's Pose.info.md
new file mode 100644
index 0000000..36e8d71
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Child's Pose.info.md
@@ -0,0 +1,40 @@
+# Child's Pose
+
+A restful kneeling fold that decompresses the spine and settles the breath —
+the reset between harder efforts, or the quiet close to a morning routine.
+
+- **Category:** Mobility / warm-up
+- **Type:** Spinal decompression (timed hold)
+- **Targets:** Lower back, hips, thighs, shoulders
+- **Prescription:** Hold for 30 s, breathing slowly into the back of the ribs, then repeat once
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Kneel with the knees about hip-width and the big toes together, then sit the
+hips back toward the heels.
+
+## Execution
+
+1. Walk the hands forward and fold the chest down over the thighs.
+2. Stretch the arms long on the floor overhead and rest the forehead on the mat.
+3. Let the weight sink back toward the heels and the hips grow heavy.
+4. Breathe slowly into the back of the ribs, lengthening a little with each
+ exhale.
+
+## Cues
+
+- Reach the fingertips forward and the hips back to grow long through the spine.
+- Let the belly rest between the thighs so the breath can slow.
+- Keep the forehead heavy and the neck completely relaxed.
+
+## Common Mistakes
+
+- Holding tension in the shoulders instead of letting them melt down.
+- Lifting the hips away from the heels and losing the settle.
+- Forcing the range and gripping the low back rather than releasing it.
+
+## Progression
+
+Knees together for a deeper fold, or wide knees to let the chest sink lower →
+add a side-reach (walk the hands to each side) to open the lats
diff --git a/Workouts/Resources/ExerciseMotions/Child's Pose.motion.json b/Workouts/Resources/ExerciseMotions/Child's Pose.motion.json
new file mode 100644
index 0000000..f146115
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Child's Pose.motion.json
@@ -0,0 +1,29 @@
+{
+ "name": "Child's Pose",
+ "primary": 2,
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 2.4, "tween": 2.0,
+ "root": {"pos": [201, 108], "yaw": 180, "pitch": 89},
+ "spine": [15, 20],
+ "neck": 15, "head": -13,
+ "shoulder_r": 168, "elbow_r": 8,
+ "shoulder_l": 168, "elbow_l": 8,
+ "hip_r": 86, "knee_r": 104, "ankle_r": -52,
+ "hip_l": 86, "knee_l": 104, "ankle_l": -52,
+ "pins": {"hand_r": [80, 150], "hand_l": [84, 151]}
+ },
+ {
+ "hold": 2.6, "tween": 2.0,
+ "root": {"pos": [202, 110], "yaw": 180, "pitch": 92},
+ "spine": [16, 22],
+ "neck": 17, "head": -15,
+ "shoulder_r": 172, "elbow_r": 6,
+ "shoulder_l": 172, "elbow_l": 6,
+ "hip_r": 90, "knee_r": 108, "ankle_r": -52,
+ "hip_l": 90, "knee_l": 108, "ankle_l": -52,
+ "pins": {"hand_r": [78, 150], "hand_l": [82, 151]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Cobra Stretch.info.md b/Workouts/Resources/ExerciseMotions/Cobra Stretch.info.md
new file mode 100644
index 0000000..0b6cf1e
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Cobra Stretch.info.md
@@ -0,0 +1,42 @@
+# Cobra Stretch
+
+A gentle prone press-up that opens the front of the body and coaxes the spine
+into extension after a night curled up.
+
+- **Category:** Mobility / warm-up
+- **Type:** Spinal extension mobility
+- **Targets:** Lumbar and thoracic spine, abdominals, chest and hip flexors
+- **Prescription:** 2 sets of 8 slow press-ups, pausing a breath at the top of each
+- **Defaults:** 2 × 8 bodyweight
+
+## Setup
+
+Lie face down with the legs long and the tops of the feet on the floor. Set the
+hands flat under the shoulders, elbows tucked close to the ribs.
+
+## Execution
+
+1. Press the hands lightly into the floor and lengthen the chest forward.
+2. Peel the breastbone off the mat, letting the spine extend one segment at a
+ time.
+3. Keep the hips, pubic bone, and legs pinned to the floor throughout.
+4. Rise only as far as the low back stays comfortable, then lower slowly back
+ to flat.
+
+## Cues
+
+- Lead with the chest, not the chin — length before height.
+- Draw the shoulders down away from the ears.
+- Let the hands share the load; don't hang the whole body weight on the low back.
+
+## Common Mistakes
+
+- Cranking the head back and crunching the neck.
+- Pressing to straight arms and lifting the hips off the mat (that's up-dog, not
+ cobra).
+- Shrugging the shoulders up around the ears.
+
+## Progression
+
+Sphinx (forearms down) → low cobra → full cobra with straighter arms →
+upward-facing dog with the thighs lifted
diff --git a/Workouts/Resources/ExerciseMotions/Cobra Stretch.motion.json b/Workouts/Resources/ExerciseMotions/Cobra Stretch.motion.json
new file mode 100644
index 0000000..ab4c459
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Cobra Stretch.motion.json
@@ -0,0 +1,31 @@
+{
+ "name": "Cobra Stretch",
+ "primary": 2,
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 0.6, "tween": 1.1,
+ "root": {"pos": [188, 147], "yaw": 180, "pitch": 76},
+ "spine": [0, 6],
+ "neck": 6, "head": -46,
+ "shoulder_r": 92, "elbow_r": 100,
+ "shoulder_l": 92, "elbow_l": 100,
+ "hip_r": 0, "knee_r": 0, "ankle_r": -50,
+ "hip_l": 0, "knee_l": 0, "ankle_l": -50,
+ "pins": {"hand_r": [104, 150], "hand_l": [108, 151],
+ "foot_r": [270, 150], "foot_l": [274, 151]}
+ },
+ {
+ "hold": 1.3, "tween": 1.1,
+ "root": {"pos": [188, 147], "yaw": 180, "pitch": 68},
+ "spine": [-13, -16],
+ "neck": -10, "head": -18,
+ "shoulder_r": 95, "elbow_r": 14,
+ "shoulder_l": 95, "elbow_l": 14,
+ "hip_r": 0, "knee_r": 0, "ankle_r": -50,
+ "hip_l": 0, "knee_l": 0, "ankle_l": -50,
+ "pins": {"hand_r": [104, 150], "hand_l": [108, 151],
+ "foot_r": [270, 150], "foot_l": [274, 151]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Hip Circles.info.md b/Workouts/Resources/ExerciseMotions/Hip Circles.info.md
new file mode 100644
index 0000000..d0ee98b
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Hip Circles.info.md
@@ -0,0 +1,37 @@
+# Hip Circles
+
+Hands on the hips, circle the pelvis slowly like a hula-hoop warm-up to loosen
+the hips and low back and prime the whole midsection.
+
+- **Category:** Mobility / warm-up
+- **Type:** Hip mobility
+- **Targets:** Hips, pelvis, lumbar spine
+- **Prescription:** 8 slow circles in each direction
+- **Defaults:** 2 × 8 bodyweight
+
+## Setup
+
+Stand with feet shoulder-width, hands resting on the hips, knees soft.
+
+## Execution
+
+1. Push the hips forward, then around to one side.
+2. Carry them back, then to the other side, tracing one big smooth circle.
+3. Keep the head and shoulders roughly still over the feet as the hips travel.
+4. Complete the circles, then reverse the direction.
+
+## Cues
+
+- Draw the circle with the hips, not the whole body.
+- Keep both feet flat and planted throughout.
+- Let the upper body counter-lean gently so the head stays centered.
+
+## Common Mistakes
+
+- Circling the shoulders instead of the hips.
+- Letting a foot lift as the hips swing across.
+- Rushing — the circle should be slow and even.
+
+## Progression
+
+Small circles → bigger hula-hoop circles → slow tempo in both directions.
diff --git a/Workouts/Resources/ExerciseMotions/Hip Circles.motion.json b/Workouts/Resources/ExerciseMotions/Hip Circles.motion.json
new file mode 100644
index 0000000..2098a41
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Hip Circles.motion.json
@@ -0,0 +1,52 @@
+{
+ "name": "Hip Circles",
+ "primary": 2,
+ "camera": {"yaw": 45, "zoom": 0.7},
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 0.12, "tween": 0.6,
+ "root": {"pos": [160, 72]},
+ "spine": [{"lateral": 0, "flexion": -2}, {"lateral": 0, "flexion": -2}],
+ "neck": 0, "head": 0,
+ "shoulder_r": {"flexion": -8, "abduction": 50}, "elbow_r": 125,
+ "shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
+ "hip_r": 3, "knee_r": 5, "ankle_r": 0,
+ "hip_l": 3, "knee_l": 5, "ankle_l": 0,
+ "pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
+ },
+ {
+ "hold": 0.12, "tween": 0.6,
+ "root": {"pos": [145, 67]},
+ "spine": [{"lateral": 8, "flexion": 0}, {"lateral": 8, "flexion": 0}],
+ "neck": 0, "head": 0,
+ "shoulder_r": {"flexion": -8, "abduction": 50}, "elbow_r": 125,
+ "shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
+ "hip_r": 3, "knee_r": 5, "ankle_r": 0,
+ "hip_l": 3, "knee_l": 5, "ankle_l": 0,
+ "pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
+ },
+ {
+ "hold": 0.12, "tween": 0.6,
+ "root": {"pos": [160, 63]},
+ "spine": [{"lateral": 0, "flexion": 2}, {"lateral": 0, "flexion": 2}],
+ "neck": 0, "head": 0,
+ "shoulder_r": {"flexion": -8, "abduction": 50}, "elbow_r": 125,
+ "shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
+ "hip_r": 3, "knee_r": 5, "ankle_r": 0,
+ "hip_l": 3, "knee_l": 5, "ankle_l": 0,
+ "pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
+ },
+ {
+ "hold": 0.12, "tween": 0.6,
+ "root": {"pos": [175, 67]},
+ "spine": [{"lateral": -8, "flexion": 0}, {"lateral": -8, "flexion": 0}],
+ "neck": 0, "head": 0,
+ "shoulder_r": {"flexion": -8, "abduction": 50}, "elbow_r": 125,
+ "shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
+ "hip_r": 3, "knee_r": 5, "ankle_r": 0,
+ "hip_l": 3, "knee_l": 5, "ankle_l": 0,
+ "pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Kneeling Hip Flexor Stretch.info.md b/Workouts/Resources/ExerciseMotions/Kneeling Hip Flexor Stretch.info.md
new file mode 100644
index 0000000..5f541d9
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Kneeling Hip Flexor Stretch.info.md
@@ -0,0 +1,43 @@
+# Kneeling Hip Flexor Stretch
+
+Drop into a half-kneel and press the hips forward to open the front of the back
+hip. The go-to release for tight hip flexors after long hours of sitting or
+heavy squatting.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Hip flexors, quadriceps, front of the hip
+- **Prescription:** Hold 30 s per side, pressing the hips gently forward
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Kneel on one knee with the other foot planted flat in front, the front knee
+stacked over the ankle at about ninety degrees. Rest the hands on the front
+thigh. Pad the back knee if needed.
+
+## Execution
+
+1. Tuck the tailbone under to flatten the low back.
+2. Ease the hips forward until you feel a stretch across the front of the back
+ hip and thigh.
+3. Keep the trunk tall and the front shin vertical.
+4. Hold and breathe, then switch sides.
+
+## Cues
+
+- Squeeze the glute of the kneeling leg to deepen the hip-flexor stretch.
+- Tuck the tailbone first — don't just arch the low back forward.
+- Keep the front knee tracking over the foot, not caving inward.
+
+## Common Mistakes
+
+- Letting the front knee drift far past the toes.
+- Arching the low back instead of tucking the pelvis and pressing the hips.
+- Leaning the whole torso forward rather than shifting the hips.
+
+## Progression
+
+Hands on the front thigh → reach the same-side arm overhead and lean away for
+a deeper stretch → add a gentle back-foot lift toward the glute to bring in the
+quad.
diff --git a/Workouts/Resources/ExerciseMotions/Kneeling Hip Flexor Stretch.motion.json b/Workouts/Resources/ExerciseMotions/Kneeling Hip Flexor Stretch.motion.json
new file mode 100644
index 0000000..fd570f7
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Kneeling Hip Flexor Stretch.motion.json
@@ -0,0 +1,29 @@
+{
+ "name": "Kneeling Hip Flexor Stretch",
+ "primary": 2,
+ "working": ["leg_l"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 108], "pitch": 4},
+ "spine": [11, 11],
+ "neck": 8, "head": -12,
+ "shoulder_r": 54, "elbow_r": 36,
+ "shoulder_l": 54, "elbow_l": 36,
+ "hip_r": 86, "knee_r": 90, "ankle_r": 6,
+ "hip_l": -16, "knee_l": 74, "ankle_l": -55,
+ "pins": {"foot_r": [206, 150], "hand_r": [202, 112], "hand_l": [206, 114]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [162, 110], "pitch": 6},
+ "spine": [15, 15],
+ "neck": 9, "head": -13,
+ "shoulder_r": 58, "elbow_r": 32,
+ "shoulder_l": 58, "elbow_l": 32,
+ "hip_r": 90, "knee_r": 90, "ankle_r": 6,
+ "hip_l": -28, "knee_l": 56, "ankle_l": -55,
+ "pins": {"foot_r": [210, 150], "hand_r": [206, 110], "hand_l": [210, 112]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Leg Swings.info.md b/Workouts/Resources/ExerciseMotions/Leg Swings.info.md
new file mode 100644
index 0000000..d199798
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Leg Swings.info.md
@@ -0,0 +1,42 @@
+# Leg Swings
+
+Stand on one leg and swing the other freely front to back, letting the hip
+open and close through a growing range. A dynamic mobility drill that loosens
+the hips, hamstrings, and hip flexors before squats, running, or lower-body
+work.
+
+- **Category:** Mobility / warm-up
+- **Type:** Dynamic mobility
+- **Targets:** Hip mobility, hamstrings, hip flexors
+- **Prescription:** 10–12 swings per leg, building range gradually
+- **Defaults:** 2 × 10 bodyweight
+
+## Setup
+
+Balance on one leg, standing tall. Rest a hand on a wall or rail for support
+if you need it, and let the working leg hang loose.
+
+## Execution
+
+1. Swing the free leg forward to a comfortable height, keeping it fairly
+ straight.
+2. Let it swing back through under the hip and behind you.
+3. Keep the torso upright and quiet — the motion is all at the hip.
+4. Swing smoothly for the set, then switch legs.
+
+## Cues
+
+- Move from the hip; don't heave with the low back.
+- Start with small swings and let the range grow rep by rep.
+- Stay tall — resist the urge to fold forward as the leg swings back.
+
+## Common Mistakes
+
+- Arching and rounding the spine to fling the leg higher.
+- Swinging so hard you lose balance and the motion turns jerky.
+- Twisting the torso instead of keeping it square and still.
+
+## Progression
+
+Add side-to-side swings across the body once front-to-back feels smooth, and
+gradually widen the arc as the hip warms up.
diff --git a/Workouts/Resources/ExerciseMotions/Leg Swings.motion.json b/Workouts/Resources/ExerciseMotions/Leg Swings.motion.json
new file mode 100644
index 0000000..691e0d0
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Leg Swings.motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Leg Swings",
+ "primary": 1,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r"],
+ "frames": [
+ {
+ "hold": 0.16, "tween": 0.72,
+ "root": {"pos": [156, 66], "pitch": 5},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 6, "elbow_r": 10,
+ "shoulder_l": 52, "elbow_l": 12,
+ "hip_r": 72, "knee_r": 8, "ankle_r": -4,
+ "hip_l": -2, "knee_l": 3, "ankle_l": 0,
+ "pins": {"foot_l": [168, 150]}
+ },
+ {
+ "hold": 0.16, "tween": 0.72,
+ "root": {"pos": [156, 66], "pitch": 5},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 6, "elbow_r": 10,
+ "shoulder_l": 52, "elbow_l": 12,
+ "hip_r": -28, "knee_r": 5, "ankle_r": -16,
+ "hip_l": -2, "knee_l": 3, "ankle_l": 0,
+ "pins": {"foot_l": [168, 150]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/March in Place.info.md b/Workouts/Resources/ExerciseMotions/March in Place.info.md
new file mode 100644
index 0000000..60da866
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/March in Place.info.md
@@ -0,0 +1,39 @@
+# March in Place
+
+A rhythmic warm-up staple — drive one knee up while the opposite arm swings
+through, then switch, marching on the spot. It wakes the hip flexors, primes
+the calves and ankles, and lifts the heart rate before the real work.
+
+- **Category:** Mobility / warm-up
+- **Type:** Dynamic warm-up
+- **Targets:** Hip flexors, calves, coordination
+- **Prescription:** 30–60 seconds at a steady, controlled cadence
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Stand tall with feet hip-width, arms relaxed at your sides, eyes forward.
+
+## Execution
+
+1. Drive one knee up toward hip height, staying tall through the spine.
+2. Swing the opposite arm forward as the knee rises — natural, like walking.
+3. Plant that foot and lift the other knee, letting the arms switch.
+4. Keep alternating in an even, unhurried rhythm.
+
+## Cues
+
+- Stand tall — no hunching or leaning back to swing the knee up.
+- Opposite arm to opposite knee, the same coordination as walking.
+- Land softly through the whole foot, not with a hard heel strike.
+
+## Common Mistakes
+
+- Shuffling low, barely lifting the knees.
+- Rushing into a stiff, bouncy jog instead of a controlled march.
+- Same-side arm and knee moving together, which kills the rhythm.
+
+## Progression
+
+Lift the knees higher, quicken the cadence, or add a light arm reach overhead
+to turn it into a fuller-body warm-up.
diff --git a/Workouts/Resources/ExerciseMotions/March in Place.motion.json b/Workouts/Resources/ExerciseMotions/March in Place.motion.json
new file mode 100644
index 0000000..8e3f770
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/March in Place.motion.json
@@ -0,0 +1,52 @@
+{
+ "name": "March in Place",
+ "primary": 1,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r", "leg_l"],
+ "frames": [
+ {
+ "hold": 0.18, "tween": 0.42,
+ "root": {"pos": [160, 62], "pitch": 4},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": -28, "elbow_r": 82,
+ "shoulder_l": 34, "elbow_l": 78,
+ "hip_r": 68, "knee_r": 88, "ankle_r": -8,
+ "hip_l": 2, "knee_l": 4, "ankle_l": 0,
+ "pins": {"foot_l": [162, 150]}
+ },
+ {
+ "hold": 0.14, "tween": 0.4,
+ "root": {"pos": [160, 64], "pitch": 4},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 3, "elbow_r": 64,
+ "shoulder_l": 3, "elbow_l": 64,
+ "hip_r": 4, "knee_r": 4, "ankle_r": 0,
+ "hip_l": 4, "knee_l": 4, "ankle_l": 0,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150]}
+ },
+ {
+ "hold": 0.18, "tween": 0.42,
+ "root": {"pos": [160, 62], "pitch": 4},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 34, "elbow_r": 78,
+ "shoulder_l": -28, "elbow_l": 82,
+ "hip_r": 2, "knee_r": 4, "ankle_r": 0,
+ "hip_l": 68, "knee_l": 88, "ankle_l": -8,
+ "pins": {"foot_r": [158, 148]}
+ },
+ {
+ "hold": 0.14, "tween": 0.4,
+ "root": {"pos": [160, 64], "pitch": 4},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 3, "elbow_r": 64,
+ "shoulder_l": 3, "elbow_l": 64,
+ "hip_r": 4, "knee_r": 4, "ankle_r": 0,
+ "hip_l": 4, "knee_l": 4, "ankle_l": 0,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Neck Rolls.info.md b/Workouts/Resources/ExerciseMotions/Neck Rolls.info.md
new file mode 100644
index 0000000..3215820
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Neck Rolls.info.md
@@ -0,0 +1,41 @@
+# Neck Rolls
+
+Slow, gentle circles of the head to loosen the neck and upper spine before
+training or after a long day at a desk.
+
+- **Category:** Mobility / warm-up
+- **Type:** Neck mobility
+- **Targets:** Cervical spine, upper trapezius, levator scapulae
+- **Prescription:** 3–5 slow circles in each direction, stopping short of any pinch
+- **Defaults:** 2 × 5 bodyweight
+
+## Setup
+
+Stand tall, feet hip-width, shoulders relaxed and down, arms hanging quietly at
+your sides.
+
+## Execution
+
+1. Drop the chin toward the chest.
+2. Roll one ear down toward that shoulder, then carry the head back into a
+ gentle look-up.
+3. Bring the other ear toward the far shoulder and back down to the chest — one
+ smooth, continuous circle.
+4. Finish the circles, then reverse the direction.
+
+## Cues
+
+- Move slowly — a single circle should take several seconds.
+- Keep the shoulders down and still; only the head travels.
+- Ease off the moment you feel a pinch, especially at the look-up.
+
+## Common Mistakes
+
+- Whipping the head around quickly.
+- Shrugging a shoulder up to meet the ear.
+- Forcing the range at the top of the circle.
+
+## Progression
+
+Small pain-free arcs → full slow circles → add a brief pause at each ear and at
+the chin tuck.
diff --git a/Workouts/Resources/ExerciseMotions/Neck Rolls.motion.json b/Workouts/Resources/ExerciseMotions/Neck Rolls.motion.json
new file mode 100644
index 0000000..71fc19d
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Neck Rolls.motion.json
@@ -0,0 +1,52 @@
+{
+ "name": "Neck Rolls",
+ "primary": 1,
+ "camera": {"yaw": 35, "zoom": 0.66},
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 0.2, "tween": 0.9,
+ "root": {"pos": [160, 64]},
+ "spine": [0, {"lateral": 0}],
+ "neck": {"flexion": 44, "rotation": 0}, "head": 8,
+ "shoulder_r": 5, "elbow_r": 6,
+ "shoulder_l": 5, "elbow_l": 6,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.2, "tween": 0.9,
+ "root": {"pos": [160, 64]},
+ "spine": [0, {"lateral": 14}],
+ "neck": {"flexion": 6, "rotation": 16}, "head": 0,
+ "shoulder_r": 5, "elbow_r": 6,
+ "shoulder_l": 5, "elbow_l": 6,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.2, "tween": 0.9,
+ "root": {"pos": [160, 64]},
+ "spine": [0, {"lateral": 0}],
+ "neck": {"flexion": -24, "rotation": 0}, "head": -12,
+ "shoulder_r": 5, "elbow_r": 6,
+ "shoulder_l": 5, "elbow_l": 6,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.2, "tween": 0.9,
+ "root": {"pos": [160, 64]},
+ "spine": [0, {"lateral": -14}],
+ "neck": {"flexion": 6, "rotation": -16}, "head": 0,
+ "shoulder_r": 5, "elbow_r": 6,
+ "shoulder_l": 5, "elbow_l": 6,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [156, 150], "foot_l": [164, 150]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Overhead Triceps Stretch.info.md b/Workouts/Resources/ExerciseMotions/Overhead Triceps Stretch.info.md
new file mode 100644
index 0000000..689f475
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Overhead Triceps Stretch.info.md
@@ -0,0 +1,42 @@
+# Overhead Triceps Stretch
+
+Reach one arm overhead and let the hand drop behind the neck, then use the
+other hand to ease the elbow back. A simple way to lengthen the triceps and
+open the underside of the shoulder between pressing sets.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Triceps (back of the upper arm), lats, shoulder
+- **Prescription:** Hold 30 s per side, easing the elbow back gently
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Stand tall with the feet hip-width. Raise one arm overhead and bend the elbow
+so the hand drops down behind the neck.
+
+## Execution
+
+1. Reach the free hand up and rest it on the raised elbow.
+2. Draw the elbow gently back and toward the midline until the triceps
+ lengthens.
+3. Let the trunk lean a touch away from the raised arm to deepen the stretch.
+4. Hold and breathe, then release and switch arms.
+
+## Cues
+
+- Ease the elbow back, not down — coax it, never wrench it.
+- Keep the ribs from flaring by drawing them softly down.
+- Lengthen tall through the spine before adding the side lean.
+
+## Common Mistakes
+
+- Cranking the head forward to meet the arm instead of dropping the hand behind.
+- Flaring the ribs and arching the low back to fake more range.
+- Shrugging the working shoulder up toward the ear.
+
+## Progression
+
+Walk the hand further down the spine → add a gentle side bend away from the
+raised arm → hold a strap between the top and bottom hands to link both
+shoulders.
diff --git a/Workouts/Resources/ExerciseMotions/Overhead Triceps Stretch.motion.json b/Workouts/Resources/ExerciseMotions/Overhead Triceps Stretch.motion.json
new file mode 100644
index 0000000..ed2e7e9
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Overhead Triceps Stretch.motion.json
@@ -0,0 +1,31 @@
+{
+ "name": "Overhead Triceps Stretch",
+ "primary": 2,
+ "camera": {"yaw": 40, "zoom": 0.73},
+ "working": ["arm_r"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 64], "pitch": 2},
+ "spine": [0, 0],
+ "neck": 8, "head": -6,
+ "shoulder_r": {"flexion": 143, "abduction": 10}, "elbow_r": 98,
+ "shoulder_l": {"flexion": 130, "abduction": 6}, "elbow_l": 44,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [158, 150], "foot_l": [162, 150]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [160, 64], "pitch": 2},
+ "spine": [{"lateral": -5}, {"lateral": -5}],
+ "neck": 14, "head": -6,
+ "shoulder_r": {"flexion": 172, "abduction": 10}, "elbow_r": 150,
+ "shoulder_l": {"flexion": 158, "abduction": -6}, "elbow_l": 70,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [158, 150], "foot_l": [162, 150],
+ "hand_l": [164, -51]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Standing Calf Raise.info.md b/Workouts/Resources/ExerciseMotions/Standing Calf Raise.info.md
new file mode 100644
index 0000000..6871747
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Standing Calf Raise.info.md
@@ -0,0 +1,40 @@
+# Standing Calf Raise
+
+Rise onto the balls of both feet, lifting the heels as high as they'll go,
+then lower under control. The simplest way to train the calves and strengthen
+the ankles — no equipment, just bodyweight and a slow tempo.
+
+- **Category:** Mobility / warm-up
+- **Type:** Bodyweight calf raise
+- **Targets:** Gastrocnemius, soleus, ankle stability
+- **Prescription:** 2–3 × 15–20, slow up and down with a pause at the top
+- **Defaults:** 3 × 15 bodyweight
+
+## Setup
+
+Stand tall with feet hip-width, weight even across both feet. Rest a hand on
+a wall for balance if needed.
+
+## Execution
+
+1. Press through the balls of the feet and lift both heels as high as you can.
+2. Pause for a beat at the top, standing tall on your toes.
+3. Lower the heels slowly back to the floor under control.
+4. Repeat for the set without bouncing off the bottom.
+
+## Cues
+
+- Push all the way up to a full stretch at the top of each rep.
+- Keep the knees straight but soft, so the calves do the work.
+- Lower slowly — the descent builds as much strength as the lift.
+
+## Common Mistakes
+
+- Short, bouncy reps that never reach a full heel lift.
+- Rolling the weight to the outside of the feet.
+- Bending the knees to bob up instead of driving through the ankles.
+
+## Progression
+
+Pause longer at the top, slow the lowering phase, then progress to single-leg
+raises or add load with a dumbbell or a step for extra range.
diff --git a/Workouts/Resources/ExerciseMotions/Standing Calf Raise.motion.json b/Workouts/Resources/ExerciseMotions/Standing Calf Raise.motion.json
new file mode 100644
index 0000000..d54574c
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Standing Calf Raise.motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Standing Calf Raise",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r", "leg_l"],
+ "frames": [
+ {
+ "hold": 0.3, "tween": 0.6,
+ "root": {"pos": [160, 64], "pitch": 2},
+ "spine": [0, 0],
+ "neck": 2, "head": -4,
+ "shoulder_r": 4, "elbow_r": 6,
+ "shoulder_l": 4, "elbow_l": 6,
+ "hip_r": 4, "knee_r": 4, "ankle_r": 0,
+ "hip_l": 4, "knee_l": 4, "ankle_l": 0,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150]}
+ },
+ {
+ "hold": 0.4, "tween": 0.9,
+ "root": {"pos": [160, 55], "pitch": 2},
+ "spine": [0, 0],
+ "neck": 2, "head": -4,
+ "shoulder_r": 4, "elbow_r": 6,
+ "shoulder_l": 4, "elbow_l": 6,
+ "hip_r": 4, "knee_r": 3, "ankle_r": -48,
+ "hip_l": 4, "knee_l": 3, "ankle_l": -48,
+ "pins": {"foot_r": [158, 139], "foot_l": [162, 141]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Standing Calf Stretch.info.md b/Workouts/Resources/ExerciseMotions/Standing Calf Stretch.info.md
new file mode 100644
index 0000000..8292db5
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Standing Calf Stretch.info.md
@@ -0,0 +1,41 @@
+# Standing Calf Stretch
+
+A staggered-stance lean that lengthens the back calf: press the rear heel into
+the floor with the leg long while the front knee bends and the hips travel
+forward. The classic wall or curb stretch, done anywhere.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Calf (gastrocnemius, soleus), Achilles tendon
+- **Prescription:** Hold 30 s per side, keeping the back heel pinned down
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Stand in a split stance, one foot a stride behind the other, both toes pointing
+forward. Rest the hands on the front thigh.
+
+## Execution
+
+1. Straighten the back leg and press its heel flat into the floor.
+2. Bend the front knee and ease the hips forward until the back calf lengthens.
+3. Keep the back knee straight and the rear foot pointing straight ahead.
+4. Hold, breathing easily, then switch sides.
+
+## Cues
+
+- Drive the back heel down — the stretch lives in keeping it planted.
+- Point the back toes forward, not turned out, to load the calf evenly.
+- Move the hips forward for more; don't collapse the back knee.
+
+## Common Mistakes
+
+- Letting the back heel lift, which cuts off the stretch.
+- Turning the back foot out to cheat more range.
+- Rounding the back instead of hinging the hips forward.
+
+## Progression
+
+Bend the back knee slightly to shift the stretch to the lower soleus →
+drop the back heel off a step or curb for a deeper range → hold longer as the
+ankle mobility improves.
diff --git a/Workouts/Resources/ExerciseMotions/Standing Calf Stretch.motion.json b/Workouts/Resources/ExerciseMotions/Standing Calf Stretch.motion.json
new file mode 100644
index 0000000..7cd97db
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Standing Calf Stretch.motion.json
@@ -0,0 +1,31 @@
+{
+ "name": "Standing Calf Stretch",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_l"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 66], "pitch": 12},
+ "spine": [4, 4],
+ "neck": 6, "head": -10,
+ "shoulder_r": 24, "elbow_r": 42,
+ "shoulder_l": 24, "elbow_l": 42,
+ "hip_r": 22, "knee_r": 22, "ankle_r": 6,
+ "knee_l": 2, "ankle_l": 10,
+ "pins": {"foot_r": [188, 150], "foot_l": [142, 150]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [160, 68], "pitch": 21},
+ "spine": [6, 6],
+ "neck": 9, "head": -17,
+ "shoulder_r": 40, "elbow_r": 34,
+ "shoulder_l": 40, "elbow_l": 34,
+ "hip_r": 44, "knee_r": 46, "ankle_r": 8,
+ "knee_l": 2, "ankle_l": 12,
+ "pins": {"foot_r": [198, 150], "foot_l": [132, 150],
+ "hand_r": [186, 110], "hand_l": [190, 112]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Standing Forward Fold.info.md b/Workouts/Resources/ExerciseMotions/Standing Forward Fold.info.md
new file mode 100644
index 0000000..ca204cf
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Standing Forward Fold.info.md
@@ -0,0 +1,39 @@
+# Standing Forward Fold
+
+Hinge at the hips and round down toward the toes, letting the head and arms
+hang heavy while the back of the legs lengthens. A calming mobility drill that
+decompresses the spine and opens the hamstrings and posterior chain.
+
+- **Category:** Mobility / warm-up
+- **Type:** Standing mobility
+- **Targets:** Hamstrings, low back, posterior chain
+- **Prescription:** 5–8 slow roll-downs, or hold the bottom 20–30 seconds
+- **Defaults:** 2 × 8 bodyweight
+
+## Setup
+
+Stand tall with feet hip-width, knees soft, arms relaxed at your sides.
+
+## Execution
+
+1. Hinge at the hips and begin folding forward, chin tucking toward the chest.
+2. Round down one segment at a time, letting the arms and head hang heavy.
+3. Fold as far as the hamstrings allow — hands drifting toward the floor.
+4. Reverse slowly, stacking the spine back up to standing.
+
+## Cues
+
+- Let gravity do the work; keep the neck and shoulders loose.
+- Soften the knees if the hamstrings clamp down.
+- Feel a stretch, never a sharp pull in the low back.
+
+## Common Mistakes
+
+- Bouncing at the bottom to force more range.
+- Locking the knees hard and straining the low back.
+- Snapping back up instead of rolling through the spine.
+
+## Progression
+
+Deepen the fold as the hamstrings loosen, pause and breathe at the bottom, or
+walk the hands toward the shins for a gentle assisted stretch.
diff --git a/Workouts/Resources/ExerciseMotions/Standing Forward Fold.motion.json b/Workouts/Resources/ExerciseMotions/Standing Forward Fold.motion.json
new file mode 100644
index 0000000..cb9f8da
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Standing Forward Fold.motion.json
@@ -0,0 +1,31 @@
+{
+ "name": "Standing Forward Fold",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r", "leg_l", "spine"],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 1.2,
+ "root": {"pos": [160, 64], "pitch": 5},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 5, "elbow_r": 5,
+ "shoulder_l": 5, "elbow_l": 5,
+ "hip_r": 5, "knee_r": 6, "ankle_r": 0,
+ "hip_l": 5, "knee_l": 6, "ankle_l": 0,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150]}
+ },
+ {
+ "hold": 0.6, "tween": 1.2,
+ "root": {"pos": [147, 66], "pitch": 134},
+ "spine": [11, 13],
+ "neck": 16, "head": -56,
+ "shoulder_r": 90, "elbow_r": 6,
+ "shoulder_l": 90, "elbow_l": 6,
+ "hip_r": 34, "knee_r": 14, "ankle_r": 10,
+ "hip_l": 34, "knee_l": 14, "ankle_l": 10,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150],
+ "hand_r": [159, 151], "hand_l": [163, 152]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Standing Quad Stretch.info.md b/Workouts/Resources/ExerciseMotions/Standing Quad Stretch.info.md
new file mode 100644
index 0000000..d7dc106
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Standing Quad Stretch.info.md
@@ -0,0 +1,42 @@
+# Standing Quad Stretch
+
+Balance on one leg, catch the opposite foot, and draw the heel toward the seat
+to lengthen the front of the thigh. A quick, equipment-free way to loosen the
+quads after running or squatting.
+
+- **Category:** Stretching
+- **Type:** Static stretch (isometric hold)
+- **Targets:** Quadriceps (front of the thigh), hip flexors
+- **Prescription:** Hold 30 s per side, keeping the knees together
+- **Defaults:** 2 × 30 s
+
+## Setup
+
+Stand tall next to a wall for balance if needed. Shift the weight onto one leg
+and bend the other knee, reaching back with the same-side hand to hold the
+foot or ankle.
+
+## Execution
+
+1. Draw the heel gently toward the glute until the front of the thigh
+ lengthens.
+2. Keep the knees pressed together and the thigh pointing straight down.
+3. Stand tall — tuck the tailbone so the low back doesn't arch.
+4. Hold and breathe, then lower the foot and switch sides.
+
+## Cues
+
+- Keep the bent knee pointing at the floor, not flaring out to the side.
+- Squeeze the glute of the stretching leg to add a hip-flexor stretch.
+- Reach the free arm out or up for balance instead of gripping a wall hard.
+
+## Common Mistakes
+
+- Letting the knee drift forward and the back arch to reach further.
+- Pulling the heel hard into the glute and cranking the knee.
+- Hunching or leaning far forward to grab the foot.
+
+## Progression
+
+Hold a wall or chair lightly → free-standing for balance → add a slight
+forward hinge of the trunk to deepen the hip-flexor component.
diff --git a/Workouts/Resources/ExerciseMotions/Standing Quad Stretch.motion.json b/Workouts/Resources/ExerciseMotions/Standing Quad Stretch.motion.json
new file mode 100644
index 0000000..a3a2227
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Standing Quad Stretch.motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Standing Quad Stretch",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r"],
+ "frames": [
+ {
+ "hold": 2.2, "tween": 1.8,
+ "root": {"pos": [160, 64], "pitch": 2},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": -30, "elbow_r": 40,
+ "shoulder_l": {"flexion": 118, "abduction": 12}, "elbow_l": 12,
+ "hip_r": -6, "knee_r": 120, "ankle_r": -30,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_l": [162, 150]}
+ },
+ {
+ "hold": 2.4, "tween": 1.8,
+ "root": {"pos": [160, 64], "pitch": 2},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": -46, "elbow_r": 72,
+ "shoulder_l": {"flexion": 122, "abduction": 14}, "elbow_l": 10,
+ "hip_r": -8, "knee_r": 145, "ankle_r": -48,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_l": [162, 150], "foot_r": [154, 38], "hand_r": [156, 36]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Standing Side Bend.info.md b/Workouts/Resources/ExerciseMotions/Standing Side Bend.info.md
new file mode 100644
index 0000000..a63745e
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Standing Side Bend.info.md
@@ -0,0 +1,40 @@
+# Standing Side Bend
+
+Reach one arm overhead and lean to the opposite side, alternating, to lengthen
+the side body and open the ribs and lats.
+
+- **Category:** Mobility / warm-up
+- **Type:** Lateral flexion mobility
+- **Targets:** Obliques, quadratus lumborum, lats
+- **Prescription:** 8 slow bends to each side, reaching long
+- **Defaults:** 2 × 8 bodyweight
+
+## Setup
+
+Stand tall, feet hip-width, one arm relaxed and the other ready to reach
+overhead.
+
+## Execution
+
+1. Raise one arm overhead and reach it up and over as you bend to the opposite
+ side.
+2. Feel a long stretch down the whole reaching side; keep both feet planted.
+3. Return to tall through center, then reach the other arm over and bend the
+ other way.
+
+## Cues
+
+- Reach up and over — think length, not a sideways crunch.
+- Keep the hips level and both feet flat on the floor.
+- Bend straight to the side; don't twist or lean forward.
+
+## Common Mistakes
+
+- Collapsing down into the bend instead of reaching long.
+- Shoving the hips out to the side to counterbalance.
+- Rotating the trunk forward out of the pure side bend.
+
+## Progression
+
+Short range → full reach-and-over → add a brief hold at the end range on each
+side.
diff --git a/Workouts/Resources/ExerciseMotions/Standing Side Bend.motion.json b/Workouts/Resources/ExerciseMotions/Standing Side Bend.motion.json
new file mode 100644
index 0000000..052b171
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Standing Side Bend.motion.json
@@ -0,0 +1,52 @@
+{
+ "name": "Standing Side Bend",
+ "primary": 1,
+ "camera": {"yaw": 90, "zoom": 0.66},
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 0.5, "tween": 1.0,
+ "root": {"pos": [160, 72]},
+ "spine": [{"lateral": 16}, {"lateral": 15}],
+ "neck": 0,
+ "shoulder_l": {"flexion": 14, "abduction": 126}, "elbow_l": 50,
+ "shoulder_r": {"flexion": 4, "abduction": 8}, "elbow_r": 14,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [155, 150], "foot_l": [165, 150]}
+ },
+ {
+ "hold": 0.3, "tween": 0.9,
+ "root": {"pos": [160, 72]},
+ "spine": [{"lateral": 0}, {"lateral": 0}],
+ "neck": 0,
+ "shoulder_l": {"flexion": 4, "abduction": 8}, "elbow_l": 14,
+ "shoulder_r": {"flexion": 4, "abduction": 8}, "elbow_r": 14,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [155, 150], "foot_l": [165, 150]}
+ },
+ {
+ "hold": 0.5, "tween": 1.0,
+ "root": {"pos": [160, 72]},
+ "spine": [{"lateral": -16}, {"lateral": -15}],
+ "neck": 0,
+ "shoulder_r": {"flexion": 14, "abduction": 126}, "elbow_r": 50,
+ "shoulder_l": {"flexion": 4, "abduction": 8}, "elbow_l": 14,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [155, 150], "foot_l": [165, 150]}
+ },
+ {
+ "hold": 0.3, "tween": 0.9,
+ "root": {"pos": [160, 72]},
+ "spine": [{"lateral": 0}, {"lateral": 0}],
+ "neck": 0,
+ "shoulder_l": {"flexion": 4, "abduction": 8}, "elbow_l": 14,
+ "shoulder_r": {"flexion": 4, "abduction": 8}, "elbow_r": 14,
+ "hip_r": 2, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [155, 150], "foot_l": [165, 150]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/ExerciseMotions/Torso Twist.info.md b/Workouts/Resources/ExerciseMotions/Torso Twist.info.md
new file mode 100644
index 0000000..349ed59
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Torso Twist.info.md
@@ -0,0 +1,37 @@
+# Torso Twist
+
+Relaxed standing rotation from side to side, letting the arms swing freely, to
+warm the spine and obliques before lifting.
+
+- **Category:** Mobility / warm-up
+- **Type:** Spinal rotation
+- **Targets:** Obliques, thoracic spine, lower back
+- **Prescription:** 10 easy twists to each side, arms loose
+- **Defaults:** 2 × 10 bodyweight
+
+## Setup
+
+Stand with feet shoulder-width, knees soft, arms hanging loose.
+
+## Execution
+
+1. Turn the trunk gently to one side, letting the arms swing across the body.
+2. Let that momentum carry you back through center to the other side.
+3. Keep a smooth, relaxed rhythm turning side to side.
+
+## Cues
+
+- Let the arms be floppy — they trail the twist, they don't drive it.
+- Rotate from the waist and mid-back while the hips stay mostly forward.
+- Keep the neck loose and let the head follow the shoulders.
+
+## Common Mistakes
+
+- Yanking the arms to force more rotation.
+- Letting the feet peel off the floor as you turn.
+- Twisting so hard the low back pinches.
+
+## Progression
+
+Small easy twists → fuller rotation → slow, controlled turns with a brief pause
+at each end.
diff --git a/Workouts/Resources/ExerciseMotions/Torso Twist.motion.json b/Workouts/Resources/ExerciseMotions/Torso Twist.motion.json
new file mode 100644
index 0000000..7e168bc
--- /dev/null
+++ b/Workouts/Resources/ExerciseMotions/Torso Twist.motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Torso Twist",
+ "primary": 1,
+ "camera": {"yaw": 90, "zoom": 0.7},
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 0.3, "tween": 1.1,
+ "root": {"pos": [160, 64]},
+ "spine": [{"rotation": 18}, {"rotation": 14}],
+ "neck": {"rotation": -8},
+ "shoulder_r": 40, "elbow_r": 22,
+ "shoulder_l": 40, "elbow_l": 22,
+ "hip_r": 2, "knee_r": 3, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 3, "ankle_l": 0,
+ "pins": {"foot_r": [151, 150], "foot_l": [169, 150]}
+ },
+ {
+ "hold": 0.3, "tween": 1.1,
+ "root": {"pos": [160, 64]},
+ "spine": [{"rotation": -18}, {"rotation": -14}],
+ "neck": {"rotation": 8},
+ "shoulder_r": 40, "elbow_r": 22,
+ "shoulder_l": 40, "elbow_l": 22,
+ "hip_r": 2, "knee_r": 3, "ankle_r": 0,
+ "hip_l": 2, "knee_l": 3, "ankle_l": 0,
+ "pins": {"foot_r": [151, 150], "foot_l": [169, 150]}
+ }
+ ]
+}
diff --git a/Workouts/Resources/StarterSplits/Bodyweight Core.split.json b/Workouts/Resources/StarterSplits/Bodyweight Core.split.json
index c878837..a39e06c 100644
--- a/Workouts/Resources/StarterSplits/Bodyweight Core.split.json
+++ b/Workouts/Resources/StarterSplits/Bodyweight Core.split.json
@@ -97,7 +97,7 @@
"id" : "01DXF6DT00RV99WG172YFW4NKA",
"name" : "Bodyweight Core",
"order" : 3,
- "schemaVersion" : 2,
+ "schemaVersion" : 3,
"systemImage" : "figure.core.training",
"updatedAt" : "2020-01-01T00:00:00Z"
}
\ No newline at end of file
diff --git a/Workouts/Resources/StarterSplits/Core.split.json b/Workouts/Resources/StarterSplits/Core.split.json
index ff69798..03c29c1 100644
--- a/Workouts/Resources/StarterSplits/Core.split.json
+++ b/Workouts/Resources/StarterSplits/Core.split.json
@@ -33,7 +33,7 @@
"id" : "01DXF6DT001MA0TM7FHJZT098Z",
"name" : "Core",
"order" : 1,
- "schemaVersion" : 2,
+ "schemaVersion" : 3,
"systemImage" : "figure.core.training",
"updatedAt" : "2020-01-01T00:00:00Z"
}
\ No newline at end of file
diff --git a/Workouts/Resources/StarterSplits/Evening Stretch.split.json b/Workouts/Resources/StarterSplits/Evening Stretch.split.json
new file mode 100644
index 0000000..cee4621
--- /dev/null
+++ b/Workouts/Resources/StarterSplits/Evening Stretch.split.json
@@ -0,0 +1,63 @@
+{
+ "activityType" : 1,
+ "color" : "indigo",
+ "createdAt" : "2020-01-01T00:00:00Z",
+ "exercises" : [
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00MGW05GT89PQ97NJP",
+ "loadType" : 0,
+ "name" : "Cat-Cow",
+ "order" : 0,
+ "reps" : 10,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 45,
+ "id" : "01DXF6DT00FKCS4829TCES5DAK",
+ "loadType" : 2,
+ "name" : "Butterfly Stretch",
+ "order" : 1,
+ "reps" : 0,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 30,
+ "id" : "01DXF6DT00CZEX3S1EJZRRNGJ3",
+ "loadType" : 2,
+ "name" : "Kneeling Hip Flexor Stretch",
+ "order" : 2,
+ "reps" : 0,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00SZGMC6BNWYMBTE1X",
+ "loadType" : 0,
+ "name" : "Cobra Stretch",
+ "order" : 3,
+ "reps" : 8,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 45,
+ "id" : "01DXF6DT00GVMTRR094FEXQ9Z6",
+ "loadType" : 2,
+ "name" : "Child's Pose",
+ "order" : 4,
+ "reps" : 0,
+ "sets" : 1,
+ "weight" : 0
+ }
+ ],
+ "id" : "01DXF6DT00M5YRFPHJQ2FS2B9P",
+ "name" : "Evening Stretch",
+ "order" : 11,
+ "schemaVersion" : 3,
+ "systemImage" : "figure.mind.and.body",
+ "updatedAt" : "2020-01-01T00:00:00Z"
+}
\ No newline at end of file
diff --git a/Workouts/Resources/StarterSplits/Free Weight Basics.split.json b/Workouts/Resources/StarterSplits/Free Weight Basics.split.json
new file mode 100644
index 0000000..3075ef1
--- /dev/null
+++ b/Workouts/Resources/StarterSplits/Free Weight Basics.split.json
@@ -0,0 +1,73 @@
+{
+ "activityType" : 0,
+ "color" : "red",
+ "createdAt" : "2020-01-01T00:00:00Z",
+ "exercises" : [
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00TQF0XGY9G7RWGE1D",
+ "loadType" : 1,
+ "name" : "Goblet Squat",
+ "order" : 0,
+ "reps" : 10,
+ "sets" : 3,
+ "weight" : 25
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00QBT678ZGHNY68716",
+ "loadType" : 1,
+ "name" : "Dumbbell Bench Press",
+ "order" : 1,
+ "reps" : 8,
+ "sets" : 3,
+ "weight" : 25
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00F1E66BQWARPAKJXB",
+ "loadType" : 1,
+ "name" : "Dumbbell Row",
+ "order" : 2,
+ "reps" : 8,
+ "sets" : 3,
+ "weight" : 30
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00D660PT6QDDC6M27G",
+ "loadType" : 1,
+ "name" : "Dumbbell Shoulder Press",
+ "order" : 3,
+ "reps" : 8,
+ "sets" : 3,
+ "weight" : 20
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00DB4PGPWE1P4V9CGP",
+ "loadType" : 1,
+ "name" : "Romanian Deadlift",
+ "order" : 4,
+ "reps" : 8,
+ "sets" : 3,
+ "weight" : 65
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00AJBJT1ZS0ARHA5EV",
+ "loadType" : 1,
+ "name" : "Dumbbell Curl",
+ "order" : 5,
+ "reps" : 10,
+ "sets" : 3,
+ "weight" : 20
+ }
+ ],
+ "id" : "01DXF6DT00WY3HMCH6E841YQE7",
+ "name" : "Free Weight Basics",
+ "order" : 5,
+ "schemaVersion" : 3,
+ "systemImage" : "dumbbell.fill",
+ "updatedAt" : "2020-01-01T00:00:00Z"
+}
\ No newline at end of file
diff --git a/Workouts/Resources/StarterSplits/Full Body Machines.split.json b/Workouts/Resources/StarterSplits/Full Body Machines.split.json
new file mode 100644
index 0000000..740b058
--- /dev/null
+++ b/Workouts/Resources/StarterSplits/Full Body Machines.split.json
@@ -0,0 +1,91 @@
+{
+ "activityType" : 0,
+ "color" : "purple",
+ "createdAt" : "2020-01-01T00:00:00Z",
+ "exercises" : [
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT007DWX30820RGZ0YNG",
+ "loadType" : 1,
+ "machineSettings" : [
+
+ ],
+ "name" : "Leg Press",
+ "order" : 0,
+ "reps" : 10,
+ "sets" : 4,
+ "weight" : 100
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT0087C1WEBX5GHM2XH0",
+ "loadType" : 1,
+ "machineSettings" : [
+
+ ],
+ "name" : "Chest Press",
+ "order" : 1,
+ "reps" : 10,
+ "sets" : 4,
+ "weight" : 40
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT0034YBRKF6HMSHN6GA",
+ "loadType" : 1,
+ "machineSettings" : [
+
+ ],
+ "name" : "Seated Row",
+ "order" : 2,
+ "reps" : 10,
+ "sets" : 4,
+ "weight" : 70
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00B438JN6AJ1HNACRD",
+ "loadType" : 1,
+ "machineSettings" : [
+
+ ],
+ "name" : "Shoulder Press",
+ "order" : 3,
+ "reps" : 10,
+ "sets" : 4,
+ "weight" : 30
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT006TFW38JP14XAT51B",
+ "loadType" : 1,
+ "machineSettings" : [
+
+ ],
+ "name" : "Lat Pull Down",
+ "order" : 4,
+ "reps" : 10,
+ "sets" : 4,
+ "weight" : 80
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00TPPH89QS23QS1E3Q",
+ "loadType" : 1,
+ "machineSettings" : [
+
+ ],
+ "name" : "Abdominal",
+ "order" : 5,
+ "reps" : 10,
+ "sets" : 4,
+ "weight" : 40
+ }
+ ],
+ "id" : "01DXF6DT00SZ0NPXPN36415NKM",
+ "name" : "Full Body Machines",
+ "order" : 4,
+ "schemaVersion" : 3,
+ "systemImage" : "figure.strengthtraining.traditional",
+ "updatedAt" : "2020-01-01T00:00:00Z"
+}
\ No newline at end of file
diff --git a/Workouts/Resources/StarterSplits/Full Body Stretch.split.json b/Workouts/Resources/StarterSplits/Full Body Stretch.split.json
new file mode 100644
index 0000000..dfea643
--- /dev/null
+++ b/Workouts/Resources/StarterSplits/Full Body Stretch.split.json
@@ -0,0 +1,83 @@
+{
+ "activityType" : 1,
+ "color" : "brown",
+ "createdAt" : "2020-01-01T00:00:00Z",
+ "exercises" : [
+ {
+ "durationSeconds" : 30,
+ "id" : "01DXF6DT00KXXVJGX9PZ6DFRNM",
+ "loadType" : 2,
+ "name" : "Standing Forward Fold",
+ "order" : 0,
+ "reps" : 0,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 30,
+ "id" : "01DXF6DT00B403PC8WPH08BQ4S",
+ "loadType" : 2,
+ "name" : "Standing Quad Stretch",
+ "order" : 1,
+ "reps" : 0,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 30,
+ "id" : "01DXF6DT00ECM7ZNGTWRX7X1AF",
+ "loadType" : 2,
+ "name" : "Standing Calf Stretch",
+ "order" : 2,
+ "reps" : 0,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 30,
+ "id" : "01DXF6DT009XR6DQR5SF3QYWGD",
+ "loadType" : 2,
+ "name" : "Chest Opener",
+ "order" : 3,
+ "reps" : 0,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 30,
+ "id" : "01DXF6DT00RVBENX9XMMZVNT3A",
+ "loadType" : 2,
+ "name" : "Overhead Triceps Stretch",
+ "order" : 4,
+ "reps" : 0,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 30,
+ "id" : "01DXF6DT00VYKDXAEQZ9TC3D0X",
+ "loadType" : 2,
+ "name" : "Kneeling Hip Flexor Stretch",
+ "order" : 5,
+ "reps" : 0,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 45,
+ "id" : "01DXF6DT00HCQTTFPK7EWY28V0",
+ "loadType" : 2,
+ "name" : "Child's Pose",
+ "order" : 6,
+ "reps" : 0,
+ "sets" : 1,
+ "weight" : 0
+ }
+ ],
+ "id" : "01DXF6DT003PRJB3FGYSSGTQ5X",
+ "name" : "Full Body Stretch",
+ "order" : 10,
+ "schemaVersion" : 3,
+ "systemImage" : "figure.flexibility",
+ "updatedAt" : "2020-01-01T00:00:00Z"
+}
\ No newline at end of file
diff --git a/Workouts/Resources/StarterSplits/Lower Body Warm-Up.split.json b/Workouts/Resources/StarterSplits/Lower Body Warm-Up.split.json
new file mode 100644
index 0000000..bbeafd4
--- /dev/null
+++ b/Workouts/Resources/StarterSplits/Lower Body Warm-Up.split.json
@@ -0,0 +1,73 @@
+{
+ "activityType" : 1,
+ "color" : "mint",
+ "createdAt" : "2020-01-01T00:00:00Z",
+ "exercises" : [
+ {
+ "durationSeconds" : 60,
+ "id" : "01DXF6DT00M88Z7S2BA5GCNTCD",
+ "loadType" : 2,
+ "name" : "March in Place",
+ "order" : 0,
+ "reps" : 0,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00ZF915NN20AA4AN8C",
+ "loadType" : 0,
+ "name" : "Leg Swings",
+ "order" : 1,
+ "reps" : 10,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00CCGK00Q6N9RPZ3NJ",
+ "loadType" : 0,
+ "name" : "Hip Circles",
+ "order" : 2,
+ "reps" : 8,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00JRXXQJZ6ZZR521RZ",
+ "loadType" : 0,
+ "name" : "Bodyweight Squat",
+ "order" : 3,
+ "reps" : 12,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00NFVS0DQCCHK55X78",
+ "loadType" : 0,
+ "name" : "Glute Bridge",
+ "order" : 4,
+ "reps" : 10,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00WBG0EZ04W2A5EEMQ",
+ "loadType" : 0,
+ "name" : "Standing Calf Raise",
+ "order" : 5,
+ "reps" : 12,
+ "sets" : 2,
+ "weight" : 0
+ }
+ ],
+ "id" : "01DXF6DT003QB4ASSR8JB1JT6A",
+ "name" : "Lower Body Warm-Up",
+ "order" : 7,
+ "schemaVersion" : 3,
+ "systemImage" : "figure.walk",
+ "updatedAt" : "2020-01-01T00:00:00Z"
+}
\ No newline at end of file
diff --git a/Workouts/Resources/StarterSplits/Lower Body.split.json b/Workouts/Resources/StarterSplits/Lower Body.split.json
index a960c69..2d8b56e 100644
--- a/Workouts/Resources/StarterSplits/Lower Body.split.json
+++ b/Workouts/Resources/StarterSplits/Lower Body.split.json
@@ -85,7 +85,7 @@
"id" : "01DXF6DT006QRF1PMGK17FV505",
"name" : "Lower Body",
"order" : 2,
- "schemaVersion" : 2,
+ "schemaVersion" : 3,
"systemImage" : "figure.run",
"updatedAt" : "2020-01-01T00:00:00Z"
}
\ No newline at end of file
diff --git a/Workouts/Resources/StarterSplits/Morning Mobility.split.json b/Workouts/Resources/StarterSplits/Morning Mobility.split.json
new file mode 100644
index 0000000..f099a75
--- /dev/null
+++ b/Workouts/Resources/StarterSplits/Morning Mobility.split.json
@@ -0,0 +1,83 @@
+{
+ "activityType" : 1,
+ "color" : "pink",
+ "createdAt" : "2020-01-01T00:00:00Z",
+ "exercises" : [
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00WB2Q0YPMG9P2RYFP",
+ "loadType" : 0,
+ "name" : "Cat-Cow",
+ "order" : 0,
+ "reps" : 10,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00T7H39EJ84QNYFZA8",
+ "loadType" : 0,
+ "name" : "Bird Dog",
+ "order" : 1,
+ "reps" : 8,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT009NP8AESV5X4BC6MY",
+ "loadType" : 0,
+ "name" : "Dead Bug",
+ "order" : 2,
+ "reps" : 8,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT002TDXQS2KWZESM51W",
+ "loadType" : 0,
+ "name" : "Glute Bridge",
+ "order" : 3,
+ "reps" : 12,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT0093AEZ6DNWHA8JRFZ",
+ "loadType" : 0,
+ "name" : "Cobra Stretch",
+ "order" : 4,
+ "reps" : 8,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 45,
+ "id" : "01DXF6DT000J1DRJR6NEVZ514E",
+ "loadType" : 2,
+ "name" : "Child's Pose",
+ "order" : 5,
+ "reps" : 0,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 30,
+ "id" : "01DXF6DT00SN3YMB4JZA184FKQ",
+ "loadType" : 2,
+ "name" : "Standing Forward Fold",
+ "order" : 6,
+ "reps" : 0,
+ "sets" : 1,
+ "weight" : 0
+ }
+ ],
+ "id" : "01DXF6DT00QHJ9G4SDMEX64NZD",
+ "name" : "Morning Mobility",
+ "order" : 9,
+ "schemaVersion" : 3,
+ "systemImage" : "figure.yoga",
+ "updatedAt" : "2020-01-01T00:00:00Z"
+}
\ No newline at end of file
diff --git a/Workouts/Resources/StarterSplits/Morning Wake-Up.split.json b/Workouts/Resources/StarterSplits/Morning Wake-Up.split.json
new file mode 100644
index 0000000..0b330cd
--- /dev/null
+++ b/Workouts/Resources/StarterSplits/Morning Wake-Up.split.json
@@ -0,0 +1,103 @@
+{
+ "activityType" : 1,
+ "color" : "yellow",
+ "createdAt" : "2020-01-01T00:00:00Z",
+ "exercises" : [
+ {
+ "durationSeconds" : 45,
+ "id" : "01DXF6DT00CR91WJG3RAWSJC5F",
+ "loadType" : 2,
+ "name" : "March in Place",
+ "order" : 0,
+ "reps" : 0,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT0090FANSSPTBBYFG08",
+ "loadType" : 0,
+ "name" : "Neck Rolls",
+ "order" : 1,
+ "reps" : 5,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00GKZKMRKHQ7AARGWG",
+ "loadType" : 0,
+ "name" : "Arm Circles",
+ "order" : 2,
+ "reps" : 10,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00KG2640BBEXTTFNM3",
+ "loadType" : 0,
+ "name" : "Torso Twist",
+ "order" : 3,
+ "reps" : 10,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT005JW5BTSHWY54S6P3",
+ "loadType" : 0,
+ "name" : "Standing Side Bend",
+ "order" : 4,
+ "reps" : 8,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT004CYSBPP0KYDMJMMG",
+ "loadType" : 0,
+ "name" : "Hip Circles",
+ "order" : 5,
+ "reps" : 8,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00TSP140VH9JYVHS15",
+ "loadType" : 0,
+ "name" : "Leg Swings",
+ "order" : 6,
+ "reps" : 10,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00J0C4EADB3VRKEJB2",
+ "loadType" : 0,
+ "name" : "Standing Calf Raise",
+ "order" : 7,
+ "reps" : 12,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 30,
+ "id" : "01DXF6DT00BMMGNKB4B6TQ5E59",
+ "loadType" : 2,
+ "name" : "Standing Forward Fold",
+ "order" : 8,
+ "reps" : 0,
+ "sets" : 1,
+ "weight" : 0
+ }
+ ],
+ "id" : "01DXF6DT00FJ5F1HRENQPC1DTG",
+ "name" : "Morning Wake-Up",
+ "order" : 8,
+ "schemaVersion" : 3,
+ "systemImage" : "sun.max.fill",
+ "updatedAt" : "2020-01-01T00:00:00Z"
+}
\ No newline at end of file
diff --git a/Workouts/Resources/StarterSplits/Upper Body Warm-Up.split.json b/Workouts/Resources/StarterSplits/Upper Body Warm-Up.split.json
new file mode 100644
index 0000000..d4391a3
--- /dev/null
+++ b/Workouts/Resources/StarterSplits/Upper Body Warm-Up.split.json
@@ -0,0 +1,63 @@
+{
+ "activityType" : 1,
+ "color" : "cyan",
+ "createdAt" : "2020-01-01T00:00:00Z",
+ "exercises" : [
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00VZ0J13D3RV1583SN",
+ "loadType" : 0,
+ "name" : "Arm Circles",
+ "order" : 0,
+ "reps" : 10,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT008VVX81WZCXJYPV5G",
+ "loadType" : 0,
+ "name" : "Torso Twist",
+ "order" : 1,
+ "reps" : 10,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT005MTQJMDRFN8PPYYN",
+ "loadType" : 0,
+ "name" : "Standing Side Bend",
+ "order" : 2,
+ "reps" : 8,
+ "sets" : 2,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00JD3M6G2QKCF2PNBB",
+ "loadType" : 0,
+ "name" : "Cat-Cow",
+ "order" : 3,
+ "reps" : 8,
+ "sets" : 1,
+ "weight" : 0
+ },
+ {
+ "durationSeconds" : 0,
+ "id" : "01DXF6DT00PZ35SNJ861S3WQKT",
+ "loadType" : 0,
+ "name" : "Push-Up",
+ "order" : 4,
+ "reps" : 8,
+ "sets" : 2,
+ "weight" : 0
+ }
+ ],
+ "id" : "01DXF6DT00G56WC0HS6RJWMFMD",
+ "name" : "Upper Body Warm-Up",
+ "order" : 6,
+ "schemaVersion" : 3,
+ "systemImage" : "figure.arms.open",
+ "updatedAt" : "2020-01-01T00:00:00Z"
+}
\ No newline at end of file
diff --git a/Workouts/Resources/StarterSplits/Upper Body.split.json b/Workouts/Resources/StarterSplits/Upper Body.split.json
index 37b38a7..5352db3 100644
--- a/Workouts/Resources/StarterSplits/Upper Body.split.json
+++ b/Workouts/Resources/StarterSplits/Upper Body.split.json
@@ -85,7 +85,7 @@
"id" : "01DXF6DT0038BDC2WC3EVX8ZJ5",
"name" : "Upper Body",
"order" : 0,
- "schemaVersion" : 2,
+ "schemaVersion" : 3,
"systemImage" : "figure.strengthtraining.traditional",
"updatedAt" : "2020-01-01T00:00:00Z"
}
\ No newline at end of file
diff --git a/WorkoutsTests/SeedLibraryTests.swift b/WorkoutsTests/SeedLibraryTests.swift
index 094766b..08b0aaa 100644
--- a/WorkoutsTests/SeedLibraryTests.swift
+++ b/WorkoutsTests/SeedLibraryTests.swift
@@ -11,11 +11,17 @@ import IndieSync
/// both the raw document and a SwiftData cache round-trip.
struct SeedLibraryTests {
- @Test func catalogLoadsFourSeedsInOrder() {
+ @Test func catalogLoadsTwelveSeedsInOrder() {
let seeds = SeedLibrary.seeds
- #expect(seeds.count == 4)
- #expect(seeds.map(\.doc.order) == [0, 1, 2, 3])
- #expect(seeds.map(\.doc.name) == ["Upper Body", "Core", "Lower Body", "Bodyweight Core"])
+ #expect(seeds.count == 12)
+ #expect(seeds.map(\.doc.order) == Array(0...11))
+ #expect(seeds.map(\.doc.name) == [
+ "Upper Body", "Core", "Lower Body", "Bodyweight Core",
+ "Full Body Machines", "Free Weight Basics",
+ "Upper Body Warm-Up", "Lower Body Warm-Up",
+ "Morning Wake-Up", "Morning Mobility",
+ "Full Body Stretch", "Evening Stretch",
+ ])
}
/// These ids are minted from a frozen 2020 timestamp and are already shipped
@@ -30,6 +36,14 @@ struct SeedLibraryTests {
"01DXF6DT001MA0TM7FHJZT098Z", // Core
"01DXF6DT006QRF1PMGK17FV505", // Lower Body
"01DXF6DT00RV99WG172YFW4NKA", // Bodyweight Core
+ "01DXF6DT00SZ0NPXPN36415NKM", // Full Body Machines
+ "01DXF6DT00WY3HMCH6E841YQE7", // Free Weight Basics
+ "01DXF6DT00G56WC0HS6RJWMFMD", // Upper Body Warm-Up
+ "01DXF6DT003QB4ASSR8JB1JT6A", // Lower Body Warm-Up
+ "01DXF6DT00FJ5F1HRENQPC1DTG", // Morning Wake-Up
+ "01DXF6DT00QHJ9G4SDMEX64NZD", // Morning Mobility
+ "01DXF6DT003PRJB3FGYSSGTQ5X", // Full Body Stretch
+ "01DXF6DT00M5YRFPHJQ2FS2B9P", // Evening Stretch
])
}