Skip to content

← Blog· · 12 min read

A muscle recovery tracker built from my own log

How I designed Sparlift's muscle recovery model — hours per muscle from proximity to failure — and what it shows on six weeks of my own training.

A muscle needs about 48 hours to recover after three sets taken to failure — about 60 for quads and hamstrings, 36 for small muscles like calves and forearms. Two things decide the real number: how close to failure each set was, and whether you trained that muscle again before it recovered. How much weight was on the bar matters far less than most training apps assume.

I designed Sparlift's recovery model around those two facts. This post explains how it works and why each rule exists, shown on my own training: five lifting days a week on a push/pull/legs split and two kickboxing or MMA classes. For the numbers below I ran the model over six weeks of my log — 28 sessions and 448 sets between 20 August and 29 September — using the same code the app uses.

The question the model has to answer

"Which muscles can I train hard today — and if not, how long until I can?"

That question shaped two early decisions.

Hours, not a score. A 0–100 recovery score has no unit you can plan with. Hours map straight onto a calendar: biceps ready in 43 h means Thursday, not tomorrow. So the model keeps a clock in hours for each of 14 muscles, and the app shows how many are left and which sessions they came from.

Inferred from the log, not from a questionnaire. A daily form about sleep and soreness only helps if it's filled in every single day, and the log you already keep is a more reliable record than a form you might skip. Everything the model knows comes from the sets and rounds you log anyway.

Sparlift's Regeneration screen on my Tuesday evening: shoulders, chest, back and biceps shaded Worked, triceps and forearms Recovering, legs Fresh. My muscle list: biceps ready in 43 h, opened to show 8 h from today's push day and 35 h from yesterday's pull day with the exercises of each; then shoulders 37 h, back 21 h, chest 20 h, triceps 16 h, forearms 4 h.
My Tuesday evening, after a pull day on Monday and a push day on Tuesday.

Rule 1: effort means proximity to failure, not load

The research is consistent on this. Three sets of ten taken to failure in the bench press and the squat kept performance down for about 48 hours; the same repetitions stopped short of failure recovered much faster (Morán-Navarro et al., 2017). Heavy squats at 80% of 1RM stopped far from failure recovered within about a day, while lighter sets carried close to failure recovered slowest (Pareja-Blanco et al., 2019).

That rules out tonnage and percentage of max as the input: a heavy triple with plenty left in the tank and a set ground out to failure would look alike. So every set gets an effort — reps ÷ (reps + reps in reserve) — and the effort becomes a hard-set value: nothing at half effort, 1 at failure, and steep in between, because the last reps before failure are where the cost is.

Chart of the hard-set value against effort: zero until 0.5, then curving up to 1 at failure. A set of 8 with 2 reps in reserve counts 0.46 of a set to failure; with 4 in reserve, 0.19.
What a set is worth, by reps in reserve. A set of 8 with 2 left counts 0.46 of a set to failure.

Here's what that does to a real session. My push day on 29 September had 16 working sets. The model counted 3.6 hard sets for the shoulders and 2.2 for the chest:

Exercise What the model saw Hard sets
Overhead press, 55 kg × 6, RIR 0 logged a set to failure 1.00
Overhead press, 55 kg × 6, nothing logged about 1.3 reps left, judged against my best 0.52
Incline press, 85 kg × 7, RIR 0 logged a set to failure 1.00
Lateral raises, 14 kg × 14, twice about five reps short of my best 0.33 each
Rear-delt flies, 3 kg × 12, twice far from my best on that cable 0

Two identical overhead-press sets count 1.00 and 0.52 because only one had a logged RIR. When nothing is logged, the model judges the set against my best set of that exercise in the last 8 weeks and assumes that best set had one rep left — lifters under-estimate their remaining reps by about one on average (Halperin et al., 2022). It's a deliberately conservative default, and it's why logging RIR matters: in six weeks, only 5 of my 448 sets had one. Everything else was an estimate.

Rule 2: three hard sets ≈ 48 hours, then diminishing returns

