EsteCoach
Sign inYour fitness coach who's seen every set you've lifted.
It reads your training, sleep, food and weight, and tells you how hard to go and what to lift. Every number comes from its own algorithms, never an AI guess.
A live demo on a made-up athlete, rebuilt every day.
Reviewing this as a portfolio piece? How it was built
EsteCoach turns a lifter's workouts, sleep, food and weight into one call a day: built for one athlete, shown here on a made-up one.
Three rules: no personal data in the code repo; every number comes from EsteCoach's own tested code, and the AI only explains it; one implementation per metric.
Designed and built by Stephen Sper.
Process, decisions and what broke along the way: HISTORY.md
Looking back · Sun 26 Jul 2026
How should you train today?
Nothing that has earned a vote is flagged.
Training loadcontextgood
last 7 days averaged 34 exercise min a day vs 33 over the last 4 weeks (1.03×): within the normal range; 3 rest days in the last 7, with a mix of longer and shorter sessions (monotony 1.1)
Effort (RPE)contextgood
sessions felt RPE 8.6 over the last 7 days vs 8.5 in the 4 weeks before
Sleepvotesgood
6.3 h last night; 6.7 h a night over the last 3 nights vs 7.1 h over the 30 before
HRV & resting HRcontextwatch
HRV 46 over the last 7 days vs 50 over the 30 before; resting HR 59 vs 59, same windows
How you feelcontextno data
nothing in your notes for today or yesterday
Nutritioncontextgood
eating 2,396 kcal a day over the last 4 days vs ~2,534 to maintain (4-week trend); protein 150 g a day over the same days vs 145 g target
Weight-loss pacecontextgood
losing 0.22% of body weight a week (last 4 weeks vs the 4 before): not fast enough to cost recovery (above 1% a week); this checks too fast, not too slow
i
Only areas with a record vote: an area votes once your sessions on its flagged days have gone worse than on its clear days (see Is the call working?). The rest are shown as context. Take it easy with one voting area in strain or two to watch, rest with two in strain. Going hard needs a reason that has itself gone with better sessions, never just nothing flagged. A safety rule (a health note, or coming back from a near-idle stretch) makes it a take-it-easy day whatever the record says. The score sits inside the call's band (rest 0–24, take it easy 25–49, as planned 50–74, go hard 75–100), higher the more areas are clear.
Today's session
i
Next in your push → pull → legs rotation after push on Sat 25 Jul. Exercises from your last Pull B (Fri 17 Jul); each target comes from the last time you did that exercise.
Each target comes from the last normal session of that exercise; deload days never set one. Main lifts: an estimated max from that session's sets and their RPEs, 5 lb more, and the reps that would land at RPE 8–9.5. A missed target holds the weight. Accessories: add a rep up to 12 (15 for calves, laterals, shrugs, face pulls, leg extensions, flyes), then add load and drop to the bottom of the range. Bodyweight: beat the last total reps by 1–2. No RPE logged: repeat it. A take-it-easy day is 80% of last time's sets and weight; a flagged back makes it 60%, every lift still in.
| Exercise | Today | Why | Last time |
|---|---|---|---|
| Barbell Bent-Over Row | 185 × 3–4 add load |
max about 213 from 180 × 5 at RPE 9.5 | 180 × 5, 180 × 5, 180 × 4 · Fri 17 Jul |
| Face Pull | 60 × 12 add a rep |
top set 60 × 11 at RPE 9 | 60 × 12, 60 × 12, 60 × 11 · Fri 17 Jul |
| Lat Pulldown | 165 × 8 add a rep |
top set 165 × 7 at RPE 9 | 165 × 9, 165 × 8, 165 × 7 · Fri 17 Jul |
| Dumbbell Hammer Curl | 40 × 11 add a rep |
top set 40 × 10 at RPE 9 | 40 × 12, 40 × 11, 40 × 10 · Fri 17 Jul |
Recovery
HRV 46 · resting HR 59 · slept 6.3 h
Recovery
Overnight HRV (ms)
Resting heart rate (bpm)
Sleep (hours asleep)
Load ratio (7-day vs 28-day)
Spinal load by day type, from your own sessions:
push 0.62 · pull 1.25 · legs 1.32 (0–3).i
Training calendar
May 2026
June 2026
July 2026
i
Hover a day for its sessions; click to open the page as of that day.
Body weight
181.6 lb · -0.52 lb a week, 4-week fit
Body weight
-0.52 lb a week, 4-week fit · 0.28% of body weight
| Last 7 days vs the 7 before | -0.7 lb | 0.39%/wk | Slower than planned |
| Last 4 weeks vs the 4 before | -1.6 lb (-0.39/wk) | 0.22%/wk | Slower than planned |
i
The goal date is a straight line at today's pace. Loss usually slows, so it's the pace you're on, not a promise.
The headline is the 14-day average, since one morning swings ±1.5 lb on water. The 4-week fit is a line through the last 4 weeks of weigh-ins. The two rows compare averages instead: the last 7 days against the 7 before, and the last 4 weeks against the 4 before, so they land near the fit but not on it. The weight prediction fits its own line since the cut started.
Planned pace: losing 0.5–1.0% of body weight a week (estecoach.toml). A single week moves 2–3 lb on water and glycogen alone, so the 4-week line is the one to act on.
Goal: 165 lb
Goal by 8 Mar 2027 at this pace · 16.6 lb to go · about 32 weeks
Strength
Squat + bench + deadlift 944 lb · DOTS 290
Strength
| Lift | e1RM | × body weight | Level | Next level at | At 165 lb |
|---|---|---|---|---|---|
| Squat | 312 lb | 1.72 | Intermediate | 362 lb | Intermediate |
| Bench press | 243 lb | 1.34 | Intermediate | 272 lb | Intermediate |
| Deadlift | 388 lb | 2.14 | Intermediate | 453 lb | Intermediate |
| Overhead press | 148 lb | 0.81 | Intermediate | 181 lb | Intermediate |
Squat + bench + deadlift: 944 lb, DOTS 290 (308 at 165 lb with the same lifts).
i
Levels use common 1RM-to-body-weight bands, scaled to your 182 lb 14-day average by body weight2/3, because a plain ratio underrates heavier lifters. e1RM comes from your best set (Epley), so lifts trained in sets of 3–5 read a little high or low against a tested single. The bands are a rough guide, not a federation standard. DOTS compares totals across body weights: roughly 300–350 is a good recreational lifter, about 400 national level, 500+ world class.
Nutrition
2,284 kcal a day · protein 159 g of 145 · 14 complete days of the last 14
Nutrition
Running low means under 90% of the reference intake, from food and supplements; near an upper limit means 50% of it or more. kcal a day over 14 complete days of the last 14. The readiness card's nutrition line uses the last 4 days, so its number differs. Logged = Apple's burn (active + resting) minus Cronometer intake.
Measured = what the 4-week weight trend implies (lb/week × 3,500 ÷ 7).
They differ by 262 kcal/day.
Protein target: 0.8 g per lb of body weight = 145 g/day at the 14-day trend (estecoach.toml); you're averaging 159 g, 109% of it.
For reference, 1.2–1.6 g per kg (0.54–0.73 g/lb) is the range usually cited for keeping muscle while losing weight. Reference: US Dietary Reference Intakes and upper limits, men 31–50.
Food counts only complete days where at least 80% of the day's calories came from foods that report the nutrient.
Supplements: Vitamin D3, Magnesium glycinate, Fish oil, every day, from supplements.toml.
Estimated from food logs and labels, not a blood test.i
Running low · last 28 days
| Nutrient | Food | + Supplements | Total | Of reference | Foods that close it |
|---|---|---|---|---|---|
| Vitamin E | 9.1 | – | 9.1 mg | 61% | sunflower seeds, almonds, peanut butter, avocado |
| Potassium | 3,047 | – | 3,047 mg | 90% | potatoes, beans and lentils, bananas, yogurt, spinach |
Near an upper limit
| Nutrient | Counted | Upper limit | Of limit | Note |
|---|---|---|---|---|
| Magnesium | 200 mg | 350 mg | 57% | supplements only: the limit applies to supplemental intake |
| Vitamin D | 2,245 IU | 4,000 IU | 56% | food + supplements. Food alone is about 230 IU a day; the 2,000 IU capsule is most of it. |
Predictions
3 open
Predictions
| Prediction | Resolves | So far | Target | Data coverage |
|---|---|---|---|---|
| P-001 The cut keeps the planned pace, 0.5 to 1% of body weight a week, until it ends
line fitted since 2 Nov 2025 (227 weigh-ins)
|
Thu 31 Dec 158 days |
-0.87 lb/week
currently outside
|
-2.1 to -1.1 lb/week | enough data
weigh-ins: 227 so far (318 needed by Thu 31 Dec), 4 excused; longest gap 4 (max 7) |
| P-002 Squat, bench, deadlift and press stay within 5% of their best at the start of the cut
interim: 2025-11-30 to 2026-07-26 vs 2025-11-02 to 2025-11-29; Bench press +9.6%, Deadlift +12.3%, Overhead press +4.4%, Squat +5.4%
|
Thu 31 Dec 158 days |
+7.5 %
currently inside
|
not below -5.0 % | – |
| P-003 HRV ends the cut more than one SD above where it started
30-day mean to 2026-07-26 vs 2025-11-02 to 2025-11-29
|
Thu 31 Dec 158 days |
48.6 ms (+9.3)
currently inside
|
more than 44.7 ms (baseline 39.3 + 1 SD 5.5) | enough data
nights with HRV: 235 so far (317 needed by Thu 31 Dec) |
i
Interim progress only. Each prediction resolves in ledger.md by its criterion as written, including the judgement calls a number can't make.
Data coverage says whether enough days are being logged for the prediction to be judged at all, not whether it is coming true.
Is the call working?
1 of 7 areas vote · 164 sessions graded
Is the call working?
Each session is graded on the share of its targets met, against the sessions within 45 days of it. Points are the difference between days an area was flagged and days it was clear.
| Area | Flagged / clear days | Flagged vs clear | Status |
|---|---|---|---|
| Training load | 20 / 144 | +19 pts (+7 to +32) | goes with better days |
| Effort (RPE) | 8 / 152 | – | not enough data yet |
| Sleep | 44 / 120 | -21 pts (-31 to -12) | votes |
| HRV & resting HR | 31 / 130 | -1 pts (-14 to +11) | no effect seen |
| How you feel | 12 / 22 | – | not enough data yet |
| Nutrition | 1 / 156 | – | not enough data yet |
| Weight-loss pace | 0 / 149 | – | not enough data yet |
| Reason to go hard: check-in | 13 / 7 | – | not enough data yet |
| Reason to go hard: last session | 32 / 130 | +12 pts (+1 to +22) | earns going hard |
Targets met after each call
| Call | Recorded calls | Under today's rules, all history |
|---|---|---|
| Go hard | 60% (9) | 73% (24) |
| Go as planned | 56% (49) | 55% (130) |
| Take it easy | 12% (2) | 40% (10) |
i
The call is graded against what happened after it. Recorded calls are the calls as they were made each morning; they are the real test, and they start empty. The made-up athlete has no mornings, so theirs are backfilled: each day's call made from only the data before it. Under today's rules replays every past session through the current votes; it was fitted on the same sessions, so it flatters the rule. If go-hard and take-it-easy days don't end up apart, the call isn't earning its place.
Training load
Last 7 days at 1.03× your 4-week norm
Training load
Exercise minutes
Hard sets
Tonnage, thousand lb
i
Exercise minutes are Apple's, from all activity. Hard sets are sets at RPE 7 or more, or every working set where no RPE was logged. Tonnage is logged weight × reps; pull-ups add sets, not pounds.
Load ratio is exercise minutes a day over the last 7 days divided by the same over the last 4 weeks, through yesterday. 1.0 is a normal week. Over 1.3 is a sharp jump and over 1.5 is where injury risk climbs; under 0.8 is a light week, flagged because a big session straight after one is the classic way to get hurt.