Every chart, explained.
Most lifting apps show you a number and leave you to figure out what it means. flexRep does the opposite: every visualization has a methodology card one tap away, showing the formula, the source, how to read the chart, and why it matters.
Below: the full methodology library, as it appears in the app.
Estimated 1RM and stall detection.
Estimated 1RM (e1RM) how it's calculated ↘
A back-calculated single-rep max from any working set.
e1RM = weight × (1 + reps / 30) Plotted as a line chart per exercise, weekly. Use it to compare strength across rep ranges — 225×5 and 245×3 are roughly equivalent and the e1RM tells you so.
The cleanest comparable strength metric across varying rep schemes. Epley's formula has the best literature support for the 1–10 rep range that most lifters work in.
Stall detection how it's calculated ↘
A flag raised when an exercise's e1RM stops progressing for 3+ weeks despite stable or rising RPE.
stall = (max(e1RM[-3:]) − min(e1RM[-3:])) / median(e1RM[-3:]) < 0.015 A pulsing orange dot on the exercise card. Tap to see the contributing weeks and the stable-RPE window.
Stalls are the most under-diagnosed source of stalled programs. Most lifters notice 4–6 weeks late. flexRep flags within 3 weeks of the plateau forming.
Strength velocity how it's calculated ↘
The slope of e1RM over a rolling 8-week window, expressed as kg/week.
velocity[t] = slope(linear-regression(e1RM[t-7..t])) Positive = trending up. Negative = decay. A long negative tail with stable RPE is the deload-signal — your nervous system is asking for a week off.
Acute-vs-chronic strain analogues for strength. Trending velocity gives a smoother readout than week-over-week deltas.
Fractional sets and the 11-axis radar.
Hypertrophy research (Schoenfeld 2017, 2019) is clear: secondary muscle work counts — just not at full weight.
Fractional-sets muscle volume how it's calculated ↘
A weighted sum of sets per muscle group, weighting primary movers 1.0 and secondaries 0.5.
volume[m] = Σ (sets where m is primary × 1.0) + Σ (sets where m is secondary × 0.5) 11 axes on a radar chart: chest, front delt, side delt, rear delt, lats, traps, biceps, triceps, quads, hams, glutes. A balanced lifter trains across the polygon, not at three points of it.
Counting a bench press as 1 chest set + 1 front delt set + 1 tricep set undersells the bench. The fractional model captures what the chest actually got.
Rep-range drift how it's calculated ↘
A stacked-area chart showing the share of weekly sets in each rep range (1–3, 4–6, 7–10, 11–15, 16+) over 16 weeks.
A widening light band at the top = drifting toward easier work. A growing dark band at the bottom = chasing heavier singles. Stable bands = consistent programming.
Slow drift toward higher reps is a stealth source of plateaus. The chart makes it impossible to miss.
Movement pattern breakdown how it's calculated ↘
Sets per movement pattern (push, pull, squat, hinge, carry, lunge, core, rotation) shown as a stacked bar over time.
Compare bar heights week-over-week. A 4-week push-heavy block shows up immediately. A neglected hinge axis is similarly visible.
Movement-pattern balance is the foundation of injury-resistant programming. Most lifters drift toward what they like (push, push, push) without realizing it.
RPE, RIR, and the effective-rep model.
RPE / RIR per set how it's calculated ↘
Rate of Perceived Exertion, 6.0–10.0 with half-steps. Reps in Reserve is the dual: RIR = 10 − RPE.
Tap a set to log RPE. The half-step scale (6.0, 6.5, 7.0, …) is granular enough to be meaningful and coarse enough to be honest.
RPE-aware analytics use effort, not just iron. A 225×5 at RPE 8 is a different stimulus from 225×5 at RPE 9.5. flexRep's stall detector requires stable RPE — a stall at RPE 7 is a deload signal, not a plateau.
Effective reps how it's calculated ↘
Reps performed close to failure, where the bulk of the hypertrophy stimulus lives.
effective_reps_per_set = max(0, reps − RIR + ε) where ε accounts for the last few sub-maximal reps still contributing A weekly count of effective reps per muscle group. Compare against the 80–120/week landmarks for hypertrophy (per Helms / Israetel).
Total sets is a blunt instrument — a set of 20 at RPE 6 is mostly cardio. Effective reps focus on the work that actually grows tissue.
Recovery snapshot how it's calculated ↘
A per-muscle-group readout of fatigue accumulation since the last training session.
recovery = clamp(0, 1, days_since_last × decay − recent_volume × 0.02) A horizontal bar per muscle: full bar = recovered, half = mid-recovery, low = freshly trained. Use it to pick what to train today.
Most lifters intuit recovery wrong — they train the muscle that's sore, miss the one that's ready. The snapshot is calibrated, not a guess.
The strength glyph and rhythm waveform.
Two visualizations that are uniquely flexRep — generative, shareable, brand-defining.
Strength glyph how it's calculated ↘
A generative radial shape built from your movement-pattern volumes.
r[i] = radius × (0.3 + magnitude[i] × 0.7 + jitter[i]) where jitter[i] = (1 − symmetry) × 0.3 × sin(i × 2.7) Each axis is a movement pattern. The longer the spoke, the more sets in that pattern. The warmer the color, the more frequently you train. More circular = more balanced.
Most lifting apps give you a number for your training. flexRep gives you a face for it. Share-card material.
Workout rhythm waveform how it's calculated ↘
A Canvas-drawn signature of one session: each set is a peak, each rest is a valley.
peak_y[i] = (weight[i] − min(weight)) / (max(weight) − min(weight)); valley_depth[i] ∝ rest[i] / max(rest) High peaks = heavy sets. Wide peaks = high-rep sets. Deep valleys = long rest. Heavy-singles day looks nothing like a pump session.
Your workout has a shape, and the shape is yours. Visually unique. Meaningful. Shareable.
No black boxes.
Every formula. Every source. Every assumption — visible.