Why Meso Tracks Two Streams, Not Streaks
5 min read
I'm building Meso, a planning and tracking app for competitive bodybuilders — diet and training programs in one place. Adherence is the single biggest predictor of whether a prep works, so how the app measures and displays it is one of the most important decisions I'll make.
The first instinct is to use streaks, because every consumer habit app does. The second is to swap streaks for a rolling percentage. After working through it, I'm doing neither. Here's why, and what I'm doing instead.
Streaks measure perfection, not adherence
You know the model. 40 days unbroken. Miss one, back to zero.
Streaks reward perfection and punish reality. Athletes miss sessions because they're injured, sick, travelling, or because their kid threw up at 3am. The metric should match the life, not pretend it doesn't exist.
That part's easy. The harder question is what to replace streaks with.
A single rolling percentage is also wrong
The obvious next idea — "tracked days out of the last 30" — has its own problems for serious training:
- A rolling window has no relationship to how training is actually structured. Programs run in blocks. Calendars don't.
- A single number collapses diet adherence and training adherence into one rollup. Those are two different signals with two different causes, and you need to be able to see which one is slipping.
- Early in any window the percentage is noise. One miss on day 3 reads as 67%. Late in any window, after a bad week, it becomes uncatchable and feels terminal even when the rest of the program is salvageable.
So a single number, however calculated, isn't the answer. The answer is two streams, scoped to the architecture of the program itself.
Two streams, three scopes
Meso runs structured programs. A typical 26-week setup looks like this:
| Phase | Cut 1 (12 weeks) | Maintenance (2 weeks) | Cut 2 (12 weeks) |
|---|---|---|---|
| Diet adherence | One number for the phase | One number for the phase | One number for the phase |
| Training adherence | Meso 1 • Meso 2 | — | Meso 3 • Meso 4 |
Each cut block contains two mesocycles of 5 weeks accumulation plus 1 week deload.
Diet adherence is scoped to the phase, because diet targets change at phase boundaries. Cut macros are not maintenance macros. Comparing a 90% in a cut to a 90% in maintenance is a category error.
Training adherence is scoped to the mesocycle, because programs restructure at meso boundaries — new volume landmarks, new rep ranges, new RPE bands. Each meso has its own plan to comply with.
Both stream up to the program for end-of-block review, but neither is the headline day-to-day number.
The UI surfaces three scopes:
- Now — last 7 days, per stream. Always populated, always recoverable. This is what you see on day 3 of a new mesocycle, when the meso-level percentage would otherwise be noise.
- Current cycle — the running mesocycle (training) and the running phase (diet). The actionable number. Becomes the headline once the cycle has enough data to be meaningful.
- Program — the 26-week rollup. Retrospective view, looked at between blocks. Not on the home screen.
What this solves
- Early-cycle noise: Now is the headline until the cycle has built up enough data. The cycle number is shown but de-emphasized.
- Late-cycle cliff: Mesocycles are short enough (~6 weeks) that one bad stretch can't terminally wreck them, and the deload is a natural breakpoint. The phase number stays visible for review but isn't the daily target.
- Sickness, travel, life: Days can be flagged with a reason and excluded from the denominator, with the reason preserved so the pattern doesn't disappear.
- Dead zones: There aren't any. Maintenance is a phase with its own diet number. Training during maintenance is handled explicitly, not as a gap.
What "completed" actually means
- Training in an accumulation week: session executed, sets and reps hit, RPE in band.
- Training in a deload week: completing the reduced prescription is 100%. Going harder than prescribed is non-compliance, not bonus points. This is the part habit apps get wrong.
- Diet in a cut: macros hit within tolerance (defaults of ±5g protein, ±10g carbs/fat; user-configurable).
- Diet in maintenance: targets shift, tolerance widens.
Beyond the number
A single percentage tells you an outcome. It doesn't tell you where the misses happened.
Meso shows a weekly heatmap per stream — coloured dots per day, diet and training side by side. The heatmap reveals the shape of compliance: Friday nights, travel weeks, peri-deload dips. Most tracking apps ship only the headline number, and it's the number that hides the patterns you actually need to fix.
If your diet number drops from 92% to 78% across a meso, the percentage tells you it happened. The heatmap tells you it was the four Fridays during a work trip. The first is data; the second is something you can act on.
Where I might still be wrong
Two things I haven't fully resolved:
- How training is measured during maintenance phases. Probably as a "transition" block rather than a real mesocycle, but I'm not locked in.
- Whether the home screen needs a single roll-up number alongside the two streams, or whether any composite undoes the work of separating them.
If you've built or used a training tracker that handled either of these well, I'd like to hear about it.
Replies
Be the first to reply.
Like this post?
Get new writing in your inbox — no spam, unsubscribe anytime.
Related posts
Seven days, 194 tasks, one daemon
What an autonomous task loop shipped when I stopped supervising it — and why I still went back to the terminal.
Vibe Coding Without Guardrails is a Disaster
A do-work manifesto
Chapter 1 - Why willpower-based transformation fails, and what ten people installed instead
Chapter 1 - Why willpower-based transformation fails, and what ten people installed instead
The Mental Architecture of Physical Transformation
Preface - What this book will not do for you
