Under the hood · 10
The Progress hub: PRs, plateaus, goals and projections
How the Progress tab turns your history into session series, PR flags, plateau detection, trend lines, goal status and projected dates, a ranked 'worth a look' feed, balance ratios, monthly recaps and the home insights.
The Progress tab runs on one query and a stack of small pure functions. One pass over your set history produces the per-exercise session series; everything on the tab (hub, Lifts, goals and flags) is derived from it, so the numbers agree from screen to screen.
In plain terms. For each lift, Logex keeps one estimated 1RM per session. A PR is a session that beats everything before it. A plateau is a best that is old, with several sessions since and the lift still being trained. A trend line gives a pace, and a pace gives a projected date.
One history, one convention
summarizeHistory takes the raw set rows and builds, per exercise, a list of sessions (one per workout). Only sets that pass validWorkingSet count: weight and reps above zero, and a type with no “warm”, “drop” or “assisted” in it.
Pull-ups, dips, push-ups and assisted machines are first read in the load actually moved: a share of that workout’s bodyweight plus the added weight, or minus the assistance. Going from 100 to 80 lb of assistance therefore reads as a heavier lift, and a PR. If any session of the lift has no known load (no bodyweight, or assistance at or above the share of bodyweight you lift), its sessions still mark the calendar, but no e1RM, PR or tonnage is made up from the typed number; the exercise page then tracks it by assistance, added weight or reps instead (see The exercise catalogue, bodyweight and assisted loads).
For each session it records the best e1RM (the best working set’s Epley estimate), the top set, max weight, volume, set count and the fatigue multiplier. After sorting by date:
- PR flag: a session has a PR if its e1RM is strictly above the best before it, and a best before it exists (the first session is never a PR).
- Fresh-equivalent e1RM:
e1rmAdjusted = e1RM ÷ m, wheremis that session’s fatigue multiplier (see Warmups and fatigue). Plateau detection uses it. PRs and charts stay raw. - PRs this week: exercises whose best this week beats their best before the week.
- Tonnage: this week’s and last week’s volume, plus last week up to the same weekday.
- Key lifts: the most frequent lifts with at least 2 sessions in the last 12 weeks, up to 6.
- Weekly sessions: a count of distinct workouts per Monday-to-Sunday week for 16 weeks, and a calendar of days trained.
Weekly muscle volume comes from the weekly stimulus engine (Weekly volume), not from this tonnage, so it reconciles with the Log screen. The balance ratios and lagging checks below use its fractional sets.
Trends: a pace in pounds per week
progressRate fits a least-squares line through your session e1RMs (value over days):
perDay = Σ((x − x̄)(y − ȳ)) ÷ Σ((x − x̄)²)
perWeek = perDay × 7 perMonth = perDay × 30.4
It needs at least 3 sessions spanning at least 14 days. Otherwise there is no rate, and the screens say to log a few more sessions rather than draw a line from two points.
Range buttons filter the chart: 1M is 5 weeks of sessions, 3M is 13 weeks, 6M is 26 weeks grouped by week, 1Y is 52 weeks grouped by week, and All picks sessions, weeks or months from the span (over 120 days groups by week, over 400 by month).
Plateaus
A lift is stalled when all of these hold:
- the best fresh-equivalent e1RM was set at least
minWeeksago, - at least
minSessionssessions have happened since without beating it, - the lift is still being trained (the last session was within 21 days).
The defaults are 4 weeks and 4 sessions. Your experience level changes them (see Personalization): beginners 3 weeks and 3 sessions, advanced lifters 6 weeks and 5 sessions, because advanced lifters legitimately take longer between PRs.
Worked example
Seven sessions with e1RMs 240, 245, 250, 247, 248, 246 and 249, where 250 was set six weeks ago and four sessions followed it.
- Default (4 weeks, 4 sessions): 6 weeks and 4 sessions, both met, so stalled.
- Advanced (6 weeks, 5 sessions): 6 weeks is met but 4 sessions is under 5, so not stalled.
- Same data, but the last four sessions were each done after heavy related work with
m = 0.95: the adjusted values are 247 ÷ 0.95 = 260 and so on, which beat 250, so the plateau flag disappears.
The exercise stats page uses its own simpler rule: three sessions in a row without a new best (raw e1RM) shows a plateau note. The two rules are independent, so you may occasionally see one page flag a lift and the other not.
Goals
Goals are stored on your device (not synced), as plain JSON with stable ids. There are three kinds.
Lift goals
A target in estimated 1RM, or a weight for reps (such as 205 × 8, converted to its e1RM for projection). “Current” is your best e1RM, or for a weight goal the best weight lifted for at least that many reps.
progress = (current − start) ÷ (target − start) if a start value was recorded, else current ÷ target
rate = progressRate of sessions in the last 10 weeks
recentMax = best e1RM in those 10 weeks
projected date = today + (targetE1RM − recentMax) ÷ perWeek weeks only if perWeek > 0.05 and within 730 days
Status comes from this ladder: met (current at or above target), missed (deadline passed), building (no trend yet), at risk (a deadline exists and the projection misses it or does not exist), on track (a projected date), stalled (a trend but no projection, so it has flattened).
Worked example
Bench sessions over 6 weeks: e1RM 200, 205, 210, 217.5. The fitted pace is 2.875 lb a week. Goal: 235 e1RM. Gap is 235 − 217.5 = 17.5, which at 2.875 a week is 6.1 weeks, so the projected date is about 6 weeks out, status on track.
Consistency and muscle goals
- Consistency: sessions this week against a target of 1 to 7. It is “off pace” when the sessions still needed exceed the days left. A streak counts consecutive weeks meeting the target. The in-progress week counts only once it already meets the target and never breaks a streak.
- Muscle: keep a muscle at or above a weekly target for N consecutive weeks (1 to 26). The target is the muscle’s MEV, or your own weekly set target if you set one (1 to 50). It is at risk when a deficit remains and 2 or fewer days are left.
Next step
goalNextStep turns an evaluated goal into one concrete target for next time. For a lift on pace, it takes the recent best session as the anchor and asks for one session’s share of the pace:
cadenceDays = clamp( trend span days ÷ (sessions − 1) , 2 , 14 )
step = min( perWeek × cadenceDays ÷ 7 , 2.5% of anchor e1RM )
e1RM_next = min( target e1RM , anchor + step )
weight = e1RM_next ÷ (1 + reps ÷ 30) then rounded to a loadable step for display
With a deadline, perWeek is the pace required to hit it. If there is no usable trend (building, stalled, or at risk with a flat trend), it says to beat your best by a rep instead: your top set’s load as logged, for one more rep.
Using the sessions above: cadence is 42 ÷ 3 = 14 days, so one session’s share of the pace is 2.875 × 14 ÷ 7 = 5.75, but the 2.5% cap is 217.5 × 0.025 = 5.44. The next e1RM is 222.9, and for sets of 5 that is 222.9 ÷ 1.1667 = 191.1, shown as “Aim for 190 lb × 5”.
Flags: the “worth a look” feed
buildFlags ranks the things most worth your attention. Each type has a score, higher first, and the feed shows the top 5 by default (you can snooze any flag):
| Flag | Score | Fires when |
|---|---|---|
| Goal reached | 100 | A goal was completed in the last 7 days |
| New PR | 90 | An exercise’s best this week beats its best before the week (up to 2 shown) |
| Goal off pace | 80 | A goal is at risk |
| Stalled lift | 70 | The plateau rule fires, for lifts without a goal of their own |
| Lagging muscle | 65 | At least 2 consecutive completed weeks below the muscle’s bar (up to 2 shown) |
| Overreaching | 60 | This week’s sets for a muscle exceed its MRV |
| Neglected goal lift | 55 | A lift with a goal has gone 14 or more days untrained |
| Imbalance | 50 | A balance ratio is left-heavy (below) |
| Goal near | 45 | A lift goal is at 95% or more |
| Zone streak | 30 | A headline muscle has been in its growth zone 3 or more weeks |
A topic you already have a goal for (a lift, or a muscle) is tracked by that goal’s card and not repeated as a separate flag. “Lagging” counts only weeks you trained at all and measures against the muscle’s MEV. The headline muscles are chest, back, side delts, rear delts, biceps, triceps, quads, hamstrings and calves.
Balance ratios
Each ratio uses the 4-week average of fractional sets per tag. It is “insufficient” under 4 combined sets. If the right side is zero it is left-heavy. Otherwise the ratio left ÷ right is compared with a band.
| Ratio | Left | Right | Band |
|---|---|---|---|
| Push : Pull | chest, triceps, front delts | back, biceps, rear delts | 0.75 to 1.33 |
| Chest : Back | chest | back | 0.6 to 1.25 |
| Quads : Hams | quads | hamstrings | 0.8 to 2.0 |
| Front : Rear delts | front delts | rear delts | 0.5 to 2.0 |
Only left-heavy results are flagged (the left side is the one people over-train); right-heavy is harmless. Example: quads 10, hamstrings 4 gives 2.5, above 2.0, so “Quads : Hams is out of balance”.
Monthly recaps
On the 1st of each month a recap of the month before appears on Home for 7 days (“NEW · SEPTEMBER RECAP”), once you have logged at least 3 workouts and while no unfinished workout is waiting. From the 10th, a Home slide shows the month so far and whether you are on pace with your best full month. Progress keeps every recap in a Recaps archive, together with a “Since you joined” story, and the hub’s “Last week in review” leads with one real win and one next step.
Every number in a recap comes from logged sets, with a few guards:
- PRs are judged against all earlier history, the same rule as the hub.
- No “vs last month” unless last month was a full month (you had joined before it began) with at least 2 sessions, so there is never a “+300%” right after signup.
- The first 30 days lead with your first session against your latest instead of a pile of early PRs.
- There is always a real win. If nothing in the month qualifies, the recap falls back to a lifetime win (labelled “Since you started”), then lifetime totals, and only then to how often you showed up.
- A month with fewer than 2 sessions gets the short “quiet month” version.
Which recaps you have seen or dismissed is stored on the device only. Recaps sit behind a remote switch (progress_reports) while they roll out.
The week feed and home insights
The hub reorders its sections by the phase of your week. Trained today is “after today’s session”; Monday or Tuesday with at most one session is “fresh week”; Saturday or Sunday is “finish the week strong”; any other day is “midweek”. Each phase has its own order of sections (for example, the closing phase leads with muscles).
The home carousel adds a few evidence-based cards: records (more reps at the same load than before, +N reps at X), improvements (more weight at the same reps than your previous session), and cadence cards (“Revisit this lift?”) when a lift with at least 4 sessions in 90 days, usually 21 or fewer days apart, has gone at least 1.8 times its usual spacing (and at least 7 days, at most 45) untrained. Record and improvement cards expire after 7 days (a cadence card lasts until 46 days after your last session), and a dismissal is tied to the evidence behind it, so new evidence brings the card back. They make no readiness or recovery claims.
“Today’s plan” suggests a routine by weekday habit (matched workouts on this weekday in the last 8 weeks), rotation (longest undone among routines done in the last 6 weeks), need (muscles below the growth zone this week) and recency (muscles trained since yesterday count against it). A routine counts as matched to a workout when the workout covers at least half of it, and a “drained” check-in after two or more days in a row suggests resting.
Limits and edge cases
- Goals live on the device. They are stored locally per account and are not synced, so a new phone starts without them (see Units, storage and sync).
- Projections are linear. A straight line through recent sessions says nothing about deloads, injuries or novice gains slowing. They are suppressed beyond 730 days and when the pace is 0.05 lb a week or less.
- Few sessions, few claims. No trend means no projection and no plateau, and the app says so.
- Sets mislabelled as warm-ups are ignored by every Progress calculation, so label your top sets honestly.
- Bodyweight lifts need a bodyweight. Without one in your profile or on the workout, the load of a pull-up is unknown, so it gets no e1RM trend here.