EsteBot
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
EsteBot 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 EsteBot'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 · Mon 19 Jan 2026
How should you train today?
Nothing that has earned a vote is flagged.
Training loadcontextgood
last 7 days averaged 35 exercise min a day vs 31 over the last 4 weeks (1.14×): within the normal range; 2 rest days in the last 7, with a mix of longer and shorter sessions (monotony 1.6)
Effort (RPE)contextgood
sessions felt RPE 8.5 over the last 7 days vs 8.3 in the 4 weeks before
Sleepvotesgood
7.7 h last night; 6.8 h a night over the last 3 nights vs 6.3 h over the 30 before
HRV & resting HRcontextgood
HRV 42 over the last 7 days vs 42 over the 30 before; resting HR 62 vs 62, same windows
How you feelcontextno data
nothing in your notes for today or yesterday
Nutritioncontextgood
eating 2,073 kcal a day over the last 4 days vs ~2,737 to maintain (4-week trend); protein 177 g a day over the same days vs 161 g target
Weight-loss pacecontextgood
losing 0.60% 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 17 Jan. Exercises from your last Pull B (Sat 10 Jan); each target comes from the last time you did that exercise.
One rule for every exercise, applied to its last session. Strength work (top set of 5 or fewer): RPE 8 or under adds load, 8.5–9 adds a rep. 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. Any top set at RPE 9.5+: hold the load and make it cleaner. No RPE logged: repeat it. A hold day repeats every load; a sore back drops the spine-loading lifts.
| Exercise | Today | Why | Last time |
|---|---|---|---|
| Barbell Deadlift | 305 × 5 add load |
top set 295 × 5 at RPE 7.5 | 295 × 5, 295 × 5, 295 × 5 · Sat 10 Jan |
| Pull-Up | 3 sets, 15–16 reps in total add reps |
last time 3 sets, 14 reps, hardest RPE 9 | 6, 5, 3 · Sat 10 Jan |
| Barbell Curl | 85 × 9 add a rep |
top set 85 × 8 at RPE 9 | 85 × 9, 85 × 8, 85 × 8 · Sat 10 Jan |
| Dumbbell Row | 85 × 10 add a rep |
top set 85 × 9 at RPE 8 | 85 × 10, 85 × 10, 85 × 9 · Sat 10 Jan |
Recovery
HRV 42 · resting HR 62 · slept 7.7 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.33 (0–3).i
Training calendar
November 2025
December 2025
January 2026
i
Hover a day for its sessions; click to open the page as of that day.
Body weight
201.1 lb · -1.27 lb a week, 4-week fit
Body weight
-1.27 lb a week, 4-week fit · 0.63% of body weight
| Last 7 days vs the 7 before | -0.9 lb | 0.47%/wk | Slower than planned |
| Last 4 weeks vs the 4 before | -4.8 lb (-1.21/wk) | 0.60%/wk | Within planned pace |
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 (estebot.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 6 Aug 2026 at this pace · 36.1 lb to go · about 28 weeks
Strength
Squat + bench + deadlift 887 lb · DOTS 258
Strength
| Lift | e1RM | × body weight | Level | Next level at | At 165 lb |
|---|---|---|---|---|---|
| Squat | 298 lb | 1.48 | Intermediate | 388 lb | Intermediate |
| Bench press | 222 lb | 1.10 | Intermediate | 291 lb | Intermediate |
| Deadlift | 368 lb | 1.83 | Intermediate | 485 lb | Intermediate |
| Overhead press | 140 lb | 0.70 | Novice | 145 lb | Intermediate |
Squat + bench + deadlift: 887 lb, DOTS 258 (289 at 165 lb with the same lifts).
i
Levels use common 1RM-to-body-weight bands, scaled to your 201 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,163 kcal a day · protein 174 g of 161 · 13 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 13 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 386 kcal/day.
Protein target: 0.8 g per lb of body weight = 161 g/day at the 14-day trend (estebot.toml); you're averaging 174 g, 108% 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, 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 | 8.5 | – | 8.5 mg | 56% | sunflower seeds, almonds, peanut butter, avocado |
| Fiber | 27 | – | 27 g | 72% | beans and lentils, oats, berries, chia seeds, vegetables |
| Potassium | 2,965 | – | 2,965 mg | 87% | potatoes, beans and lentils, bananas, yogurt, spinach |
| Magnesium | 375 | – | 375 mg | 89% | pumpkin seeds, almonds, spinach, black beans, dark chocolate |
Near an upper limit
| Nutrient | Counted | Upper limit | Of limit | Note |
|---|---|---|---|---|
| Vitamin D | 2,214 IU | 4,000 IU | 55% | 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 31 Oct 2025 (62 weigh-ins)
|
Tue 29 Dec 344 days |
-1.24 lb/week
currently inside
|
-2.1 to -1.1 lb/week | enough data
weigh-ins: 62 so far (318 needed by Tue 29 Dec); longest gap 3 (max 7) |
| P-002 Squat, bench, deadlift and press stay within 5% of their best at the start of the cut
interim: 2025-11-28 to 2026-01-19 vs 2025-10-31 to 2025-11-27; Bench press +0.0%, Deadlift +3.3%, Overhead press +0.0%, Squat +2.0%
|
Tue 29 Dec 344 days |
+1.0 %
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-01-19 vs 2025-10-31 to 2025-11-27
|
Tue 29 Dec 344 days |
42.7 ms (+0.7)
currently outside
|
more than 46.6 ms (baseline 42.0 + 1 SD 4.6) | enough data
nights with HRV: 49 so far (317 needed by Tue 29 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 · 47 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 | 13 / 34 | – | not enough data yet |
| Effort (RPE) | 2 / 41 | – | not enough data yet |
| Sleep | 17 / 30 | -26 pts (-43 to -8) | votes |
| HRV & resting HR | 11 / 33 | – | not enough data yet |
| How you feel | 6 / 6 | – | not enough data yet |
| Nutrition | 4 / 43 | – | not enough data yet |
| Weight-loss pace | 0 / 29 | – | not enough data yet |
| Reason to go hard: check-in | 4 / 2 | – | not enough data yet |
| Reason to go hard: last session | 13 / 32 | – | not enough data yet |
Targets met after each call
| Call | Recorded calls | Under today's rules, all history |
|---|---|---|
| Go hard | 74% (15) | – |
| Go as planned | 60% (35) | 68% (42) |
| Take it easy | 44% (9) | 68% (5) |
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.14× 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.