Under the hood · 13
The exercise catalogue, bodyweight and assisted loads
Where each exercise's muscles come from (direct, indirect and stabilizer roles backed by cited studies or stated biomechanics), how the 316 built-in exercises are generated, and what the weight field means for pull-ups, dips, push-ups and assisted machines.
Every number in Logex starts with two facts about an exercise: which muscles it trains, and what the number in the weight field means. For a barbell bench press both are obvious. For a pull-up with a 25 lb plate, or an assisted dip machine set to 160, they are not. This post explains how the catalogue answers both questions.
In plain terms. Each exercise lists the muscles that move the load (they count a full set), the ones that help (half a set) and the ones that only hold you steady (nothing). Each role is backed by a study or a stated biomechanical reason. For bodyweight work, Logex adds your bodyweight to what you typed, or subtracts the assistance, so a pull-up has a real load and less assistance counts as progress.
One list of muscles
All muscles come from one list of 37 canonical muscles (docs/catalog/muscles.json). Each has a stable id, a group (chest, back, shoulders, biceps, triceps, legs, core, forearms, neck) and at most one weekly-volume tag. Some are tracked but never counted toward weekly volume: forearms, brachioradialis, tibialis, serratus, rotator cuff, the deep abdominals and the neck.
Older catalogue lines and custom exercises named muscles in free text. Those strings now resolve to canonical muscles through an exact alias table: “Triceps brachii” means all three heads, “Biceps brachii” both biceps heads, “Erector spinae (isometric)” can only ever be a stabilizer. Nothing is matched by fragments any more, which is what used to credit “biceps” from “biceps femoris”. Unknown strings earn nothing and are listed in Data hygiene.
The three roles
| Role | Credit per set | Rule |
|---|---|---|
| Direct | 1 | A prime mover of the joint action that limits the load |
| Indirect | 0.5 | A moving synergist at a joint action that does not limit the load |
| Stabilizer | 0 | Works isometrically, or is only a minor helper. Tracked, never counted |
The credits are the fractional set counting that fitted best in Pelland et al. (2025). How they add up over a week is in Weekly volume.
Every muscle line in the catalogue must carry either a reference from a checked list of 14 studies, or one of a short list of allowed biomechanical reasons (prime mover, moving synergist, isometric stabilizer and so on). Muscle activity on EMG alone never justifies a direct role (Vigotsky et al. 2022), and an audit script enforces the rules. A few examples of what the evidence changed:
- Squats train the quads (vasti), glutes and adductors directly. The rectus femoris and hamstrings are stabilizers, because they do not grow from squatting (Kubo et al. 2019), so squats no longer count as hamstring work.
- Flat bench credits the upper chest as a synergist (Chaves et al. 2020); the incline press trains it directly.
- Rows and pulldowns credit the rear delts and biceps at half a set.
- Standing calf raises train the gastrocnemius; seated ones do not (Kinoshita et al. 2023).
An exercise’s detail page shows its direct, indirect and stabilizer muscles as chips, an evidence badge (“Cited”, “Partly cited” or “Biomechanics”, or “Your setup” for a custom exercise), and the reasons and sources behind the ⓘ. Movements that load a muscle at long length, such as overhead triceps extensions, seated leg curls and standing calf raises, carry a “Stretch focus” pill.
How the catalogue is built
The built-in exercises are not hand-typed rows. A script generates them from 56 movement templates (a flat press, a vertical pull, a hinge…), each with its cited muscle roles, plus variant modifiers (grip, incline, unilateral and so on). Each exercise keeps a frozen id that never changes.
The catalogue has 316 active exercises, out of 319 entries: three duplicates were retired, never deleted, and point at the exercise that replaced them. Your phone rewrites its copy in one database transaction, only when the catalogue’s revision changes or a row is missing. When that happens, the muscle-balance cache and the derived fatigue columns are rebuilt so old numbers do not linger.
Custom exercises
A new custom exercise starts from one of the same movement templates. You see its direct and indirect muscles, tap any muscle between direct, indirect and off, and choose how its weight is logged (below). Nothing else is inferred. Custom exercises can be edited later from their detail page.
When a custom exercise matches a built-in one by name or alias, its detail and stats screens offer “Built-in version available”, with a Switch button. Switching keeps every session, set and routine line, moves the favourite, archives the custom exercise and recomputes both exercises’ statistics. Undo reverses it.
What the weight field means
Every exercise has a load mode. The number you type is always stored as you typed it, in pounds (Units, storage and sync). The load mode says what it means, and every engine that needs a weight uses the load actually moved:
| Load mode | You type | Load moved | Examples |
|---|---|---|---|
| Weight | the load | the load | bench press, cable row |
| Bodyweight + added | added weight (blank or 0 = bodyweight) | f × bodyweight + added | pull-up, dip, push-up |
| Assisted | the assistance | max(0, f × bodyweight − assistance) | assisted pull-up and dip machines |
| Bodyweight only | nothing | f × bodyweight, or unknown | hanging leg raise, nordic curl |
f is the share of your body mass the movement actually lifts. Hanging and supported movements (pull-ups, chin-ups, dips, the assisted machines) use 0.95, because your hands and forearms, about 4 to 5% of body mass, do not move (de Leva 1996). Push-ups use force-plate measurements: 0.64 for a standard push-up, from 0.41 (high incline) to 0.74 (high decline) for the variants (Ebben et al. 2011, Wurm et al. 2010). Where no study gives a share, the catalogue says so and the load is unknown rather than guessed.
The bodyweight is the one stored with that workout. New workouts take it from your profile, and older workouts without one fall back to your profile bodyweight.
Set rows show the result as a short caption, such as BW+15 or BW−160, with the maths behind the ⓘ.
Worked example
You weigh 180 lb, so a hanging movement lifts 0.95 × 180 = 171 lb.
| Set | Load moved |
|---|---|
| Pull-up, blank | 171 lb |
| Pull-up, +25 lb | 171 + 25 = 196 lb, so 8 reps is an e1RM of 196 × (1 + 8 ÷ 30) = 248.3 |
| Assisted pull-up, 60 lb assistance | 171 − 60 = 111 lb |
| Assisted pull-up, 40 lb assistance | 171 − 40 = 131 lb: less help reads as a heavier lift |
| Push-up | 0.64 × 180 = 115.2 lb |
So maxes, e1RM, quality scores, the Live Set Coach, badges and the stats trend all see cutting assistance as progress. The planner works the same way and turns its suggestion back into what you type, snapped to the machine’s step.
When the load cannot be known
Sometimes there is no honest number: you have no bodyweight on file, the movement has no established share, or the machine’s assistance is at or above the load you would lift (lever machines often list more assistance than you weigh). Logex then never invents a load. The sets still count for your muscles, but no volume, e1RM or PR is made from them, screens show “—” instead of “0 lb”, and the exercise’s progress is tracked in one space only, never mixed:
| Space | Used when | Better means |
|---|---|---|
| Assistance | assisted, with any session at no known load | less assistance at the same or more reps |
| Added weight | bodyweight + added, with no known load | more added weight at the same or more reps |
| Reps | bodyweight only | more reps |
A session sets a record when one of its sets beats every earlier set on that rule. The first session never does.
Example: at 180 lb you log assisted dips for the same reps at 235, then 200, then 160 lb of assistance. The first two are above 171, so no load is moved and the series is tracked by assistance: “Assistance · lower is better”, with a record at 200 and again at 160. Before this change those sessions showed as three blanks.
Changing the exercise
Each exercise in a saved or live workout has a swap button. The picker lists the closest stand-ins first:
score = 3 if same family ("does the same job") + 1 if same movement pattern
+ 2 × share of the original's direct muscles it also trains directly (indirect counts half)
+ 0.5 if you have the equipment, − 1 if not
The card keeps its sets, weights, reps and times and takes the new exercise. When the two read the weight differently the card says so (“2 sets will read as assistance”), and a swap that would drop logged 0 lb sets is refused. Saving re-scores the session on the new exercise and rebuilds both exercises’ statistics. This is also how pull-ups that were really done on the assisted machine move there; a one-time Home card asks about older weighted pull-ups and dips for the same reason.
Limits and edge cases
- Three roles are a summary. They are what the evidence supports, not a claim that one exercise is 0.7 of another.
- The bodyweight share is an average. 0.95 and the push-up shares come from measured groups, not from you.
- Strength tiers for pull-ups, chin-ups and dips use reps, because the published standards are rep counts (Strength standards). The assisted machines have no standard.
- Old data stays as typed. Stored weights are never rewritten; only how they are read changed, and the statistics for bodyweight lifts were rebuilt once.