diff --git a/Exercise Library/Barbell Squat/frames/frame-1.svg b/Exercise Library/Barbell Squat/frames/frame-1.svg
new file mode 100644
index 0000000..13763ef
--- /dev/null
+++ b/Exercise Library/Barbell Squat/frames/frame-1.svg
@@ -0,0 +1,22 @@
+
diff --git a/Exercise Library/Barbell Squat/frames/frame-2.svg b/Exercise Library/Barbell Squat/frames/frame-2.svg
new file mode 100644
index 0000000..67809ed
--- /dev/null
+++ b/Exercise Library/Barbell Squat/frames/frame-2.svg
@@ -0,0 +1,22 @@
+
diff --git a/Exercise Library/Barbell Squat/info.md b/Exercise Library/Barbell Squat/info.md
new file mode 100644
index 0000000..0f41b01
--- /dev/null
+++ b/Exercise Library/Barbell Squat/info.md
@@ -0,0 +1,39 @@
+# Barbell Squat
+
+The barbell back squat — bar across the upper back, sit down between the
+heels, stand back up.
+
+- **Category:** Main circuit
+- **Type:** Free-weight compound squat
+- **Targets:** Quadriceps, glutes, adductors, trunk
+- **Prescription:** 4 × 6–8
+
+## Setup
+
+Set the bar on your upper traps (not the neck), hands just outside the
+shoulders, and step back from the rack. Feet shoulder-width, toes slightly
+out, brace before every rep.
+
+## Execution
+
+1. Sit down and back — hips and knees bend together, chest stays up.
+2. Descend until the thighs reach at least parallel, knees tracking over
+ the toes.
+3. Drive the floor apart and stand back up to full lockout.
+
+## Cues
+
+- Big breath and brace at the top; exhale at the finish.
+- The bar stays over mid-foot — watch the sideways bar path, not the mirror.
+- Elbows down under the bar, not flared behind it.
+
+## Common Mistakes
+
+- Knees caving inward out of the bottom.
+- Heels lifting — weight drifting onto the toes.
+- Chest collapsing forward into a good-morning.
+
+## Progression
+
+Master the Bodyweight Squat and Goblet Squat first; add weight in small
+jumps only while depth and knee tracking hold.
diff --git a/Exercise Library/Barbell Squat/motion.json b/Exercise Library/Barbell Squat/motion.json
new file mode 100644
index 0000000..12d0649
--- /dev/null
+++ b/Exercise Library/Barbell Squat/motion.json
@@ -0,0 +1,35 @@
+{
+ "name": "Barbell Squat",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r", "leg_l"],
+ "props": [
+ {"type": "bar", "at": ["hand_r", "hand_l"], "halfLen": 26, "plateR": 14}
+ ],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 1.1,
+ "root": {"pos": [160, 64], "pitch": 6},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 28, "elbow_r": 140,
+ "shoulder_l": 28, "elbow_l": 140,
+ "hip_r": 5, "knee_r": 4, "ankle_r": 0,
+ "hip_l": 5, "knee_l": 4, "ankle_l": 0,
+ "pins": {"foot_r": [160, 148], "foot_l": [164, 150],
+ "hand_r": [166, -16], "hand_l": [170, -14]}
+ },
+ {
+ "hold": 0.4, "tween": 1.1,
+ "root": {"pos": [117, 108], "pitch": 35},
+ "spine": [0, -4],
+ "neck": 5, "head": -28,
+ "shoulder_r": 55, "elbow_r": 140,
+ "shoulder_l": 55, "elbow_l": 140,
+ "hip_r": 100, "knee_r": 118, "ankle_r": 22,
+ "hip_l": 100, "knee_l": 118, "ankle_l": 22,
+ "pins": {"foot_r": [160, 148], "foot_l": [164, 150],
+ "hand_r": [163, 30], "hand_l": [167, 32]}
+ }
+ ]
+}
diff --git a/Exercise Library/Barbell Squat/preview.gif b/Exercise Library/Barbell Squat/preview.gif
new file mode 100644
index 0000000..0f93c08
Binary files /dev/null and b/Exercise Library/Barbell Squat/preview.gif differ
diff --git a/Exercise Library/Barbell Squat/visual.svg b/Exercise Library/Barbell Squat/visual.svg
new file mode 100644
index 0000000..67809ed
--- /dev/null
+++ b/Exercise Library/Barbell Squat/visual.svg
@@ -0,0 +1,22 @@
+
diff --git a/Exercise Library/Bench Press/frames/frame-1.svg b/Exercise Library/Bench Press/frames/frame-1.svg
new file mode 100644
index 0000000..75400cb
--- /dev/null
+++ b/Exercise Library/Bench Press/frames/frame-1.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Bench Press/frames/frame-2.svg b/Exercise Library/Bench Press/frames/frame-2.svg
new file mode 100644
index 0000000..ea63671
--- /dev/null
+++ b/Exercise Library/Bench Press/frames/frame-2.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Bench Press/info.md b/Exercise Library/Bench Press/info.md
new file mode 100644
index 0000000..e681e38
--- /dev/null
+++ b/Exercise Library/Bench Press/info.md
@@ -0,0 +1,40 @@
+# Bench Press
+
+The barbell press — lying on the flat bench, lower the bar to the chest
+and press it back to straight arms.
+
+- **Category:** Main circuit
+- **Type:** Free-weight horizontal press
+- **Targets:** Chest, front delts, triceps
+- **Prescription:** 4 × 6–8
+
+## Setup
+
+Lie with eyes under the bar, feet flat on the floor, shoulder blades
+pinched back and down. Grip a little wider than shoulder-width and
+unrack to straight arms over the shoulders.
+
+## Execution
+
+1. Lower the bar under control to the mid-chest, elbows about 45° from
+ the body.
+2. Touch lightly — no bounce.
+3. Press back up and slightly toward the face to lockout over the
+ shoulders.
+
+## Cues
+
+- Shoulder blades stay pinched against the bench the whole set.
+- Wrists stacked over elbows; bar sits low in the palm.
+- Feet drive quietly into the floor.
+
+## Common Mistakes
+
+- Bouncing the bar off the chest.
+- Elbows flared straight out at 90°.
+- Hips lifting off the bench.
+
+## Progression
+
+Add small plates while every rep touches and locks out; a spotter or
+safety pins once the loads get honest.
diff --git a/Exercise Library/Bench Press/motion.json b/Exercise Library/Bench Press/motion.json
new file mode 100644
index 0000000..c891b90
--- /dev/null
+++ b/Exercise Library/Bench Press/motion.json
@@ -0,0 +1,39 @@
+{
+ "name": "Bench Press",
+ "primary": 1,
+ "working": ["arm_r", "arm_l"],
+ "props": [
+ {"type": "scene", "shapes": [
+ {"kind": "line", "pts": [[58, 124], [162, 124]], "w": 9, "depth": 8},
+ {"kind": "line", "pts": [[78, 129], [78, 150]], "w": 4},
+ {"kind": "line", "pts": [[144, 129], [144, 150]], "w": 4}
+ ]},
+ {"type": "bar", "at": ["hand_r", "hand_l"], "halfLen": 26, "plateR": 12}
+ ],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 0.9,
+ "root": {"pos": [150, 116], "pitch": -90},
+ "spine": [0, 0],
+ "neck": 8, "head": 0,
+ "shoulder_r": 15, "elbow_r": 100,
+ "shoulder_l": 15, "elbow_l": 100,
+ "hip_r": 78, "knee_r": 82, "ankle_r": 5,
+ "hip_l": 78, "knee_l": 82, "ankle_l": 5,
+ "pins": {"foot_r": [196, 148], "foot_l": [200, 150],
+ "hand_r": [93, 100], "hand_l": [97, 102]}
+ },
+ {
+ "hold": 0.4, "tween": 1.2,
+ "root": {"pos": [150, 116], "pitch": -90},
+ "spine": [0, 0],
+ "neck": 8, "head": 0,
+ "shoulder_r": 90, "elbow_r": 5,
+ "shoulder_l": 90, "elbow_l": 5,
+ "hip_r": 78, "knee_r": 82, "ankle_r": 5,
+ "hip_l": 78, "knee_l": 82, "ankle_l": 5,
+ "pins": {"foot_r": [196, 148], "foot_l": [200, 150],
+ "hand_r": [67, 57], "hand_l": [71, 59]}
+ }
+ ]
+}
diff --git a/Exercise Library/Bench Press/preview.gif b/Exercise Library/Bench Press/preview.gif
new file mode 100644
index 0000000..202f683
Binary files /dev/null and b/Exercise Library/Bench Press/preview.gif differ
diff --git a/Exercise Library/Bench Press/visual.svg b/Exercise Library/Bench Press/visual.svg
new file mode 100644
index 0000000..75400cb
--- /dev/null
+++ b/Exercise Library/Bench Press/visual.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Bodyweight Squat/frames/frame-1.svg b/Exercise Library/Bodyweight Squat/frames/frame-1.svg
new file mode 100644
index 0000000..b93984b
--- /dev/null
+++ b/Exercise Library/Bodyweight Squat/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Bodyweight Squat/frames/frame-2.svg b/Exercise Library/Bodyweight Squat/frames/frame-2.svg
new file mode 100644
index 0000000..469a150
--- /dev/null
+++ b/Exercise Library/Bodyweight Squat/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Bodyweight Squat/info.md b/Exercise Library/Bodyweight Squat/info.md
new file mode 100644
index 0000000..8c0a0ff
--- /dev/null
+++ b/Exercise Library/Bodyweight Squat/info.md
@@ -0,0 +1,37 @@
+# Bodyweight Squat
+
+The unloaded squat — arms reach forward as a counterbalance while the hips
+sit down between the heels. The pattern every loaded squat is built on.
+
+- **Category:** Warm-up and main circuit
+- **Type:** Bodyweight squat
+- **Targets:** Quadriceps, glutes, mobility
+- **Prescription:** 3 × 15–20, or 10 slow reps as a warm-up
+
+## Setup
+
+Stand with feet shoulder-width, toes slightly turned out, arms relaxed at
+your sides.
+
+## Execution
+
+1. Reach the arms forward as the hips sit down and back.
+2. Descend as deep as comfortable — thighs at least parallel — heels flat.
+3. Stand back up tall and let the arms drop.
+
+## Cues
+
+- Knees track over the toes the whole way down and up.
+- Chest up; the arms reaching forward keep you from tipping.
+- Slow down — a three-second descent teaches control.
+
+## Common Mistakes
+
+- Heels lifting at the bottom.
+- Knees diving inward.
+- Shallow, quick bouncing instead of full, controlled reps.
+
+## Progression
+
+Slow the tempo, pause at the bottom, then load the pattern with the
+Goblet Squat.
diff --git a/Exercise Library/Bodyweight Squat/motion.json b/Exercise Library/Bodyweight Squat/motion.json
new file mode 100644
index 0000000..9385214
--- /dev/null
+++ b/Exercise Library/Bodyweight Squat/motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Bodyweight Squat",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r", "leg_l"],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 0.9,
+ "root": {"pos": [160, 64], "pitch": 4},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 6, "elbow_r": 5,
+ "shoulder_l": 6, "elbow_l": 5,
+ "hip_r": 4, "knee_r": 3, "ankle_r": 0,
+ "hip_l": 4, "knee_l": 3, "ankle_l": 0,
+ "pins": {"foot_r": [160, 148], "foot_l": [164, 150]}
+ },
+ {
+ "hold": 0.4, "tween": 0.9,
+ "root": {"pos": [146, 106], "pitch": 30},
+ "spine": [0, -4],
+ "neck": 5, "head": -24,
+ "shoulder_r": 118, "elbow_r": 8,
+ "shoulder_l": 118, "elbow_l": 8,
+ "hip_r": 98, "knee_r": 118, "ankle_r": 22,
+ "hip_l": 98, "knee_l": 118, "ankle_l": 22,
+ "pins": {"foot_r": [160, 148], "foot_l": [164, 150]}
+ }
+ ]
+}
diff --git a/Exercise Library/Bodyweight Squat/preview.gif b/Exercise Library/Bodyweight Squat/preview.gif
new file mode 100644
index 0000000..4369ab6
Binary files /dev/null and b/Exercise Library/Bodyweight Squat/preview.gif differ
diff --git a/Exercise Library/Bodyweight Squat/visual.svg b/Exercise Library/Bodyweight Squat/visual.svg
new file mode 100644
index 0000000..469a150
--- /dev/null
+++ b/Exercise Library/Bodyweight Squat/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Crunch/frames/frame-1.svg b/Exercise Library/Crunch/frames/frame-1.svg
new file mode 100644
index 0000000..1144bb9
--- /dev/null
+++ b/Exercise Library/Crunch/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Crunch/frames/frame-2.svg b/Exercise Library/Crunch/frames/frame-2.svg
new file mode 100644
index 0000000..ee67d9a
--- /dev/null
+++ b/Exercise Library/Crunch/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Crunch/info.md b/Exercise Library/Crunch/info.md
new file mode 100644
index 0000000..01fcbd1
--- /dev/null
+++ b/Exercise Library/Crunch/info.md
@@ -0,0 +1,38 @@
+# Crunch
+
+The floor ab curl — peel the shoulder blades off the mat, squeeze, and
+lower. Short range, all abs.
+
+- **Category:** Main circuit
+- **Type:** Spinal flexion (upper)
+- **Targets:** Rectus abdominis
+- **Prescription:** 3 × 15–20, slow
+
+## Setup
+
+Lie on your back, knees bent, feet flat. Fingertips lightly behind the
+ears, elbows wide.
+
+## Execution
+
+1. Exhale and curl the ribs toward the pelvis until the shoulder blades
+ leave the floor.
+2. Squeeze the abs hard at the top for a beat.
+3. Lower the shoulders back down without letting the head rest.
+
+## Cues
+
+- It's a curl, not a sit-up — the lower back stays on the mat.
+- Chin off the chest; the hands never pull the head.
+- Exhale on the way up to deepen the contraction.
+
+## Common Mistakes
+
+- Yanking the neck with the hands.
+- Sitting all the way up with the hip flexors.
+- Racing through reps with momentum.
+
+## Progression
+
+Slow the tempo and add a pause at the top; hold a small plate on the
+chest, or move to the Abdominal machine for stack-loaded flexion.
diff --git a/Exercise Library/Crunch/motion.json b/Exercise Library/Crunch/motion.json
new file mode 100644
index 0000000..29d4240
--- /dev/null
+++ b/Exercise Library/Crunch/motion.json
@@ -0,0 +1,29 @@
+{
+ "name": "Crunch",
+ "primary": 2,
+ "working": ["spine"],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 0.8,
+ "root": {"pos": [166, 146], "pitch": -90},
+ "spine": [0, 0],
+ "neck": 12, "head": 0,
+ "shoulder_r": 155, "elbow_r": 140,
+ "shoulder_l": 155, "elbow_l": 140,
+ "hip_r": 75, "knee_r": 85, "ankle_r": 5,
+ "hip_l": 75, "knee_l": 85, "ankle_l": 5,
+ "pins": {"foot_r": [205, 148], "foot_l": [209, 150]}
+ },
+ {
+ "hold": 0.6, "tween": 1.0,
+ "root": {"pos": [166, 144], "pitch": -90},
+ "spine": [14, 34],
+ "neck": 30, "head": 0,
+ "shoulder_r": 150, "elbow_r": 140,
+ "shoulder_l": 150, "elbow_l": 140,
+ "hip_r": 75, "knee_r": 85, "ankle_r": 5,
+ "hip_l": 75, "knee_l": 85, "ankle_l": 5,
+ "pins": {"foot_r": [205, 148], "foot_l": [209, 150]}
+ }
+ ]
+}
diff --git a/Exercise Library/Crunch/preview.gif b/Exercise Library/Crunch/preview.gif
new file mode 100644
index 0000000..e49448c
Binary files /dev/null and b/Exercise Library/Crunch/preview.gif differ
diff --git a/Exercise Library/Crunch/visual.svg b/Exercise Library/Crunch/visual.svg
new file mode 100644
index 0000000..ee67d9a
--- /dev/null
+++ b/Exercise Library/Crunch/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Dip/frames/frame-1.svg b/Exercise Library/Dip/frames/frame-1.svg
new file mode 100644
index 0000000..8afa385
--- /dev/null
+++ b/Exercise Library/Dip/frames/frame-1.svg
@@ -0,0 +1,21 @@
+
diff --git a/Exercise Library/Dip/frames/frame-2.svg b/Exercise Library/Dip/frames/frame-2.svg
new file mode 100644
index 0000000..354595f
--- /dev/null
+++ b/Exercise Library/Dip/frames/frame-2.svg
@@ -0,0 +1,21 @@
+
diff --git a/Exercise Library/Dip/info.md b/Exercise Library/Dip/info.md
new file mode 100644
index 0000000..c18d88d
--- /dev/null
+++ b/Exercise Library/Dip/info.md
@@ -0,0 +1,37 @@
+# Dip
+
+The bodyweight press on parallel bars — lower until the shoulders reach
+elbow depth, then press back to straight arms.
+
+- **Category:** Main circuit
+- **Type:** Bodyweight elbow extension (chest/triceps press)
+- **Targets:** Triceps, chest, front delts
+- **Prescription:** 3 × 6–12
+
+## Setup
+
+Support yourself on the parallel bars with straight arms, shoulders
+pressed down, slight forward lean, knees bent behind.
+
+## Execution
+
+1. Bend the elbows and lower until the upper arms reach parallel.
+2. Keep the elbows tracking back, body leaning slightly forward.
+3. Press back up to full lockout without the shoulders shrugging.
+
+## Cues
+
+- Shoulders stay down away from the ears at every depth.
+- More forward lean hits chest; upright hits triceps.
+- Depth to parallel — a shaky bottom inch isn't worth the shoulder.
+
+## Common Mistakes
+
+- Sinking the shoulders into the ears at the bottom.
+- Flaring the elbows straight out.
+- Bouncing out of the deep position.
+
+## Progression
+
+Use the assisted dip machine or bands until full-range reps are smooth;
+then add reps, then hang weight from a belt.
diff --git a/Exercise Library/Dip/motion.json b/Exercise Library/Dip/motion.json
new file mode 100644
index 0000000..1f0e0b2
--- /dev/null
+++ b/Exercise Library/Dip/motion.json
@@ -0,0 +1,36 @@
+{
+ "name": "Dip",
+ "primary": 2,
+ "camera": {"zoom": 0.78},
+ "working": ["arm_r", "arm_l"],
+ "props": [
+ {"type": "scene", "shapes": [
+ {"kind": "line", "pts": [[176, 66], [176, 150]], "w": 5},
+ {"kind": "circle", "c": [176, 61], "r": 3.5, "fill": true, "color": "prop"}
+ ]}
+ ],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 1.1,
+ "root": {"pos": [160, 86], "pitch": 8},
+ "spine": [0, 0],
+ "neck": 5, "head": -10,
+ "shoulder_r": 2, "elbow_r": 8,
+ "shoulder_l": 2, "elbow_l": 8,
+ "hip_r": 45, "knee_r": 130, "ankle_r": -20,
+ "hip_l": 45, "knee_l": 130, "ankle_l": -20,
+ "pins": {"hand_r": [174, 60], "hand_l": [178, 62]}
+ },
+ {
+ "hold": 0.4, "tween": 1.0,
+ "root": {"pos": [160, 116], "pitch": 18},
+ "spine": [0, 4],
+ "neck": 8, "head": -15,
+ "shoulder_r": -30, "elbow_r": 110,
+ "shoulder_l": -30, "elbow_l": 110,
+ "hip_r": 78, "knee_r": 148, "ankle_r": -20,
+ "hip_l": 78, "knee_l": 148, "ankle_l": -20,
+ "pins": {"hand_r": [174, 60], "hand_l": [178, 62]}
+ }
+ ]
+}
diff --git a/Exercise Library/Dip/preview.gif b/Exercise Library/Dip/preview.gif
new file mode 100644
index 0000000..e884c2b
Binary files /dev/null and b/Exercise Library/Dip/preview.gif differ
diff --git a/Exercise Library/Dip/visual.svg b/Exercise Library/Dip/visual.svg
new file mode 100644
index 0000000..354595f
--- /dev/null
+++ b/Exercise Library/Dip/visual.svg
@@ -0,0 +1,21 @@
+
diff --git a/Exercise Library/Dumbbell Bench Press/frames/frame-1.svg b/Exercise Library/Dumbbell Bench Press/frames/frame-1.svg
new file mode 100644
index 0000000..449835f
--- /dev/null
+++ b/Exercise Library/Dumbbell Bench Press/frames/frame-1.svg
@@ -0,0 +1,28 @@
+
diff --git a/Exercise Library/Dumbbell Bench Press/frames/frame-2.svg b/Exercise Library/Dumbbell Bench Press/frames/frame-2.svg
new file mode 100644
index 0000000..66308f0
--- /dev/null
+++ b/Exercise Library/Dumbbell Bench Press/frames/frame-2.svg
@@ -0,0 +1,28 @@
+
diff --git a/Exercise Library/Dumbbell Bench Press/info.md b/Exercise Library/Dumbbell Bench Press/info.md
new file mode 100644
index 0000000..770ebad
--- /dev/null
+++ b/Exercise Library/Dumbbell Bench Press/info.md
@@ -0,0 +1,38 @@
+# Dumbbell Bench Press
+
+The dumbbell press on the flat bench — a deeper, freer pressing arc than
+the bar, one weight in each hand.
+
+- **Category:** Main circuit
+- **Type:** Free-weight horizontal press (dumbbells)
+- **Targets:** Chest, front delts, triceps
+- **Prescription:** 3 × 8–12
+
+## Setup
+
+Sit with the dumbbells on your thighs, then lie back and kick them up to
+straight arms over the shoulders. Feet flat, shoulder blades pinched.
+
+## Execution
+
+1. Lower both dumbbells to the outside of the chest, elbows about 45°
+ from the body.
+2. Reach a comfortable stretch — deeper than a bar allows.
+3. Press back up and slightly together to lockout.
+
+## Cues
+
+- The dumbbells travel in a shallow A-shape, not straight lines.
+- Keep the wrists neutral and stacked over the elbows.
+- Lower slowly; the stretch is where dumbbells earn their keep.
+
+## Common Mistakes
+
+- Clanging the weights together at the top.
+- Uneven pressing — one side racing ahead.
+- Dropping the dumbbells from lockout instead of walking them down.
+
+## Progression
+
+Add weight while both sides press evenly; pause reps in the stretch
+position.
diff --git a/Exercise Library/Dumbbell Bench Press/motion.json b/Exercise Library/Dumbbell Bench Press/motion.json
new file mode 100644
index 0000000..40d7a4b
--- /dev/null
+++ b/Exercise Library/Dumbbell Bench Press/motion.json
@@ -0,0 +1,40 @@
+{
+ "name": "Dumbbell Bench Press",
+ "primary": 1,
+ "working": ["arm_r", "arm_l"],
+ "props": [
+ {"type": "scene", "shapes": [
+ {"kind": "line", "pts": [[58, 124], [162, 124]], "w": 9, "depth": 8},
+ {"kind": "line", "pts": [[78, 129], [78, 150]], "w": 4},
+ {"kind": "line", "pts": [[144, 129], [144, 150]], "w": 4}
+ ]},
+ {"type": "dumbbell", "at": "hand_r"},
+ {"type": "dumbbell", "at": "hand_l"}
+ ],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 0.9,
+ "root": {"pos": [150, 116], "pitch": -90},
+ "spine": [0, 0],
+ "neck": 8, "head": 0,
+ "shoulder_r": 12, "elbow_r": 105,
+ "shoulder_l": 12, "elbow_l": 105,
+ "hip_r": 78, "knee_r": 82, "ankle_r": 5,
+ "hip_l": 78, "knee_l": 82, "ankle_l": 5,
+ "pins": {"foot_r": [196, 148], "foot_l": [200, 150],
+ "hand_r": [90, 104], "hand_l": [98, 106]}
+ },
+ {
+ "hold": 0.4, "tween": 1.2,
+ "root": {"pos": [150, 116], "pitch": -90},
+ "spine": [0, 0],
+ "neck": 8, "head": 0,
+ "shoulder_r": 90, "elbow_r": 5,
+ "shoulder_l": 90, "elbow_l": 5,
+ "hip_r": 78, "knee_r": 82, "ankle_r": 5,
+ "hip_l": 78, "knee_l": 82, "ankle_l": 5,
+ "pins": {"foot_r": [196, 148], "foot_l": [200, 150],
+ "hand_r": [66, 57], "hand_l": [72, 59]}
+ }
+ ]
+}
diff --git a/Exercise Library/Dumbbell Bench Press/preview.gif b/Exercise Library/Dumbbell Bench Press/preview.gif
new file mode 100644
index 0000000..17c3b1e
Binary files /dev/null and b/Exercise Library/Dumbbell Bench Press/preview.gif differ
diff --git a/Exercise Library/Dumbbell Bench Press/visual.svg b/Exercise Library/Dumbbell Bench Press/visual.svg
new file mode 100644
index 0000000..449835f
--- /dev/null
+++ b/Exercise Library/Dumbbell Bench Press/visual.svg
@@ -0,0 +1,28 @@
+
diff --git a/Exercise Library/Dumbbell Curl/frames/frame-1.svg b/Exercise Library/Dumbbell Curl/frames/frame-1.svg
new file mode 100644
index 0000000..62e2695
--- /dev/null
+++ b/Exercise Library/Dumbbell Curl/frames/frame-1.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Dumbbell Curl/frames/frame-2.svg b/Exercise Library/Dumbbell Curl/frames/frame-2.svg
new file mode 100644
index 0000000..2f4013a
--- /dev/null
+++ b/Exercise Library/Dumbbell Curl/frames/frame-2.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Dumbbell Curl/info.md b/Exercise Library/Dumbbell Curl/info.md
new file mode 100644
index 0000000..c79d43b
--- /dev/null
+++ b/Exercise Library/Dumbbell Curl/info.md
@@ -0,0 +1,37 @@
+# Dumbbell Curl
+
+The free-weight biceps curl — elbows pinned to the sides, curl both
+dumbbells from a full hang to the shoulders.
+
+- **Category:** Main circuit
+- **Type:** Free-weight elbow flexion (dumbbells)
+- **Targets:** Biceps, forearms
+- **Prescription:** 3 × 10–12
+
+## Setup
+
+Stand tall with a dumbbell in each hand at your sides, palms forward (or
+turning as you curl), elbows lightly touching the ribs.
+
+## Execution
+
+1. Curl both weights up in an arc until the forearms reach the biceps.
+2. Keep the elbows fixed in place at your sides.
+3. Lower all the way to straight arms — the stretch counts.
+
+## Cues
+
+- Elbows are hinges, not swings — they never travel forward or back.
+- Wrists stay neutral; no flicking at the top.
+- Stand tall; the trunk does not rock.
+
+## Common Mistakes
+
+- Swinging the hips to start the rep.
+- Half reps that skip the bottom stretch.
+- Elbows drifting forward, turning it into a front raise.
+
+## Progression
+
+Add weight only while the torso stays statue-still; alternate arms or
+curl seated to remove all momentum.
diff --git a/Exercise Library/Dumbbell Curl/motion.json b/Exercise Library/Dumbbell Curl/motion.json
new file mode 100644
index 0000000..9539a31
--- /dev/null
+++ b/Exercise Library/Dumbbell Curl/motion.json
@@ -0,0 +1,34 @@
+{
+ "name": "Dumbbell Curl",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["arm_r", "arm_l"],
+ "props": [
+ {"type": "dumbbell", "at": "hand_r"},
+ {"type": "dumbbell", "at": "hand_l"}
+ ],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 1.0,
+ "root": {"pos": [160, 64], "pitch": 3},
+ "spine": [0, 0],
+ "neck": 2, "head": -4,
+ "shoulder_r": 3, "elbow_r": 10,
+ "shoulder_l": 3, "elbow_l": 10,
+ "hip_r": 3, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 3, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150]}
+ },
+ {
+ "hold": 0.4, "tween": 1.2,
+ "root": {"pos": [160, 64], "pitch": 3},
+ "spine": [0, 0],
+ "neck": 2, "head": -4,
+ "shoulder_r": 6, "elbow_r": 128,
+ "shoulder_l": 6, "elbow_l": 128,
+ "hip_r": 3, "knee_r": 2, "ankle_r": 0,
+ "hip_l": 3, "knee_l": 2, "ankle_l": 0,
+ "pins": {"foot_r": [158, 148], "foot_l": [162, 150]}
+ }
+ ]
+}
diff --git a/Exercise Library/Dumbbell Curl/preview.gif b/Exercise Library/Dumbbell Curl/preview.gif
new file mode 100644
index 0000000..9a6de14
Binary files /dev/null and b/Exercise Library/Dumbbell Curl/preview.gif differ
diff --git a/Exercise Library/Dumbbell Curl/visual.svg b/Exercise Library/Dumbbell Curl/visual.svg
new file mode 100644
index 0000000..2f4013a
--- /dev/null
+++ b/Exercise Library/Dumbbell Curl/visual.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Dumbbell Fly/frames/frame-1.svg b/Exercise Library/Dumbbell Fly/frames/frame-1.svg
new file mode 100644
index 0000000..aa94e84
--- /dev/null
+++ b/Exercise Library/Dumbbell Fly/frames/frame-1.svg
@@ -0,0 +1,28 @@
+
diff --git a/Exercise Library/Dumbbell Fly/frames/frame-2.svg b/Exercise Library/Dumbbell Fly/frames/frame-2.svg
new file mode 100644
index 0000000..93b2a37
--- /dev/null
+++ b/Exercise Library/Dumbbell Fly/frames/frame-2.svg
@@ -0,0 +1,28 @@
+
diff --git a/Exercise Library/Dumbbell Fly/info.md b/Exercise Library/Dumbbell Fly/info.md
new file mode 100644
index 0000000..8d5db4c
--- /dev/null
+++ b/Exercise Library/Dumbbell Fly/info.md
@@ -0,0 +1,38 @@
+# Dumbbell Fly
+
+The chest isolation — arms sweep from wide open to over the chest in a
+hugging arc, elbows softly fixed.
+
+- **Category:** Main circuit
+- **Type:** Free-weight chest fly (dumbbells)
+- **Targets:** Chest, front delts
+- **Prescription:** 3 × 10–15, light and controlled
+
+## Setup
+
+Lie on the flat bench with light dumbbells pressed over the chest, palms
+facing each other, a slight fixed bend in the elbows.
+
+## Execution
+
+1. Open the arms in a wide arc until you feel a full chest stretch —
+ hands about level with the chest, never below the shoulders' comfort.
+2. Keep the elbow angle unchanged the entire way.
+3. Sweep back up as if hugging a barrel, squeezing the chest together.
+
+## Cues
+
+- It's an arc, not a press — the elbows never bend and extend.
+- Go light; the stretch does the work, not the load.
+- Stop the descent the moment the chest stretch peaks.
+
+## Common Mistakes
+
+- Bending the elbows on the way down and pressing back up.
+- Dropping too deep and straining the shoulders.
+- Using bench-press weights.
+
+## Progression
+
+Slow the lowering phase and pause in the stretch; the Pec Deck offers
+the same motion with the path guided.
diff --git a/Exercise Library/Dumbbell Fly/motion.json b/Exercise Library/Dumbbell Fly/motion.json
new file mode 100644
index 0000000..3f6af2a
--- /dev/null
+++ b/Exercise Library/Dumbbell Fly/motion.json
@@ -0,0 +1,39 @@
+{
+ "name": "Dumbbell Fly",
+ "primary": 2,
+ "camera": {"yaw": 90},
+ "working": ["arm_r", "arm_l"],
+ "props": [
+ {"type": "scene", "shapes": [
+ {"kind": "line", "pts": [[148, 124], [172, 124]], "w": 8, "depth": 40},
+ {"kind": "line", "pts": [[154, 129], [154, 150]], "w": 4},
+ {"kind": "line", "pts": [[166, 129], [166, 150]], "w": 4}
+ ]},
+ {"type": "dumbbell", "at": "hand_r"},
+ {"type": "dumbbell", "at": "hand_l"}
+ ],
+ "frames": [
+ {
+ "hold": 0.5, "tween": 1.0,
+ "root": {"pos": [160, 116], "pitch": -90},
+ "spine": [0, 0],
+ "neck": 8, "head": 0,
+ "shoulder_r": 88, "elbow_r": 12,
+ "shoulder_l": 88, "elbow_l": 12,
+ "hip_r": {"flexion": 78, "abduction": 10}, "knee_r": 82, "ankle_r": 5,
+ "hip_l": {"flexion": 78, "abduction": 10}, "knee_l": 82, "ankle_l": 5,
+ "pins": {"foot_r": [142, 148], "foot_l": [178, 150]}
+ },
+ {
+ "hold": 0.5, "tween": 1.3,
+ "root": {"pos": [160, 116], "pitch": -90},
+ "spine": [0, 0],
+ "neck": 8, "head": 0,
+ "shoulder_r": {"flexion": 16, "abduction": 84}, "elbow_r": 22,
+ "shoulder_l": {"flexion": 16, "abduction": 84}, "elbow_l": 22,
+ "hip_r": {"flexion": 78, "abduction": 10}, "knee_r": 82, "ankle_r": 5,
+ "hip_l": {"flexion": 78, "abduction": 10}, "knee_l": 82, "ankle_l": 5,
+ "pins": {"foot_r": [142, 148], "foot_l": [178, 150]}
+ }
+ ]
+}
diff --git a/Exercise Library/Dumbbell Fly/preview.gif b/Exercise Library/Dumbbell Fly/preview.gif
new file mode 100644
index 0000000..9e2f142
Binary files /dev/null and b/Exercise Library/Dumbbell Fly/preview.gif differ
diff --git a/Exercise Library/Dumbbell Fly/visual.svg b/Exercise Library/Dumbbell Fly/visual.svg
new file mode 100644
index 0000000..93b2a37
--- /dev/null
+++ b/Exercise Library/Dumbbell Fly/visual.svg
@@ -0,0 +1,28 @@
+
diff --git a/Exercise Library/Dumbbell Row/frames/frame-1.svg b/Exercise Library/Dumbbell Row/frames/frame-1.svg
new file mode 100644
index 0000000..fa1c083
--- /dev/null
+++ b/Exercise Library/Dumbbell Row/frames/frame-1.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Dumbbell Row/frames/frame-2.svg b/Exercise Library/Dumbbell Row/frames/frame-2.svg
new file mode 100644
index 0000000..3ff3cff
--- /dev/null
+++ b/Exercise Library/Dumbbell Row/frames/frame-2.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Dumbbell Row/info.md b/Exercise Library/Dumbbell Row/info.md
new file mode 100644
index 0000000..ae62561
--- /dev/null
+++ b/Exercise Library/Dumbbell Row/info.md
@@ -0,0 +1,39 @@
+# Dumbbell Row
+
+The one-arm row — knee and hand braced on the bench, pull the dumbbell
+from a dead hang to the ribs.
+
+- **Category:** Main circuit
+- **Type:** Free-weight horizontal pull (dumbbell)
+- **Targets:** Lats, mid-back, biceps
+- **Prescription:** 3 × 8–12 per side
+
+## Setup
+
+Put the same-side knee and hand on a bench, the other foot planted on
+the floor. Back flat and parallel to the ground, dumbbell hanging
+straight down from the shoulder.
+
+## Execution
+
+1. Pull the dumbbell up and back toward the hip until the elbow passes
+ the ribs.
+2. Squeeze the shoulder blade at the top.
+3. Lower to a full hang and stretch. Finish the set, then switch sides.
+
+## Cues
+
+- The elbow leads; the hand just holds on.
+- Shoulders stay square to the floor — no twisting to hoist the weight.
+- Long neck, eyes down; the back stays flat.
+
+## Common Mistakes
+
+- Rotating the torso open at the top of each rep.
+- Pulling with the biceps instead of driving the elbow back.
+- Cutting the stretch short at the bottom.
+
+## Progression
+
+Heavier dumbbells while the torso stays quiet; pause each rep at the top
+for a stricter mid-back stimulus.
diff --git a/Exercise Library/Dumbbell Row/motion.json b/Exercise Library/Dumbbell Row/motion.json
new file mode 100644
index 0000000..c264064
--- /dev/null
+++ b/Exercise Library/Dumbbell Row/motion.json
@@ -0,0 +1,39 @@
+{
+ "name": "Dumbbell Row",
+ "primary": 2,
+ "working": ["arm_r"],
+ "props": [
+ {"type": "scene", "shapes": [
+ {"kind": "line", "pts": [[100, 124], [215, 124]], "w": 9, "depth": 8},
+ {"kind": "line", "pts": [[118, 129], [118, 150]], "w": 4},
+ {"kind": "line", "pts": [[196, 129], [196, 150]], "w": 4}
+ ]},
+ {"type": "dumbbell", "at": "hand_r"}
+ ],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 0.9,
+ "root": {"pos": [168, 82], "yaw": 180, "pitch": 80},
+ "spine": [0, 0],
+ "neck": 10, "head": -50,
+ "shoulder_r": 75, "elbow_r": 8,
+ "shoulder_l": 72, "elbow_l": 5,
+ "hip_r": 25, "knee_r": 25, "ankle_r": 10,
+ "hip_l": 80, "knee_l": 95, "ankle_l": -50,
+ "pins": {"foot_r": [196, 148], "foot_l": [202, 122],
+ "hand_l": [66, 120], "hand_r": [92, 125]}
+ },
+ {
+ "hold": 0.5, "tween": 1.1,
+ "root": {"pos": [168, 82], "yaw": 180, "pitch": 80},
+ "spine": [0, 0],
+ "neck": 10, "head": -50,
+ "shoulder_r": 40, "elbow_r": 115,
+ "shoulder_l": 72, "elbow_l": 5,
+ "hip_r": 25, "knee_r": 25, "ankle_r": 10,
+ "hip_l": 80, "knee_l": 95, "ankle_l": -50,
+ "pins": {"foot_r": [196, 148], "foot_l": [202, 122],
+ "hand_l": [66, 120], "hand_r": [100, 86]}
+ }
+ ]
+}
diff --git a/Exercise Library/Dumbbell Row/preview.gif b/Exercise Library/Dumbbell Row/preview.gif
new file mode 100644
index 0000000..1b892da
Binary files /dev/null and b/Exercise Library/Dumbbell Row/preview.gif differ
diff --git a/Exercise Library/Dumbbell Row/visual.svg b/Exercise Library/Dumbbell Row/visual.svg
new file mode 100644
index 0000000..3ff3cff
--- /dev/null
+++ b/Exercise Library/Dumbbell Row/visual.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Dumbbell Shoulder Press/frames/frame-1.svg b/Exercise Library/Dumbbell Shoulder Press/frames/frame-1.svg
new file mode 100644
index 0000000..9fbdf18
--- /dev/null
+++ b/Exercise Library/Dumbbell Shoulder Press/frames/frame-1.svg
@@ -0,0 +1,28 @@
+
diff --git a/Exercise Library/Dumbbell Shoulder Press/frames/frame-2.svg b/Exercise Library/Dumbbell Shoulder Press/frames/frame-2.svg
new file mode 100644
index 0000000..7fc53a6
--- /dev/null
+++ b/Exercise Library/Dumbbell Shoulder Press/frames/frame-2.svg
@@ -0,0 +1,28 @@
+
diff --git a/Exercise Library/Dumbbell Shoulder Press/info.md b/Exercise Library/Dumbbell Shoulder Press/info.md
new file mode 100644
index 0000000..d10140e
--- /dev/null
+++ b/Exercise Library/Dumbbell Shoulder Press/info.md
@@ -0,0 +1,37 @@
+# Dumbbell Shoulder Press
+
+The overhead press with dumbbells — seated against an upright bench,
+press from the shoulders to lockout overhead.
+
+- **Category:** Main circuit
+- **Type:** Free-weight vertical press (dumbbells)
+- **Targets:** Shoulders, triceps, upper chest
+- **Prescription:** 3 × 8–12
+
+## Setup
+
+Set the bench back upright. Sit with the dumbbells at shoulder height,
+palms forward, forearms vertical, feet planted.
+
+## Execution
+
+1. Press both dumbbells straight up until the arms lock out overhead.
+2. Keep the weights over the shoulders — not drifting forward.
+3. Lower under control back to shoulder height.
+
+## Cues
+
+- Forearms vertical from every angle, wrists stacked over elbows.
+- Ribs down; the back stays on the pad, not arching off it.
+- The head moves slightly through at the top — bar path stays vertical.
+
+## Common Mistakes
+
+- Overarching the lower back to press bigger weights.
+- Stopping short of lockout.
+- Letting the dumbbells drift out sideways on the way up.
+
+## Progression
+
+Add weight while the back stays quiet on the pad; standing presses
+recruit more trunk once the seated pattern is strong.
diff --git a/Exercise Library/Dumbbell Shoulder Press/motion.json b/Exercise Library/Dumbbell Shoulder Press/motion.json
new file mode 100644
index 0000000..a3a78de
--- /dev/null
+++ b/Exercise Library/Dumbbell Shoulder Press/motion.json
@@ -0,0 +1,41 @@
+{
+ "name": "Dumbbell Shoulder Press",
+ "primary": 2,
+ "camera": {"zoom": 0.82},
+ "working": ["arm_r", "arm_l"],
+ "props": [
+ {"type": "scene", "shapes": [
+ {"kind": "line", "pts": [[117, 128], [113, 58]], "w": 8, "depth": 8},
+ {"kind": "line", "pts": [[114, 134], [150, 134]], "w": 8, "depth": 8},
+ {"kind": "line", "pts": [[132, 136], [132, 150]], "w": 5}
+ ]},
+ {"type": "dumbbell", "at": "hand_r"},
+ {"type": "dumbbell", "at": "hand_l"}
+ ],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 1.0,
+ "root": {"pos": [130, 124], "pitch": 2},
+ "spine": [0, 2],
+ "neck": 4, "head": -6,
+ "shoulder_r": 35, "elbow_r": 145,
+ "shoulder_l": 35, "elbow_l": 145,
+ "hip_r": 84, "knee_r": 64,
+ "hip_l": 84, "knee_l": 64,
+ "pins": {"foot_r": [176, 150], "foot_l": [180, 151],
+ "hand_r": [146, 30], "hand_l": [150, 32]}
+ },
+ {
+ "hold": 0.4, "tween": 1.2,
+ "root": {"pos": [130, 124], "pitch": 2},
+ "spine": [0, 2],
+ "neck": 4, "head": -6,
+ "shoulder_r": 168, "elbow_r": 8,
+ "shoulder_l": 168, "elbow_l": 8,
+ "hip_r": 84, "knee_r": 64,
+ "hip_l": 84, "knee_l": 64,
+ "pins": {"foot_r": [176, 150], "foot_l": [180, 151],
+ "hand_r": [138, -19], "hand_l": [142, -17]}
+ }
+ ]
+}
diff --git a/Exercise Library/Dumbbell Shoulder Press/preview.gif b/Exercise Library/Dumbbell Shoulder Press/preview.gif
new file mode 100644
index 0000000..8ff48c4
Binary files /dev/null and b/Exercise Library/Dumbbell Shoulder Press/preview.gif differ
diff --git a/Exercise Library/Dumbbell Shoulder Press/visual.svg b/Exercise Library/Dumbbell Shoulder Press/visual.svg
new file mode 100644
index 0000000..7fc53a6
--- /dev/null
+++ b/Exercise Library/Dumbbell Shoulder Press/visual.svg
@@ -0,0 +1,28 @@
+
diff --git a/Exercise Library/Goblet Squat/frames/frame-1.svg b/Exercise Library/Goblet Squat/frames/frame-1.svg
new file mode 100644
index 0000000..74b0728
--- /dev/null
+++ b/Exercise Library/Goblet Squat/frames/frame-1.svg
@@ -0,0 +1,22 @@
+
diff --git a/Exercise Library/Goblet Squat/frames/frame-2.svg b/Exercise Library/Goblet Squat/frames/frame-2.svg
new file mode 100644
index 0000000..c16081f
--- /dev/null
+++ b/Exercise Library/Goblet Squat/frames/frame-2.svg
@@ -0,0 +1,22 @@
+
diff --git a/Exercise Library/Goblet Squat/info.md b/Exercise Library/Goblet Squat/info.md
new file mode 100644
index 0000000..1f59bac
--- /dev/null
+++ b/Exercise Library/Goblet Squat/info.md
@@ -0,0 +1,37 @@
+# Goblet Squat
+
+The dumbbell squat — hold one dumbbell vertically at the chest and squat
+between the heels. The friendliest way to load a squat.
+
+- **Category:** Main circuit
+- **Type:** Free-weight squat (dumbbell)
+- **Targets:** Quadriceps, glutes, trunk
+- **Prescription:** 3 × 10–12
+
+## Setup
+
+Hold a dumbbell vertically against your chest, both palms cupping the top
+end, elbows pointing down. Feet shoulder-width, toes slightly out.
+
+## Execution
+
+1. Squat down between the heels, keeping the dumbbell glued to the chest.
+2. Reach full depth — elbows travel inside the knees.
+3. Stand back up tall without letting the weight tip you forward.
+
+## Cues
+
+- The counterweight in front lets the torso stay very upright — use it.
+- Elbows brush the inside of the knees at the bottom.
+- Whole foot planted; drive through the heels.
+
+## Common Mistakes
+
+- Letting the dumbbell drift away from the chest.
+- Cutting depth short.
+- Collapsing the upper back as the weight gets heavy.
+
+## Progression
+
+Heavier dumbbells until they're awkward to hold — then move to the
+Barbell Squat.
diff --git a/Exercise Library/Goblet Squat/motion.json b/Exercise Library/Goblet Squat/motion.json
new file mode 100644
index 0000000..ed964ab
--- /dev/null
+++ b/Exercise Library/Goblet Squat/motion.json
@@ -0,0 +1,35 @@
+{
+ "name": "Goblet Squat",
+ "primary": 2,
+ "camera": {"zoom": 0.72},
+ "working": ["leg_r", "leg_l"],
+ "props": [
+ {"type": "dumbbell", "at": ["hand_r", "hand_l"], "angle": 90, "halfLen": 8, "plateR": 5}
+ ],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 1.0,
+ "root": {"pos": [160, 66], "pitch": 5},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 38, "elbow_r": 125,
+ "shoulder_l": 38, "elbow_l": 125,
+ "hip_r": 5, "knee_r": 4, "ankle_r": 0,
+ "hip_l": 5, "knee_l": 4, "ankle_l": 0,
+ "pins": {"foot_r": [162, 148], "foot_l": [166, 150],
+ "hand_r": [176, -2], "hand_l": [180, 0]}
+ },
+ {
+ "hold": 0.4, "tween": 1.0,
+ "root": {"pos": [150, 104], "pitch": 22},
+ "spine": [0, -4],
+ "neck": 4, "head": -18,
+ "shoulder_r": 46, "elbow_r": 120,
+ "shoulder_l": 46, "elbow_l": 120,
+ "hip_r": 96, "knee_r": 116, "ankle_r": 20,
+ "hip_l": 96, "knee_l": 116, "ankle_l": 20,
+ "pins": {"foot_r": [162, 148], "foot_l": [166, 150],
+ "hand_r": [190, 40], "hand_l": [194, 42]}
+ }
+ ]
+}
diff --git a/Exercise Library/Goblet Squat/preview.gif b/Exercise Library/Goblet Squat/preview.gif
new file mode 100644
index 0000000..11be840
Binary files /dev/null and b/Exercise Library/Goblet Squat/preview.gif differ
diff --git a/Exercise Library/Goblet Squat/visual.svg b/Exercise Library/Goblet Squat/visual.svg
new file mode 100644
index 0000000..c16081f
--- /dev/null
+++ b/Exercise Library/Goblet Squat/visual.svg
@@ -0,0 +1,22 @@
+
diff --git a/Exercise Library/Incline Bench Press/frames/frame-1.svg b/Exercise Library/Incline Bench Press/frames/frame-1.svg
new file mode 100644
index 0000000..2fcb796
--- /dev/null
+++ b/Exercise Library/Incline Bench Press/frames/frame-1.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Incline Bench Press/frames/frame-2.svg b/Exercise Library/Incline Bench Press/frames/frame-2.svg
new file mode 100644
index 0000000..a16e169
--- /dev/null
+++ b/Exercise Library/Incline Bench Press/frames/frame-2.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Incline Bench Press/info.md b/Exercise Library/Incline Bench Press/info.md
new file mode 100644
index 0000000..4460e66
--- /dev/null
+++ b/Exercise Library/Incline Bench Press/info.md
@@ -0,0 +1,37 @@
+# Incline Bench Press
+
+The barbell press on the tilted bench — same press, aimed at the upper
+chest.
+
+- **Category:** Main circuit
+- **Type:** Free-weight incline press
+- **Targets:** Upper chest, front delts, triceps
+- **Prescription:** 3 × 8–10
+
+## Setup
+
+Set the bench to a moderate incline (around 30–45°). Lie back with the
+bar over the eyes, shoulder blades set, feet planted.
+
+## Execution
+
+1. Lower the bar to the upper chest, just below the collarbones.
+2. Touch lightly, keeping the forearms vertical.
+3. Press straight up to lockout above the shoulders.
+
+## Cues
+
+- The steeper the bench, the more shoulder and less chest.
+- Ribcage up, but hips stay on the pad.
+- Bar path is a straight vertical line on the incline.
+
+## Common Mistakes
+
+- Sliding the bar path out over the belly.
+- Overarching to turn it back into a flat press.
+- Grip too wide for the shorter incline stroke.
+
+## Progression
+
+Work up in weight after the flat Bench Press, not before it; dumbbells
+on the same bench trade load for range.
diff --git a/Exercise Library/Incline Bench Press/motion.json b/Exercise Library/Incline Bench Press/motion.json
new file mode 100644
index 0000000..75ef343
--- /dev/null
+++ b/Exercise Library/Incline Bench Press/motion.json
@@ -0,0 +1,40 @@
+{
+ "name": "Incline Bench Press",
+ "primary": 1,
+ "camera": {"zoom": 0.85},
+ "working": ["arm_r", "arm_l"],
+ "props": [
+ {"type": "scene", "shapes": [
+ {"kind": "line", "pts": [[142, 127], [86, 60]], "w": 9, "depth": 8},
+ {"kind": "line", "pts": [[140, 130], [166, 127]], "w": 8, "depth": 8},
+ {"kind": "line", "pts": [[152, 133], [152, 150]], "w": 5}
+ ]},
+ {"type": "bar", "at": ["hand_r", "hand_l"], "halfLen": 26, "plateR": 12}
+ ],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 0.9,
+ "root": {"pos": [148, 122], "pitch": -38},
+ "spine": [0, 0],
+ "neck": 18, "head": -4,
+ "shoulder_r": 30, "elbow_r": 115,
+ "shoulder_l": 30, "elbow_l": 115,
+ "hip_r": 85, "knee_r": 75, "ankle_r": 5,
+ "hip_l": 85, "knee_l": 75, "ankle_l": 5,
+ "pins": {"foot_r": [198, 148], "foot_l": [202, 150],
+ "hand_r": [106, 38], "hand_l": [110, 40]}
+ },
+ {
+ "hold": 0.4, "tween": 1.2,
+ "root": {"pos": [148, 122], "pitch": -38},
+ "spine": [0, 0],
+ "neck": 18, "head": -4,
+ "shoulder_r": 118, "elbow_r": 5,
+ "shoulder_l": 118, "elbow_l": 5,
+ "hip_r": 85, "knee_r": 75, "ankle_r": 5,
+ "hip_l": 85, "knee_l": 75, "ankle_l": 5,
+ "pins": {"foot_r": [198, 148], "foot_l": [202, 150],
+ "hand_r": [98, -3], "hand_l": [102, -1]}
+ }
+ ]
+}
diff --git a/Exercise Library/Incline Bench Press/preview.gif b/Exercise Library/Incline Bench Press/preview.gif
new file mode 100644
index 0000000..7b777ff
Binary files /dev/null and b/Exercise Library/Incline Bench Press/preview.gif differ
diff --git a/Exercise Library/Incline Bench Press/visual.svg b/Exercise Library/Incline Bench Press/visual.svg
new file mode 100644
index 0000000..2fcb796
--- /dev/null
+++ b/Exercise Library/Incline Bench Press/visual.svg
@@ -0,0 +1,25 @@
+
diff --git a/Exercise Library/Lateral Raise/frames/frame-1.svg b/Exercise Library/Lateral Raise/frames/frame-1.svg
new file mode 100644
index 0000000..d7dd63a
--- /dev/null
+++ b/Exercise Library/Lateral Raise/frames/frame-1.svg
@@ -0,0 +1,24 @@
+
diff --git a/Exercise Library/Lateral Raise/frames/frame-2.svg b/Exercise Library/Lateral Raise/frames/frame-2.svg
new file mode 100644
index 0000000..54a18d6
--- /dev/null
+++ b/Exercise Library/Lateral Raise/frames/frame-2.svg
@@ -0,0 +1,24 @@
+
diff --git a/Exercise Library/Lateral Raise/info.md b/Exercise Library/Lateral Raise/info.md
new file mode 100644
index 0000000..1ff8e09
--- /dev/null
+++ b/Exercise Library/Lateral Raise/info.md
@@ -0,0 +1,37 @@
+# Lateral Raise
+
+The side-delt isolation — raise light dumbbells out to the sides until
+the arms are level with the shoulders.
+
+- **Category:** Main circuit
+- **Type:** Free-weight lateral raise (dumbbells)
+- **Targets:** Side delts
+- **Prescription:** 3 × 12–15, light
+
+## Setup
+
+Stand tall with light dumbbells at your sides, a slight fixed bend in
+the elbows, shoulders relaxed down.
+
+## Execution
+
+1. Raise both arms out to the sides, leading with the elbows.
+2. Stop at shoulder height — arms level, pinkies no higher than thumbs.
+3. Lower slowly back to the sides.
+
+## Cues
+
+- Pour-the-jug: elbows stay just above the hands.
+- Shoulders stay down away from the ears — no shrugging.
+- The weights float up; the trunk never sways.
+
+## Common Mistakes
+
+- Going too heavy and swinging the weights up.
+- Shrugging the traps into the raise.
+- Raising past shoulder height.
+
+## Progression
+
+More reps before more weight; slow negatives and pauses at the top beat
+bigger dumbbells here.
diff --git a/Exercise Library/Lateral Raise/motion.json b/Exercise Library/Lateral Raise/motion.json
new file mode 100644
index 0000000..58806f7
--- /dev/null
+++ b/Exercise Library/Lateral Raise/motion.json
@@ -0,0 +1,32 @@
+{
+ "name": "Lateral Raise",
+ "primary": 2,
+ "camera": {"yaw": 90, "zoom": 0.7},
+ "working": ["arm_r", "arm_l"],
+ "props": [
+ {"type": "dumbbell", "at": "hand_r"},
+ {"type": "dumbbell", "at": "hand_l"}
+ ],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 1.0,
+ "root": {"pos": [160, 64]},
+ "spine": [0, 0],
+ "neck": 0, "head": 0,
+ "shoulder_r": {"flexion": 4, "abduction": 8}, "elbow_r": 10,
+ "shoulder_l": {"flexion": 4, "abduction": 8}, "elbow_l": 10,
+ "hip_r": {"flexion": 0, "abduction": 6}, "knee_r": 0,
+ "hip_l": {"flexion": 0, "abduction": 6}, "knee_l": 0
+ },
+ {
+ "hold": 0.5, "tween": 1.3,
+ "root": {"pos": [160, 64]},
+ "spine": [0, 0],
+ "neck": 0, "head": 0,
+ "shoulder_r": {"flexion": 4, "abduction": 88}, "elbow_r": 12,
+ "shoulder_l": {"flexion": 4, "abduction": 88}, "elbow_l": 12,
+ "hip_r": {"flexion": 0, "abduction": 6}, "knee_r": 0,
+ "hip_l": {"flexion": 0, "abduction": 6}, "knee_l": 0
+ }
+ ]
+}
diff --git a/Exercise Library/Lateral Raise/preview.gif b/Exercise Library/Lateral Raise/preview.gif
new file mode 100644
index 0000000..6c37dbc
Binary files /dev/null and b/Exercise Library/Lateral Raise/preview.gif differ
diff --git a/Exercise Library/Lateral Raise/visual.svg b/Exercise Library/Lateral Raise/visual.svg
new file mode 100644
index 0000000..54a18d6
--- /dev/null
+++ b/Exercise Library/Lateral Raise/visual.svg
@@ -0,0 +1,24 @@
+
diff --git a/Exercise Library/Lunge/frames/frame-1.svg b/Exercise Library/Lunge/frames/frame-1.svg
new file mode 100644
index 0000000..06c583f
--- /dev/null
+++ b/Exercise Library/Lunge/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Lunge/frames/frame-2.svg b/Exercise Library/Lunge/frames/frame-2.svg
new file mode 100644
index 0000000..c758334
--- /dev/null
+++ b/Exercise Library/Lunge/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Lunge/info.md b/Exercise Library/Lunge/info.md
new file mode 100644
index 0000000..9cd1b2d
--- /dev/null
+++ b/Exercise Library/Lunge/info.md
@@ -0,0 +1,38 @@
+# Lunge
+
+The split-stance squat — drop the back knee toward the floor, then drive
+back up through the front heel. Bodyweight first, dumbbells in hand later.
+
+- **Category:** Main circuit
+- **Type:** Split-stance squat (bodyweight or dumbbells)
+- **Targets:** Quadriceps, glutes, balance
+- **Prescription:** 3 × 8–10 per side
+
+## Setup
+
+Take a long step so both knees can bend to 90° — front shin vertical,
+back heel up. Hips square to the front, hands at your sides or on hips.
+
+## Execution
+
+1. Lower straight down until the back knee hovers just above the floor.
+2. The front knee stays over the mid-foot, torso upright.
+3. Drive through the front heel to come back up. Finish the set, then
+ switch sides.
+
+## Cues
+
+- Down like an elevator, not forward like a slide.
+- Front heel carries the work; the back leg balances.
+- Squeeze the front glute to stand up.
+
+## Common Mistakes
+
+- Stance too short — the front knee shoots past the toes.
+- Torso pitching forward on the way up.
+- Pushing off the back foot instead of the front heel.
+
+## Progression
+
+Hold a dumbbell in each hand; step backward into each rep (reverse lunge)
+or elevate the back foot for a split squat.
diff --git a/Exercise Library/Lunge/motion.json b/Exercise Library/Lunge/motion.json
new file mode 100644
index 0000000..3101682
--- /dev/null
+++ b/Exercise Library/Lunge/motion.json
@@ -0,0 +1,30 @@
+{
+ "name": "Lunge",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["leg_r", "leg_l"],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 1.0,
+ "root": {"pos": [160, 68], "pitch": 6},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 5, "elbow_r": 8,
+ "shoulder_l": 5, "elbow_l": 8,
+ "hip_r": 25, "knee_r": 10, "ankle_r": 5,
+ "hip_l": -25, "knee_l": 10, "ankle_l": -12,
+ "pins": {"foot_r": [196, 148], "foot_l": [124, 147]}
+ },
+ {
+ "hold": 0.4, "tween": 1.0,
+ "root": {"pos": [160, 106], "pitch": 8},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 5, "elbow_r": 8,
+ "shoulder_l": 5, "elbow_l": 8,
+ "hip_r": 80, "knee_r": 95, "ankle_r": 15,
+ "hip_l": -12, "knee_l": 100, "ankle_l": -42,
+ "pins": {"foot_r": [196, 148], "foot_l": [124, 147]}
+ }
+ ]
+}
diff --git a/Exercise Library/Lunge/preview.gif b/Exercise Library/Lunge/preview.gif
new file mode 100644
index 0000000..93ad0b1
Binary files /dev/null and b/Exercise Library/Lunge/preview.gif differ
diff --git a/Exercise Library/Lunge/visual.svg b/Exercise Library/Lunge/visual.svg
new file mode 100644
index 0000000..c758334
--- /dev/null
+++ b/Exercise Library/Lunge/visual.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Pull-Up/frames/frame-1.svg b/Exercise Library/Pull-Up/frames/frame-1.svg
new file mode 100644
index 0000000..f1bdcc8
--- /dev/null
+++ b/Exercise Library/Pull-Up/frames/frame-1.svg
@@ -0,0 +1,20 @@
+
diff --git a/Exercise Library/Pull-Up/frames/frame-2.svg b/Exercise Library/Pull-Up/frames/frame-2.svg
new file mode 100644
index 0000000..0a52dc2
--- /dev/null
+++ b/Exercise Library/Pull-Up/frames/frame-2.svg
@@ -0,0 +1,20 @@
+
diff --git a/Exercise Library/Pull-Up/info.md b/Exercise Library/Pull-Up/info.md
new file mode 100644
index 0000000..d6b7956
--- /dev/null
+++ b/Exercise Library/Pull-Up/info.md
@@ -0,0 +1,37 @@
+# Pull-Up
+
+The vertical pull — from a dead hang, pull the chin over the bar and
+lower all the way back down.
+
+- **Category:** Main circuit
+- **Type:** Bodyweight vertical pull
+- **Targets:** Lats, biceps, mid-back, grip
+- **Prescription:** 3 × as many strict reps as possible
+
+## Setup
+
+Grip the bar just outside shoulder-width, palms away. Hang with straight
+arms, shoulders active (pulled slightly down), knees bent or legs long.
+
+## Execution
+
+1. Drive the elbows down toward the ribs to pull the body up.
+2. Chin clears the bar — chest toward it, not chin poking over.
+3. Lower with control to a full dead hang every rep.
+
+## Cues
+
+- Start every rep from straight arms; half hangs don't count.
+- Think "elbows to pockets", not "chin to bar".
+- Quiet body — no swinging or kicking.
+
+## Common Mistakes
+
+- Kipping and swinging for extra reps.
+- Stopping the descent halfway.
+- Shrugging the shoulders to the ears at the top.
+
+## Progression
+
+Use the assisted pull-up machine or a band until 5 strict reps come
+easily; then add reps, then hang weight from a belt.
diff --git a/Exercise Library/Pull-Up/motion.json b/Exercise Library/Pull-Up/motion.json
new file mode 100644
index 0000000..36b0eb5
--- /dev/null
+++ b/Exercise Library/Pull-Up/motion.json
@@ -0,0 +1,33 @@
+{
+ "name": "Pull-Up",
+ "primary": 2,
+ "camera": {"zoom": 0.7},
+ "working": ["arm_r", "arm_l"],
+ "props": [
+ {"type": "bar", "at": ["hand_r", "hand_l"], "halfLen": 24}
+ ],
+ "frames": [
+ {
+ "hold": 0.5, "tween": 1.0,
+ "root": {"pos": [156, 99]},
+ "spine": [0, 0],
+ "neck": 2, "head": -6,
+ "shoulder_r": 182, "elbow_r": 5,
+ "shoulder_l": 182, "elbow_l": 5,
+ "hip_r": 35, "knee_r": 120, "ankle_r": -30,
+ "hip_l": 35, "knee_l": 120, "ankle_l": -30,
+ "pins": {"hand_r": [154, -46], "hand_l": [158, -44]}
+ },
+ {
+ "hold": 0.4, "tween": 1.3,
+ "root": {"pos": [156, 67]},
+ "spine": [0, 0],
+ "neck": 4, "head": -10,
+ "shoulder_r": 150, "elbow_r": 125,
+ "shoulder_l": 150, "elbow_l": 125,
+ "hip_r": 35, "knee_r": 120, "ankle_r": -30,
+ "hip_l": 35, "knee_l": 120, "ankle_l": -30,
+ "pins": {"hand_r": [154, -46], "hand_l": [158, -44]}
+ }
+ ]
+}
diff --git a/Exercise Library/Pull-Up/preview.gif b/Exercise Library/Pull-Up/preview.gif
new file mode 100644
index 0000000..08efb10
Binary files /dev/null and b/Exercise Library/Pull-Up/preview.gif differ
diff --git a/Exercise Library/Pull-Up/visual.svg b/Exercise Library/Pull-Up/visual.svg
new file mode 100644
index 0000000..0a52dc2
--- /dev/null
+++ b/Exercise Library/Pull-Up/visual.svg
@@ -0,0 +1,20 @@
+
diff --git a/Exercise Library/Push-Up/frames/frame-1.svg b/Exercise Library/Push-Up/frames/frame-1.svg
new file mode 100644
index 0000000..7eb5851
--- /dev/null
+++ b/Exercise Library/Push-Up/frames/frame-1.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Push-Up/frames/frame-2.svg b/Exercise Library/Push-Up/frames/frame-2.svg
new file mode 100644
index 0000000..a5b099c
--- /dev/null
+++ b/Exercise Library/Push-Up/frames/frame-2.svg
@@ -0,0 +1,19 @@
+
diff --git a/Exercise Library/Push-Up/info.md b/Exercise Library/Push-Up/info.md
new file mode 100644
index 0000000..99f8f9e
--- /dev/null
+++ b/Exercise Library/Push-Up/info.md
@@ -0,0 +1,38 @@
+# Push-Up
+
+The bodyweight press — a moving plank: lower the chest to the floor and
+press back up without the hips sagging.
+
+- **Category:** Warm-up and main circuit
+- **Type:** Bodyweight horizontal press
+- **Targets:** Chest, front delts, triceps, trunk
+- **Prescription:** 3 × 8–15
+
+## Setup
+
+Hands under the shoulders, legs long, toes tucked. Squeeze the glutes
+and brace so the body is one straight line from head to heels.
+
+## Execution
+
+1. Bend the elbows about 45° from the body and lower the chest toward
+ the floor.
+2. Stop a fist's height off the ground, body still one line.
+3. Press the floor away to straight arms.
+
+## Cues
+
+- The plank never breaks — hips neither sag nor pike.
+- Screw the hands into the floor to keep the elbows tracking.
+- Chest leads the descent, not the chin or the hips.
+
+## Common Mistakes
+
+- Hips sagging into a banana shape.
+- Flaring the elbows to 90°.
+- Craning the neck at the floor.
+
+## Progression
+
+Start from an incline (hands on a bench) if reps stall; graduate to feet
+elevated, then slow negatives.
diff --git a/Exercise Library/Push-Up/motion.json b/Exercise Library/Push-Up/motion.json
new file mode 100644
index 0000000..f45c83d
--- /dev/null
+++ b/Exercise Library/Push-Up/motion.json
@@ -0,0 +1,31 @@
+{
+ "name": "Push-Up",
+ "primary": 1,
+ "working": ["arm_r", "arm_l"],
+ "frames": [
+ {
+ "hold": 0.4, "tween": 0.9,
+ "root": {"pos": [180, 115], "yaw": 180, "pitch": 73},
+ "spine": [0, 0],
+ "neck": 0, "head": -60,
+ "shoulder_r": 90, "elbow_r": 8,
+ "shoulder_l": 90, "elbow_l": 8,
+ "hip_r": 5, "knee_r": 3, "ankle_r": 25,
+ "hip_l": 5, "knee_l": 3, "ankle_l": 25,
+ "pins": {"hand_r": [97, 148], "hand_l": [101, 150],
+ "foot_r": [256, 143], "foot_l": [260, 145]}
+ },
+ {
+ "hold": 0.4, "tween": 0.9,
+ "root": {"pos": [180, 132], "yaw": 180, "pitch": 85},
+ "spine": [0, 0],
+ "neck": 0, "head": -55,
+ "shoulder_r": 60, "elbow_r": 110,
+ "shoulder_l": 60, "elbow_l": 110,
+ "hip_r": 5, "knee_r": 3, "ankle_r": 25,
+ "hip_l": 5, "knee_l": 3, "ankle_l": 25,
+ "pins": {"hand_r": [97, 148], "hand_l": [101, 150],
+ "foot_r": [256, 143], "foot_l": [260, 145]}
+ }
+ ]
+}
diff --git a/Exercise Library/Push-Up/preview.gif b/Exercise Library/Push-Up/preview.gif
new file mode 100644
index 0000000..277b0c3
Binary files /dev/null and b/Exercise Library/Push-Up/preview.gif differ
diff --git a/Exercise Library/Push-Up/visual.svg b/Exercise Library/Push-Up/visual.svg
new file mode 100644
index 0000000..7eb5851
--- /dev/null
+++ b/Exercise Library/Push-Up/visual.svg
@@ -0,0 +1,19 @@
+