Three hard sets leave a muscle its reference time: 48 hours for chest, back, shoulders, glutes, biceps and triceps, 60 for quads and hamstrings, 36 for calves, forearms, abs, obliques, hips and neck. Beyond three, each extra set adds less (the square root of the dose), and one session can leave at most 1.5 times the reference — 72 hours for most muscles, matching the longest deficits seen after high-volume training to failure (Bartolomei et al., 2017).

Biceps and triceps get 48 hours, not the 36 many charts give small muscles: single-joint arm exercises caused larger strength losses and longer soreness than multi-joint ones (Soares et al., 2015).

I also ruled out a tempting alternative: measuring each session against your own usual session. On a split routine it under-counts. My push day has one chest exercise where a full chest day has two, so three sets to failure would read as "half your usual" — almost nothing. Hard sets are absolute; personalisation belongs in the reference times, and it has to come from performance, not volume.

How I checked it. Before looking at the model's numbers for that push day, I wrote down what it felt like it needed: at least 48 hours for the shoulders, 24 for the chest, 24 for the triceps, about 48 for the biceps, which I'd also trained the day before. The model said 52, 35, 30 and 50. That's one lifter and one day — a sanity check, not a validation — but a model that disagrees with how the training felt has to explain why.

Rule 3: sessions add up — and the arms pay for the back

Each muscle's clock counts down one hour per hour, and a new session adds its hours on top of whatever is left. There's no discount for the second session: the "repeated bout effect" that would justify one was absent in resistance-trained men (Falvo et al., 2008).

The clock keeps each session's hours separately and wears the oldest off first. That's what lets the app show which session is still costing you — and it surfaced one of the most useful things my own log showed me.

My Monday pull day put 61.6 hours on my biceps and 47.4 on my back. Hammer curls close to my best, single-arm preacher curls, and two kinds of rows that also work the biceps added up to almost five hard sets. Tuesday's push day added another 10 hours of preacher curls on top.

Chart of my biceps' hours over one week: Friday's pull day wears off over the weekend; Monday's pull day and Tuesday's push day stack; the total wears down oldest first and reaches Fresh on Thursday afternoon.
My biceps over one week: each session's share of the clock, worn off oldest first.

The back gets the attention on a pull day. The arms get the bill: on my split, the biceps carry the largest single recovery cost of the week.

Rule 4: count only what happened

A recovery model is only as honest as its input, so three rules guard it.

  • Only ticked sets exist. Starting a workout from a routine pre-fills every set with last time's numbers, so logging is one tap per set. A set you never tick is deleted when you finish. If I skip the deadlift on a pull day, my back doesn't pay for it.
  • RIR starts empty. A pre-filled 0 would mean "to failure" on every set. Empty means "estimate it".
  • Light touches don't count as training a muscle. Two sets of face pulls on push day add a couple of hours to the back, but anything under 15% of a muscle's reference time doesn't mark it as trained — otherwise my back would read "trained 3 hours ago" the day after a real pull session.

What six weeks of my log show

My split's spacing works. My back and biceps were Fresh at the start of all 12 pull days, my chest and triceps at the start of all 14 push days. The only exceptions were my shoulders, twice in one week, when I did three push days in five days: 10 and 21 hours were still on the clock.

Chart of hours left on my back, shoulders and biceps over three weeks, with every session marked. Each line drops under the Fresh line before the next session that trains it, except the shoulders in mid-September, in a week with three push days in five days.
Three weeks of my log. Every line is back under "Fresh" before the next session that trains it — except the shoulders twice.

Training the back twice a week with three or four days between pull sessions is comfortably within recovery. Push days 48 hours apart leave the shoulders short: they're loaded by the presses and the raises on both days.

What isn't logged doesn't exist. My kickboxing and MMA classes aren't in my Sparlift log, so the model has never seen them. Combat work counts by minutes and effort: every 3 minutes of rounds are a fraction of a hard set on the muscles the activity uses, with default efforts that match what MMA athletes report — sparring around RPE 7 or more, drills 4 or less (Kirk et al., 2021). To see what my log hides, I added one typical kickboxing class to Monday evening — five pad rounds and three bag rounds at RPE 8 — and reran the week:

