e1RM trend, sixteen weeks.
A clean line, drawn from left to right, with PRs marked where they actually landed. The y-axis crops to your range; the curve smooths just enough to read the trend; the PR dots are the only thing in gold.
A spreadsheet of your sets is just a long list. A chart is a sentence. flexRep’s analytics layer is built on Swift Charts — Apple’s native framework, used the way it was designed to be used — and every chart in the app exists to turn raw data into a pattern your eyes can read.
Eight headliners below, the full catalog of forty-plus beneath them, a decision layer that draws its own conclusions, and one discipline that runs through all of them.
A clean line, drawn from left to right, with PRs marked where they actually landed. The y-axis crops to your range; the curve smooths just enough to read the trend; the PR dots are the only thing in gold.
Each visualization is purpose-built. They share a design language; they don't share a job.
The story: imbalances reveal themselves immediately. A bar with all-orange? Push-heavy block. Equal heights? You’re balanced.
The story: the orange band thinning toward the right is the most under-diagnosed sign of stalled strength — drift toward easier work, hidden in numbers.
The story: a poking-out axis is a movement you over-emphasize. A flat axis is one you neglect. Balance reads at a glance.
The story: dots that cluster on a contour line are equivalent efforts. PRs sit on a contour above the rest. Patterns that take twenty rows of CSV reveal themselves in a glance.
The story: hamstrings are pacing roughly a third of the other major lifts. That’s a programming gap worth a tap.
The story: a glance per lift. Trend up = working. Trend flat = check the methodology card.
The story: the muscle that’s sore isn’t always the one to train. The chart says what the body would say if it could.
The story: daily noise is visible, the trend is louder. Three pounds of “lost progress” turns out to be one bad weigh-in.
The catalog grew. These three arrived recently and earn their own frame — load management, a forecast honest about its uncertainty, and a full-body heat map.
The story: acute load outrunning the chronic base. The ratio crosses 1.5 into the red — the spike that precedes most overuse setbacks. (Gabbett, 2016.)
The story: where your e1RM is heading if the current slope holds — with the cone widening to show how unsure that guess is. It never pretends to know more than it does.
The story: every working set mapped onto the muscles that did it — fractional sets and all. The nearly-cold calves are two weeks untouched, and you can see it before you read it.
The eight above are the headliners. Here is the whole library, grouped by the surface it lives on — each one with a methodology card, a verdict line, and a spoken descriptor. The ones marked New arrived as the app grew.
Charts are only as honest as what they’re built from. Every one of these is a first-class, exportable field — not a derived guess.
Numbers in rows don't say much. The same numbers in a chart say a lot. Here are four real shapes flexRep regularly surfaces — each one would take a coach to see in raw data, and a chart to see at all.
A line chart answers “what happened.” These answer “what should I look at first, and why.” Every one is deterministic, cites its source on tap, and refuses to print a confident-but-wrong number.
Below each title sits a one-sentence, rule-based read: “Volume up 18% vs. prior 4 weeks.” “Stalled 4 weeks on Bench — likely RPE drift.” Deterministic, sourced from the same data the chart shows, never hallucinated. Eight seconds gets you the conclusion.
Analytics use a blended estimate — Brzycki at low reps, Epley in the middle, capped at 10 — the credible compromise the literature backs. Per-set display still honors the formula you chose; no chart quietly swaps math under your feet.
When weekly best e1RM stops rising, a slope-test against a confidence interval classifies the state — progressing, maintaining, regressing, deloading, hypertrophy phase. Stalled four weeks? It ranks up to three likely causes: high volume, RPE drift, frequency drop, missed deload, bodyweight drop, or pain.
Per-muscle weekly volume plots against the published consensus landmarks — minimum effective, maximum adaptive, maximum recoverable. Your chest week lands in a green, yellow, or red zone at a glance. The methodology card cites the source.
Same lift, same working weight, effort creeping up over 90 days — the cleanest “you’re cooking” signal in your data. The card surfaces the three exercises with the steepest positive RPE slope, bucketed by %1RM zone when a training max is set.
Reps within ~5 of failure, attributed per muscle via the fractional-set model — closer to the hypertrophy literature than raw volume. Surfaced once your RPE coverage is high enough to make it credible; otherwise an honest empty state, never a misleading zero.
Working sets bucketed by %1RM zone against your training max. A powerlifter mid-block sees instantly whether they’re living in the moderate zone when the meet wants heavy — with a “set a training max” prompt rather than a self-confirming 100% pin.
Push:Pull, Quad:Hinge, Chest:Upper-Back, Biceps:Triceps over four weeks — each with a sparkline and a verdict chip. When one side has no data it says “No pull recorded,” not a misleading 2.0.
Strength progression draws a 12-week trend with a ±1σ confidence ribbon. The latest point is color-coded by z-score — green inside the band, yellow at the edge, red beyond — so “is this normal?” becomes a visible decision, not a judgment call.
Each chart follows the same six rules. Together they're what makes the analytics tab feel cohesive — and what makes individual charts read at a glance.
We don’t draw zero-to-500 lb when your bench has lived between 195 and 235 for the last year. The chart shows the range the data inhabits, so small movements remain legible.
Always-positive data with no zero gaps (body weight, e1RM, bodyfat %) uses Catmull-Rom — smoothest aesthetic curves. Series that can hit zero between positive points (weekly volume, per-exercise sparklines) uses monotone — preserves the shape without dipping below the axis on rest weeks.
Iron orange for the line you came to read. Muted ink for dots, context, and grid. PRs in gold. Patterns in purple. Each color earns its place; no rainbow palettes, no gradients we couldn’t justify.
Each chart draws in on first view — line strokes draw from left to right, dots fade in staggered, fills wash up from the axis. The motion isn’t decoration; it shows you the shape unfolding in the order it actually happened.
Tap any chart for the methodology card: the formula, the source, how to read it, and what it doesn’t capture. The numbers are not exempt from showing their work.
No misleading axis scales. No truncated y-axes that exaggerate trend. No averaging that hides variance. No data-art for the App Store screenshot. If a chart could be screen-grabbed and used to mislead, it doesn’t ship.
Every chart in flexRep is rendered with Apple's Swift Charts framework — used directly, not wrapped, not adapted. The decision compounds into a faster, cleaner, more privacy-aware analytics layer.
Apple’s framework, used as provided. The same engine the Stocks app uses. No JS library, no third-party shim.
Drawing happens on the GPU. Even multi-year charts render at 60 fps on a six-year-old iPhone.
All aggregations run on-device. The chart you see was computed against your training history without a single network call.
Every chart can be shared as a PNG share-card; the underlying series export as part of the CSV/JSON bundle, so you can rebuild the chart anywhere.
Every chart exposes an audio-graph descriptor for VoiceOver, and the Canvas visuals expose navigable regions. A test fails the build if a new chart ships without a spoken descriptor.
Each chart in this gallery has a tap-to-reveal methodology card in the app: the formula, the literature source, how to read it, and what it doesn’t capture. We don’t ship charts that we can’t defend on first principles.
Every line, every dot, every axis tick is there because it tells you something a row of numbers can’t.