How a set becomes volume, and what the muscle map counts
How a set becomes volume, how bodyweight work is priced, and what the muscle map is counting.
By Kiptly ·
On this page
- Volume is one multiplication
- Which sets are in the sum
- Where the weight comes from
- When the body is the load
- What each movement is priced at
- When the app declines to price a set
- What the muscle map is counting
- What the map is not
- Why the total disappears when you share a session
- The numbers, and where they live
- What this page does not claim
Volume is one multiplication
The volume of a session is the load of every set multiplied by its reps, added up. Nothing is weighted: a squat set and a curl set of the same tonnage contribute the same amount, a compound lift earns no bonus, and how hard the set felt never enters it.
Two-implement exercises count both. A set of ten with a pair of 20 kg dumbbells is 400 kg, not 200 — the multiplier defaults to one, so barbell and machine work is unaffected.
Range of motion, tempo and time under tension are not in the arithmetic at all. A quarter squat and a full squat with the same bar for the same reps produce the same number, because nothing in what you typed distinguishes them. That is a limit of the method, not an oversight to be fixed later: the app would have to guess at the missing half, and a guessed number in a total looks exactly like a counted one.
Which sets are in the sum
Warm-ups are excluded by default. There is a setting that folds them in, and the set counter beside the tonnage reads the same flag — so the two figures on that card always count the same population, which was worth fixing and is worth stating.
A set with no reps contributes no kilograms. A timed plank or a distance row still counts as a set you performed, and still appears in the set count; it simply has no multiplication to offer.
A set you have not ticked off still counts towards volume, as long as it carries reps. This is deliberate and it is the one place volume and personal records look at different things. The live header shows the planned volume of a prefilled session from the first second, and the total written when you finish counts those same sets, so the two never disagree with each other. Records are stricter: they only look at sets you actually marked done.
Where the weight comes from
Three branches and a refusal, in one function that every load number in the product passes through — the session total, the records, the charts and the muscle map all inherit it, and the app carries a copy for offline logging that is checked equal to the server’s to within a millionth of a kilogram.
For an ordinary exercise the load is the weight you typed, unchanged. For an assisted exercise — a gravitron, where the machine takes weight off you — the number you type is the assistance, so the load is your body mass minus that, floored at zero. For an exercise priced off your body mass, the load is your mass times a fraction of it, plus anything you hung off a belt.
And the refusal: when the app cannot work out an absolute load, the function returns nothing at all and the set is skipped. It is never counted as zero. Zero is a value that would drag a total down and sit in an average; nothing is the truth about a set whose load is unknown.
When the body is the load
For calisthenics the fraction is the share of your body mass the movement actually raises. It is not a difficulty rating, and that single rule is what makes the whole table checkable by anyone: a one-arm push-up carries the same share as a two-arm one, because the same mass travels the same distance and it is merely harder per arm.
So a pull-up, a chin-up and a dip are the whole of you, and carry 1.00. A push-up is 0.64, which comes from force-plate measurements rather than from anybody’s opinion. A bodyweight squat is 0.88 — all of you, less the shins and feet that stay on the floor, taken from a standard table of segment masses.
Your own figure wins if you set one. The app resolves the fraction as your override first, then the catalogue value, then nothing at all — and the override is allowed even where the catalogue offers no value, which is the only way most calisthenics exercises ever count towards anything.
What each movement is priced at
The complete table the app ships, read out of the seed when this site was built. Note what it does not contain as much as what it does: where an external support takes a share nobody can pin down — a rail, a band, a bench under your feet — or where the movement is a lever rather than a lift, no fraction is assigned and none is invented.
| Exercise | Equipment | Share of body mass |
|---|---|---|
| Chin-Up | Pull-up Bar | 1.00 |
| Diamond Dip | Bodyweight | 1.00 |
| Dips (Chest) | Bodyweight | 1.00 |
| Dips (Triceps) | Bodyweight | 1.00 |
| Muscle-Up | Pull-up Bar | 1.00 |
| Negative Dip | Bodyweight | 1.00 |
| Negative Pull-Up | Pull-up Bar | 1.00 |
| Pull-Up | Pull-up Bar | 1.00 |
| Ring Dip | Bodyweight | 1.00 |
| Scapular Pull-Up | Pull-up Bar | 1.00 |
| Wide Pull-Up | Pull-up Bar | 1.00 |
| Box Pistol Squat | Bodyweight | 0.94 |
| Elevated Shrimp Squat | Bodyweight | 0.94 |
| Pistol Squat | Bodyweight | 0.94 |
| Shrimp Squat | Bodyweight | 0.94 |
| Freestanding Handstand Push-Up | Bodyweight | 0.90 |
| Wall Handstand Push-Up | Bodyweight | 0.90 |
| Wall Handstand Push-Up (Negative) | Bodyweight | 0.90 |
| Bodyweight Squat | Bodyweight | 0.88 |
| Decline Push-Up | Bodyweight | 0.70 |
| Archer Push-Up | Bodyweight | 0.64 |
| Diamond Push-Up | Bodyweight | 0.64 |
| One-Arm Push-Up | Bodyweight | 0.64 |
| Push-Up | Bodyweight | 0.64 |
| Wide Push-Up | Bodyweight | 0.64 |
| Incline Push-Up | Bodyweight | 0.55 |
| Knee Push-Up | Bodyweight | 0.49 |
| Wall Push-Up | Bodyweight | 0.35 |
28 of the 84 exercises this can apply to carry a share. The other 56 carry none — those sets are priced at the weight you typed, exactly as they were before.
What the muscle map is counting
Every exercise in the catalogue names the muscles it trains, each one as either primary or secondary. One set credits a primary muscle with one set and a secondary with half of one. That split is the method the code cites Pelland et al. for, and it is the only thing a body diagram in this app could honestly report: the catalogue knows which muscles an exercise names, and your log knows how many sets you did.
Counted in sets, not in kilograms — and the diagram is shaded by sets for the same reason the list beside it counts them. "Triceps, 5 t" after a bench day is a figure nobody lifted; half a set is exactly what the triceps did. Set counts are rounded to halves rather than to whole numbers, because rounding 2.5 up to 3 would erase the very distinction the half exists to carry.
The shade is relative to you. The darkest muscle is your busiest one in the window, and everything else is drawn as a share of that — so a map is readable whether you did three sets or thirty, and two people’s maps, or your own two windows, are not comparable with each other. The window is four weeks unless you choose another one, and the app asks for secondary muscles to be folded in; the server leaves them out unless asked, so that an older build keeps receiving exactly what it always received.
The numbers, and where they live
Every number this page leans on, read out of the API when the site was built. Four of them are written in more than one place — two of those twice in the server, two across the server and the app — and the build fails if the copies stop agreeing with each other.
| What it is | Value | Read from |
|---|---|---|
| What one set credits a secondary muscle with. A primary is credited 1. | 0.5 | apps/api/src/common/muscle-role-share.tsapps/flutter/lib/features/workout/domain/worked_muscles.dart |
| Muscle set counts round to this step, so half a set stays half a set. | 0.5 | apps/api/src/common/muscle-role-share.ts |
| Weeks the muscle map covers when you have not chosen a window. | 4 | apps/api/src/workout/analytics/analytics.controller.ts |
| Under this, a recorded body mass is treated as a bad reading rather than a weight. | 20 | apps/api/src/workout/resolve-bodyweight.tsapps/api/src/workout/strength-score.service.ts |
| Over this, the same — the weigh-in is ignored, not used. | 300 | apps/api/src/workout/resolve-bodyweight.tsapps/api/src/workout/strength-score.service.ts |
| The largest share of your own body mass you can tell the app a movement raises. | 1 | apps/api/src/exercise/bodyweight-factor.service.tsapps/flutter/lib/features/workout/domain/workout_volume.dart |
Sources
Each source says how far we actually got into it. A citation list shows that a paper exists, not that anybody opened it — so this one is labelled.
Pelland et al., Sports Medicine, 2025 — 67 studies
The reason the code credits a secondary muscle half a set rather than a whole one or none. We have not read it; the citation lives in the source beside the constant, and what this page reports is that the code cites it.
Not read
Ebben et al. (2011), "Kinetic Analysis of Several Variations of Push-Ups", J Strength Cond Res 25(10)
Peak vertical ground-reaction force as a share of body mass — the origin of the push-up family’s numbers in the table above. Cited by the seed that holds them; we have not read the paper itself.
Not read
Dempster (1955) segment-mass fractions
The standard anthropometric table the squat and handstand figures are derived from by subtracting whatever stays on the floor. Cited by the seed; not read here.
Not read
The code that computes it
packages/shared/src/utils/effective-load.ts, apps/api/src/workout/workout.service.ts, apps/api/src/common/muscle-role-share.ts and apps/api/src/workout/analytics/analytics.service.ts. Every number above is read out of these files when this site is built, and the table of fractions is mirrored from the seed rather than typed.
Read in full
General fitness information, not medical advice.