Most fitness apps treat data like a stage prop: a number on a chart, a vague “AI insight,” a percentage bar that aggregates something they won’t name. flexRep treats data like a working tool — which means being honest about the model behind every metric, the literature it leans on, and the bits that are still squishy.
This page is the long version. It exists because the same kind of person who reads Sports Medicine in bed wants to know whether their bench is being scored against a Schoenfeld meta-analysis or against vibes.↓
It’s against the meta-analysis. Mostly.
Muscle Nerds, in rooms
Pick the level of detail you want.
The receipts in plain English live on this page. Three deeper subsections — tracked, caveats, versus — each have their own room. And the companion pages (data, methodology, receipts) go deeper on architecture, the math, and the literature.
The companion pages are exhaustive. This is the readable version. Each section names one specific implementation decision and the one observable behavior it produces. The other pages answer how. This section answers why anyone would care.
Read top to bottom, or skim the eyebrows.
01 · The numbers
The math isn't lying to you
Quick test. Open whatever app you currently use. Find a 20-rep set you’ve logged. Look at the estimated 1RM.
That number’s a fairy tale. Epley overestimates above 10 reps and every app uses Epley because it’s the easy one. A 135 × 20 comes out around 225 on Epley. Nobody’s repping out a true rep-max of their bench at 60% of their 1RM for twenty.
flexRep blends the formulas. Brzycki up to 6, Epley 7 through 10, capped at 10 reps because beyond that nobody has a validated formula and we’re not going to fake it. Your per-set display still uses whatever formula you picked in Settings — your preference is your preference. The charts use the blend, consistently, everywhere, so the Volume Trend chart doesn’t disagree with the Intensity Distribution chart. Which is a thing that happens in other apps and shouldn’t.
Every chart has a tap-to-open methodology card. Tap it, it tells you the formula, the year, the limitations. You can verify any number on screen against the actual papers. Wilks 1994 / 2020 update. Brzycki 1993. Epley 1985. Jackson-Pollock 1978 and 1980. Receipts.
135 lb × 20 reps · what each formula says your 1RM is
Epley225overestimate
Brzycki195also drifts
flexRep—won’t pretend
We cap e1RM at 10 reps because beyond that, no formula is validated. Better honest than impressive.
02 · The AI
It doesn't try to coach you
The phrase I use for this is smart notepad, not AI coach.
There’s a category of fitness apps that generate workouts for you based on your data and a model the company trained. Some of them are well-made. None of them know enough about your training to do better than you do. The literature on algorithmic personalized programming isn’t there yet. Apps that claim it are claiming more than the science supports.
flexRep has an AI feature. It runs on your device. It writes you three sentences on Sunday morning paraphrasing the actual diagnostics — your volume delta, your RPE drift, your stall verdict on bench, your top coverage gap. Every number it cites is validated against the source data before it ships to your screen. If the model invents a stat, the validator catches it and the plain-text version goes out instead.
It does not tell you what to do tomorrow. It does not adjust your loads. It does not pretend to be your coach. You’re the coach. The app is the notebook with a brain that can read.
03 · The Watch
Your sets don't disappear when your phone's in the locker
Apple Watch + iPhone in the gym locker. You hit a heavy single, tap your wrist to log it. In most apps, that set vanishes if the iPhone’s out of Bluetooth range — the Watch sends the message, the iPhone isn’t there to receive it, the message fails silently, and you don’t find out until Sunday morning when you notice three sessions are missing.
flexRep queues the message durably. It persists through a Watch app crash because there’s a local store catching everything. When both devices wake up, the queue drains and the iPhone reconciles every pending set into the right workout.
You can lift with your phone in another room. The Watch holds the line.
There’s also dictation on the Watch. “225 by 5.” Parses on-device, no server round-trip. Useful when your hands are chalked and you don’t want to mess with the tiny screen.
Watch
→
Durable queuepersists crash · airplane mode · range
→
iPhone
Sets queue locally first. The transfer is fire-and-confirm, not fire-and-forget. Three sessions never go missing.
04 · The plate calc
It knows what gym you're at
Most plate calculators assume universal plate availability. You’re at a hotel gym with 25 / 20 / 15 / 10 / 5 / 2.5 kg plates only, the app proposes a loading scheme that includes 1.25s, you stand there looking at the rack like an idiot.
flexRep models gyms as entities. Each one carries its actual plate inventory, bar weight, dumbbell increments, cable stack increments. The plate calculator uses your active gym’s inventory, so it proposes loadings that are actually loadable. Same with the warmup ramp generator — it plate-rounds each rung to what your gym actually has.
There’s a Lock Screen widget, too. Set a target via the widget config or Siri Shortcut, glance at your phone, see the breakdown. Load the bar without unlocking anything.
HOME · 315 lb
454525105
loadable
HOTEL · 315 lb
2520151052.5
re-routed, also loadable
Same target. Two gym inventories. The calculator never offers 1.25-lb plates to a hotel that doesn’t own them.
By the receipts
5
e1RM formulas cited
10
rep cap on the blend
14
charts with methodology cards
0
hidden formulas
05 · RPE drift
A drift watch that works for block-runners
Most RPE drift charts find the most common working weight over the last 90 days and fit RPE-vs-time at that weight. Useless for anyone running blocks where the modal weight changes mesocycle to mesocycle.
flexRep buckets by %1RM zone when you have a training max set. 60–70 / 70–80 / 80–90. Drift signal computed per zone. You’re a block runner, the chart actually shows you something. Bench at 80–85% is climbing 0.7 RPE over four weeks at the same relative load. That’s a deload signal grounded in your actual data, not a vibes-based recommendation from a calendar.
60–70%
RPE flat · clean
70–80%
+0.3 RPE · watch
80–90%
+0.7 RPE · deload signal
Drift is computed per zone, not against a single modal weight. Block runners get an honest signal.
06 · Stall detection
It doesn't oscillate
The naive version compares this week’s best e1RM to last week’s. Real noise from session to session is 2 to 3 percent before anything actually changes. A real plateau flips between “progressing” and “regressing” weekly on noise alone, and you stop trusting the chart.
flexRep fits a regression to the last six weeks and classifies on the slope’s confidence interval. A flat plateau reads as maintaining. A real trend reads as progressing. The signal is stable across noise.
When you’re stalled for four weeks or more, the chart runs cause attribution. Top three likely causes ranked: high volume, RPE drift, frequency drop, no deload in six weeks, bodyweight drop. You get the verdict and the diagnosis on the same screen. Then you tap into the underlying chart and verify whatever caught your eye.
Slope CI contains zero → “maintaining.” A real trend would push the CI off the line. Noise doesn’t move the verdict.
07 · Programs
An actual structure, not a notes field
Most apps store your block as a string. Hypertrophy 1.5/3/1 week 3. Whatever you type. The app does nothing with it.
flexRep models programs as a real graph. Program → Mesocycle → Microcycle → Routine → exercises → per-set prescriptions. Every analytic that touches a program reads from the graph. Block comparison knows which weeks belong to which block. Stall detection knows when a deload week happened because the microcycle has the flag set. The routine adherence chart knows what was prescribed because the prescription got stamped onto every set at log time.
You see the inline target on every receipt row. Bench 5 × 230 · target 5 × 225. Green delta. The +5 you put up shows up against the plan immediately.
Block Comparison takes any two mesocycles, two date ranges, or last vs prior, and shows you the deltas — top e1RM per exercise, total volume, average RPE, fractional muscle distribution. Two taps from Insights.
Program · Hypertrophy 1
Mesocycle · Block 2 of 3
Microcycle · Week 5 · deload
Routine · Upper A
Bench Press · 5 × 230 · target 5 × 225+5
Every prescription stamps onto the set at log time. Block comparison reads the graph, not a string.
08 · Set types
Drop sets, clusters, myo-reps as real things
Drop set parents have children. Cluster sets carry within-cluster rest times. Myo-rep chains are first-class. The receipt indents the children under the parent. The analytics filter drops the children out of working-set counts so your volume isn’t double-counted.
You don’t have to log a drop set as three separate working sets and pretend the math works out. The schema knows the difference.
PARENT · WORKING225 × 5RPE 8.5
↳ DROP · 1185 × 4RPE 9.5
↳ DROP · 2155 × 5RPE 10
The volume analytics count one working set, not three. Indented receipt. Honest math. The “+ 8 reps” doesn’t lie.
We’d rather miss two stalls than fire a false-positive that nudges you to deload during your best block of the year.
09 · Wilks · DOTS · IPF GL
When you actually want them
If you set your formula reference in Settings — the field used for sex-keyed scoring formulas — and log a bodyweight within a month of the lift, the PR card shows Wilks, DOTS, and IPF GL alongside the lift.
If you don’t set the reference, the scores hide. The empty state explains why and points you to the one Settings row that turns them on.
Worth knowing: identity and the formula reference are separate fields. How you describe yourself is one thing. The reference used for these specific formulas is a separate, opt-in utility setting. The published Wilks / DOTS / IPF coefficients only exist for two reference categories — that’s a thing about the underlying research, not a thing about you. We’re transparent about it instead of silently defaulting one way. Your pronouns flow into the AI insight and the bot voice; nothing about your identity touches the math.
All three appear together with citations. Opt-in. If the formula reference isn’t set, the scores hide — the empty state explains why.
10 · The export
Free. Always.
Full schema in a .flexrep JSON bundle with checksum. CSV in two formats — normalized for scripts, Numbers-friendly for spreadsheets. Importer for Strong. Importer for Hevy. Generic CSV importer. HealthKit per-set metadata both directions.
You will never see a “Pro tier required for advanced export” wall here. Your data is your data and it is portable on day one, day seven hundred, and the day after you uninstall.
If you do uninstall, the per-set metadata in HealthKit is detailed enough that a future install reads it back without losing anything important. The recovery path of last resort is the platform-native data layer, not a server we control.
No “Pro tier required” wall on any of them. Round-trip tested every release.
11 · The lens system
You don't have to see everything if you don't want to
There’s a density lens with a few levels. You pick during onboarding, you change in Settings any time. Same app under all of them.
Simple — clean Log, History, Body. No RPE chip, no mesocycle bar, no fancy analytics. For someone who doesn’t run blocks and doesn’t want a bunch of cards on Sunday morning.
Balanced — full Routines, Programs, the differentiated charts up top. RPE chip on the receipt. For someone who runs programs.
Detailed — everything visible. Every analytics card on by default. App Intents promoted. For someone who wants to see all the math. (A further Coach lens adds the weekly digest framing on top.)
No paywall between them. No “Pro” badge. The lens is your call.
Simple
Log · History · Body. No RPE chip. No mesocycle bar.
Balanced
Routines · Programs · differentiated charts. RPE chip on the receipt.
Detailed
Every analytics card on. App Intents promoted. All the math, visible.
Same data, same Watch app, same export. Switch any time.
12 · On purpose
What's not there
No ads. No data sale. No notifications you didn’t ask for. No daily streak counter on your scale. No social feed pulling your training toward shareable content. No upsell modal between sets. No “you forgot to work out today” pings two weeks after you uninstall. No silent default on Wilks / DOTS / IPF when you haven’t told the app which reference to use. No black-box chart whose math we won’t show you.
There’s a published list of refusals. It’s in writing. It’s enforceable. When we break one of them, you’ll know exactly which line was crossed because the line was drawn explicitly.
If you disagree with how we’ve scored any of this — the e1RM family we chose, our fractional-set weighting, the stall window, the recovery shape — you don’t have to take our word for it. CSV export ships every set, every RPE, every timestamp.
Roll your own formulas. Score sets the way you’d score them. Build a longer or shorter stall window. Compare runs in your own notebook. We’d rather you run the math yourself than trust ours blindly.
If you read this far, we built flexRep for you specifically.
The brand identity playbook calls you “the muscle-nerd / spreadsheet-refugee audience.” We mean it warmly.