Bench velocity holding.
Top-set RPE on bench held at 8 across three working sessions this week, with the working weight up 5 lb from the previous block average. Pattern looks like clean progression, not grinding.
Once a week, flexRep reads your training data and produces a short summary of what it sees. The model runs locally — Foundation Models on supported devices, a rule-based engine elsewhere. Nothing about your training leaves your phone. Ever.
The voice is calm coach. The posture is observation, never prescription. The privacy is architectural.
Bench held at RPE 8 for three working sessions. Top weight is up five pounds from the block average. Push volume sits eighteen percent above the four-week mean — pull may want a top-up.
Four shapes the engine ships in. No 'great job!' No hype. No exclamation marks anywhere on the page below — we checked. The numbers are the work.
Top-set RPE on bench held at 8 across three working sessions this week, with the working weight up 5 lb from the previous block average. Pattern looks like clean progression, not grinding.
Three push days this week vs. two in previous weeks. Pull volume held flat; horizontal pull may want a top-up if push intensity continues at this level.
Working RPE has held stable at 7.5–8. This is a flag, not a verdict. Common causes: a recent deload-adjacent rest week, or accumulated fatigue that hasn’t been formally addressed.
Two travel sessions this month at "Hotel — March trip" hit 6% lower working weights with the same RPE. Could be the bar weight, the rack height, or both. Worth noting if you travel again.
Most “AI insight” features ship a prompt to a server with your training data attached. flexRep doesn’t. The pipeline runs on-device — rule-based diagnostics first, citation validation second, Foundation Models third. The model never sees a stat that didn’t trace to your data.
Stall slope, RPE drift, volume delta, frequency drop, deload gap. Computed locally from your data. No prompt yet.
bench.e1RM.slope = -0.4%/wk
volume.wk.delta = +18%
RPE.drift.@80% = +0.7 Every number flagged for the model carries a back-reference. The validator confirms each value exists in the source set before any text is generated.
Apple\'s on-device intelligence reads the validated diagnostics and produces three sentences in the calm-coach voice. Any number it tries to invent gets caught when the validator runs again.
Three sentences. One verdict label. Every cited number tappable for its source. No “great workout!” No advice.
“Bench e1RM has trended down 0.4% per week for three weeks. Weekly volume is 18% above your prior four-week average. RPE at 80% load has drifted +0.7.”
Every weekly insight falls into one of four shapes. Each one has a different threshold for shipping — and each one carries its label on the card so you know which kind of statement you're reading.
A noting of what your data shows. No verdict.
A trend across multiple sessions or muscle groups.
Something worth your attention — a stall, a volume jump, a context shift.
A characterization of your training shape — what your glyph and waveform are doing.
Your data never crosses an internet connection to make this work. The model reads, infers, writes — all on your phone. The prose is occasionally a little stiffer than a cloud model's. We took the trade.
The insight engine reads only the data on your device. No upload. No syncing your training to a remote model. No server-side analysis. Nothing leaves your phone.
When your device supports it, Apple’s Foundation Models framework runs locally to generate the prose. The model sees your data; the network does not.
On devices without Foundation Models support, a curated rule-based engine produces the same shape of insight. The voice is consistent. The privacy posture is identical.
Insights describe what your data shows. They do not tell you what to do about it. "Bench e1RM unchanged for three weeks" is a sentence we ship. "You should deload" is not.
The contrast isn't a marketing line — it's an architectural choice with consequences for what can leak, what can be sold, and what can be subpoenaed.
Each of these ships in some fitness app right now. None of them ship in flexRep. Disagree if you want — every refusal has its reason on the card. We've heard the counter-argument. We decided anyway.
It will flag a stall. The deload call is yours.
It observes. It does not prescribe blocks.
We have e1RM for that. The model doesn't guess.
No social hooks. The insights are for you.
No "you're crushing it." No exclamation marks.
A sample-size floor before any pattern claim.
Every generated insight goes into the JSON export alongside its underlying signal data. You can audit the engine — feed the same data into your own LLM and see if it draws the same conclusions. You can also just delete the insights you don’t agree with. They’re yours either way.
One observation a week. Calm. Sourced from your own data. Generated on your own device.