Right after Tuesday's push day Lifting only With Monday's class
Triceps 30 h 42 h
Shoulders 51 h 56 h
Whole-body score 63 · above usual 73 · well above usual
Back to usual after 11 h of rest after 25 h

A striking class loads the same shoulders and triceps as a push day. If you lift and fight, the model needs both.

The whole-body read-out

The second view in the app is called Nervous system, and it's deliberately not "CNS fatigue". After heavy squats, strength stays down for days while voluntary activation — the measure of central fatigue — barely changes; the lasting deficit is in the muscle (Thomas et al., 2018).

What the view measures is whole-body training load: session effort × minutes, the session-RPE method that holds up across sports, combat sports included (Haddad et al., 2017). The last two days are compared with the last three weeks, and your usual always reads 50. On my Tuesday evening it read 63 — "Above your usual", 1.4 times my normal load, back to normal after 11 hours of rest.

The Nervous system view: score 63, Above your usual 1.4×, back to your usual in 11 h of rest, over a body filled with violet water to just above the dashed usual line.
The body fills like a vessel up to the score; the colour moves from blue to violet to magenta as the load rises above your usual.

Two design choices matter here. The comparison is always with your own recent training, and the labels only say how today compares with it — the acute:chronic ratio is too weak a predictor to claim anything more (Impellizzeri et al., 2020). And the score is only as complete as the log: with just my lifting logged, my "usual" sits at the model's floor.

Where the model stops

  • Population values. The reference times come from group studies. Recovery varies with age, sleep and training history; the next step is fitting them to each lifter from how their lifts move between sessions.
  • Readiness, not soreness. The clock estimates when a muscle performs again. Soreness often peaks around two days and can outlast it, especially on new exercises.
  • Only the log. Sleep, stress and anything you didn't log are invisible to it.
  • Not validated against outcomes. The model combines published findings; it hasn't been tested against measured performance in Sparlift users. It's an estimate for planning, not a medical assessment.

Getting accurate numbers out of it

  1. Tick sets as you do them.
  2. Log the RIR of your hardest set in each exercise — RIR 0 on a set taken to failure. That set becomes the yardstick for all the others.
  3. Log your classes: rounds, and an RPE for the hard ones.
  4. Before a session, check the muscles you're about to train. "Worked" or worse on the main ones: go lighter, change the order, or train something else first.

The full model — every formula, with the evidence behind it and this same week worked through — is in the docs: how Sparlift calculates muscle recovery time.

Start logging — free.

FAQ

How long do muscles need to recover between workouts?

About 48 hours after three sets taken to failure; quads and hamstrings about 60, small muscles like calves and forearms about 36. Sets stopped a few reps short of failure recover much faster, and a session with many sets close to failure can take up to about 72 hours.

Is 48 hours enough rest between workouts for the same muscle?

After a normal session of about three hard sets, usually yes. In six weeks of my own log, training my back twice a week with three or four days between pull days, it was fresh at the start of every pull session.

Does training to failure need more recovery?

Yes. How close to failure you take each set is the main driver of recovery time. In Sparlift's model, three sets of 10 on the bench to failure leave the chest 48 hours; the same sets with two reps in reserve, 26.

Do I need to log RIR or RPE?

No, but it makes the numbers much better. Without it, each set is estimated against your best set of that exercise in the last 8 weeks, assuming that best set had one rep left. One logged RIR 0 on a set to failure sharpens the estimate for every other set of that exercise.

How does Sparlift count kickboxing, boxing or MMA?

By minutes and effort. Every 3 minutes of rounds count as a fraction of a hard set on the muscles the activity uses, scaled by the effort you log. A kickboxing class with hard pad and bag rounds adds about a day to the shoulders and half a day to the triceps.

Why does the app say a muscle is fresh when it's still sore?

Because it estimates when the muscle can perform again, not when soreness is gone. Soreness often peaks around two days after a session and can outlast the loss of strength, especially with new exercises.

Is the nervous-system score the same as CNS fatigue?

No. It's whole-body training load — effort × minutes over the last two days compared with your last three weeks. It says how today compares with your usual, not the state of your nervous system.