No. 09 · Personal · 2026
Blueprint
A data analyst, sleep specialist, trainer, nutritionist, longevity consultant and scheduler work from my WHOOP, Strava and MacroFactor data. Each week they draft a plan, push back on each other, and code fits the result around my school week.
- Role
- Builder
- Stack
- TypeScript · SQLite · Claude Code
- Data
- WHOOP · Strava · MacroFactor
Bryan Johnson’s Blueprint puts a team of specialists to work on one person’s data. I wanted the structure without the spend. Blueprint is six AI specialists, each a Claude Code agent with one job: a data analyst, a sleep specialist, a trainer, a nutritionist, a longevity consultant and a scheduler. Every week they read my WHOOP, MacroFactor and Strava data, each drafts its part of the plan, and code fits the result around my school timetable. A dashboard on my own machine shows the data and the week, and the week prints on one page.
One week, through the team
The health state
A run starts with the data analyst. It reads every import, from WHOOP, MacroFactor and Strava to the labs from my workplace health check, and writes one health state that the other specialists all plan from. Code works out the averages and trends; the analyst reads them and decides what they mean.
W42 was planned on Wednesday 14 October, in a week of exam supervision. Recovery was good that morning, at 77%, but I’d been sleeping 5.5 hours a night against a 9.3-hour need, and I hadn’t lifted since 8 October. Where data was missing, the analyst asked me for it: five requests, from a fresh MacroFactor export to a blood panel.
Sleep goes first
The sleep specialist plans next, before anyone asks for time, because everything else has to fit around sleep. Its target is 22:45 to 07:15, and it moves toward it a step at a time: this week, lights out at 23:45, and 00:15 at the weekend. My own minimum of seven hours is a floor the window can’t go under.
Its rules bind the others. With HIIT in the week, every session has to end two hours before lights out, so on weekdays nothing can be placed after 21:45.
What, not when
Then the trainer and the nutritionist say what they want, without saying when. Every request has a length, a window it has to fall in, a priority, and the ways it can bend: shorter, on another day, or dropped. Some hang off others. The HIIT is anchored straight after Wednesday’s lift, so the two make one trip to the gym.
The trainer asked for 13 sessions over five days, to restart the routine with upper-body volume first. The nutritionist asked for 12 slots, from one grocery trip on Wednesday to batch prep on Sunday, and planned food to fill MacroFactor’s targets of 1,968 kcal and 167 g of protein a day. MacroFactor’s algorithm sets those numbers; the nutritionist never sets its own.
A second opinion
Before anything is placed, the longevity consultant reads every plan and flags what could hurt, with its sources. W42 got six flags. The two cautions went to the specialists who could act on them: running load jumped about four times in four days, and lights out at 23:45 still meant about 6.5 hours asleep. The rest were notes, two of them for me: a bento sitting at school until lunch, and that stopping energy drinks cold can bring headaches, on exam days.
The fit
No agent places anything. A deterministic fit, plain TypeScript, places each request by priority inside its window, adds the travel and the shower every gym trip needs, and protects my capacity first: sleep, the wind-down, and an hour of free time a day. Whatever doesn’t fit goes back to whoever asked for it, with options the fit has already checked will work.
Two things didn’t fit in W42. The grocery trip and the meal prep left no room for the HIIT straight after Wednesday’s lift, so the fit made it a second gym trip at 19:30 and sent that back to the trainer. And a 12-hour video edit due on Friday, for the job in No. 08, had 7.2 hours of room, which only I could decide about.
Questions for me
Anything only I can settle comes to the dashboard as a card, with those options. The run doesn’t sit waiting: it stops, and my answer starts it again in a fresh context, from the state in the database.
W42 asked five questions. The first waited 43 minutes for me, and my answer was a note: I’d finished the video that day. I moved the HIIT to Thursday, and the next fit showed what that cost: three gym trips and three showers in one evening, with dinner at 21:15. I shortened it to 18 minutes. Two of the five were the video again, still on the calendar until the scheduler took it off.
The week
At 11:29 the last fit placed everything, with nothing left open. The trainer had revised its plan three times and the nutritionist once. The HIIT now runs straight after Thursday’s lift, in one trip, and Wednesday got a 20-minute zone 2 walk after dinner.
From launch to finish took 77 minutes, 30 of them working, over 24 messages and four launches. At API rates it would have cost $7.87; it runs on my Claude login instead. The week goes to the dashboard, to a one-page printout, and to a brief in my notes.
Data analyst → everyone · health state, 10/14
- Recovery today
- 77% 7-day 65%
- Asleep, 7 days
- 5.5 h need 9.3 h · debt 2.1 h
- HRV, 7 days
- 88 ms 28-day 76
- Resting HR, 7 days
- 52 28-day 57
- Last lift
- 8 Oct six days ago
- Fitness score
- 32.6 target 40 by 29 Nov
Asked me for 5 things: a fresh MacroFactor export, a Strava re-sync, weekly blood pressure and waist, a body-composition scan, a blood panel.
Sleep → everyone · sleep plan
Target 22:45 → 07:15, 8.5 h. This week 23:45 → 07:15, 00:15 → 07:45 at the weekend.
Rule for the others: training ends 2 h before lights out (the dashed line).
“Short, fairly irregular sleep: 5.5 h asleep against a 9.3 h need over 7 days (debt 2.1 h).”
Trainer and nutritionist → fit · 13 + 12 requests
- when
- Wed, 16:30–20:30
- length
- 32 min, straight after the lift
- can bend
- shorten to 25 min, move to Thu
trainer · w42-tr-02HIIT 4x4 (3 intervals)
- when
- Wed, 16:25–21:00
- length
- 30 min
- can bend
- shorten to 25 min, move to Thu
nutritionist · w42-nu-01Grocery shop (one trip for the week)
Food targets come from MacroFactor: 1,968 kcal, 167 g protein.
Longevity → its owners · 6 flags
- cautionTrainerRunning load jumps about 4x in four days.
- cautionSleepLights out at 23:45 this week means 7.5 h in bed, about 6.5 h asleep at 86% efficiency.
- infoNutritionistThe plan's sodium fixes are good: no instant noodles or bought bowls, 減塩 soy, salt over tare.
- infoMeChicken and barley rice cooked Wednesday are eaten up to Friday lunch, and bentos sit at school until 12:40.
- infoData analystThe meal plan says the user takes creatine.
- infoMeEnergy drinks are out this week (logged up to 284 mg caffeine on 2026-10-09).
Fit (code) · 56 blocks placed, Wed–Sun · 2 that don't fit
- Trainer No room for the HIIT straight after Wednesday's lift, with the grocery trip and prep in the way. Placed at 19:30 as a second gym trip.
- Me The video edit due Friday needs 12 h; 7.2 h fit.
Fit → me · 5 questions, answered on the dashboard
- 10:32→11:15Video edit due Friday: 12 h needed, 7.2 h fit“I actually finished the video today. so it is finished.”
- 11:18→11:20HIIT can't follow Wednesday's lift: second trip, or Thursdaymove to thu (18:40)
- 11:18→11:21The video deadline is still on the calendar“The video is done so remove it”
- 11:23→11:29Thursday now has three gym trips and three showersshorten to 18m on thu
- 11:23→11:29This schedule still books 5.4 h of editingKeep the week as it is
Fit · final schedule, 11:29 · nothing left open
- Start to finish
- 77 min 30 of them working
- Messages
- 24 between 7 parties
- Launches
- 4 a fresh one after each answer
- Cost at API rates
- $7.87 on my Claude login
Wed 14exams
Thu 15exams
Fri 16exams
Sat 17off
Sun 18off
The agents judge; the code does the arithmetic
Six agents planning a week would drift without rails, so each one has a narrow job, and everything it says is a typed document. Every message, from a health state or a sleep plan to a conflict report or one of my decisions, has a schema, and blueprint msg post checks it before it’s stored. It also checks it against the week: a sleep window under my minimum or overlapping school is refused, and so is a workout plan that leaves an active day without a session.
The orchestrator holds no state of its own. blueprint run next reads the run’s messages from SQLite and says what happens next: who to start, which conflicts are open, whether to wait for me. That’s why a run can stop for 43 minutes, or crash, and pick up exactly where it was.
Anything that’s arithmetic is code: averages and trends, the fit, percentiles, the fitness score. The specialists judge. When they need more than a summary, they can query the raw data through a read-only blueprint sql. Asked whether falling asleep after 1 a.m. mattered, the sleep specialist wrote one query and found 17 such nights in September averaging 38.9% recovery, against 63.8% on the 5 nights before midnight. Then it pointed out the catch itself: the late nights also came with 4.7 hours of sleep instead of 7.5.
The specialists run headless, allowed only blueprint commands. An early probe showed that a headless agent could read any file in its working folder, so they now start in an empty one, the secrets live outside the repo, and the design docs are the only files they can read. A tuning pass on the prompts took rejected posts from 27% to 3%, and reads of the source code from 49 to 1.
Cost shapes the design as much as anything. The first week with daily training cost $16.38 at API rates. Running the fit in code, waking the scheduler only for conflicts, and trimming what each agent reads brought the next week to $4.12, and weeks since have run between $5 and $8.
Honest about what it can't see
MacroFactor logs calories and macros for everything I eat, but vitamins and minerals only for foods from its own database. A label I typed in, a konbini bento, a bowl from Matsuya: none of them carry any. Averaging what’s there would make me look short of nearly everything.
So the diet review weighs each nutrient by its coverage, the share of my calories from foods that report it, and calls a shortfall low only when at least 80% of those calories are covered. Below that, the honest answer is “can’t tell”. On MacroFactor’s numbers alone, that was the answer for 19 of 28 nutrients.
To fill the gaps, Claude estimates each food MacroFactor leaves blank: from its ingredients, or for packaged food, from the maker’s nutrition label (栄養成分表示), found with a web search. Code checks each estimate’s calories against the logged entry and its values against sane ranges. So far that’s 91 foods, 31 of them estimated with high confidence. A low-confidence estimate counts only provisionally and asks me a question in the inbox (“sauce only, or coated pieces?”); my answer re-estimates the food.
What 17 days of logged food can tell
Each nutrient as a share of its daily target (US reference intakes, men 19–30), 29 Sept to 26 Oct. Hollow: MacroFactor's numbers alone. Filled: with the AI estimates.
0 of 28 can't tell · 11 low · 2 over the limit
Vitamins
Minerals
Fats, fibre and limits
Source: Blueprint's diet review, run twice on the same food log. "Covered": the share of calories from foods that report the nutrient, measured + estimated. Below 80%, a shortfall can't be called low.
See the numbers
| Nutrient | MacroFactor alone | With estimates | Covered |
|---|---|---|---|
| Vitamin A | 18%, can't tell | 34%, low | 28% measured + 72% estimated |
| Vitamin C | 415%, met | 438%, met | 28% measured + 72% estimated |
| Vitamin D | 28%, can't tell | 47%, low | 12% measured + 88% estimated |
| Vitamin E | 24%, can't tell | 48%, low | 36% measured + 64% estimated |
| Vitamin K | 107%, met | 131%, met | 28% measured + 72% estimated |
| Thiamin (B1) | 86%, can't tell | 112%, met | 48% measured + 52% estimated |
| Riboflavin (B2) | 228%, met | 267%, met | 54% measured + 46% estimated |
| Niacin (B3) | 196%, met | 389%, met | 50% measured + 50% estimated |
| Pantothenic acid (B5) | 72%, can't tell | 144%, met | 46% measured + 54% estimated |
| Vitamin B6 | 374%, met | 446%, met | 56% measured + 44% estimated |
| Folate | 77%, can't tell | 97%, low | 47% measured + 53% estimated |
| Vitamin B12 | 604%, met | 743%, met | 25% measured + 75% estimated |
| Choline | 30%, can't tell | 66%, low | 35% measured + 65% estimated |
| Calcium | 36%, can't tell | 50%, low | 51% measured + 49% estimated |
| Copper | 59%, can't tell | 110%, met | 46% measured + 54% estimated |
| Iron | 93%, can't tell | 123%, met | 48% measured + 52% estimated |
| Magnesium | 32%, can't tell | 64%, low | 47% measured + 53% estimated |
| Manganese | 85%, can't tell | 146%, met | 46% measured + 54% estimated |
| Phosphorus | 74%, can't tell | 168%, met | 47% measured + 53% estimated |
| Potassium | 38%, can't tell | 68%, low | 51% measured + 49% estimated |
| Selenium | 111%, met | 201%, met | 46% measured + 54% estimated |
| Sodium | 124%, met | 168%, over the limit | 70% measured + 30% estimated |
| Zinc | 35%, can't tell | 71%, low | 46% measured + 54% estimated |
| Fibre | 34%, can't tell | 42%, low | 49% measured + 51% estimated |
| Omega-3 (ALA) | 29%, can't tell | 47%, low | 33% measured + 67% estimated |
| Saturated fat | —, can't tell | —, within the limit | 51% measured + 49% estimated |
| Added sugar | —, over the limit | —, over the limit | 7% measured + 93% estimated |
| Caffeine | —, can't tell | —, within the limit | 4% measured + 96% estimated |
With the estimates, every nutrient gets a verdict, and the picture changes. Eleven come out low, from vitamin A to omega-3. Sodium, which looked fine at 124% of its target, is over its limit at 168%.
The estimates have a twin that checks the numbers MacroFactor does have. It started when I noticed a can of Monster logged with ten times its real sodium. Now, after every import, the biggest sources of sodium, saturated fat and added sugar are checked against their labels: 21 checks so far, and 6 corrections. One energy drink was logged with 568 mg of sodium per 355 ml, against 60 on its label; a cup noodle with 0.6 g of saturated fat had 11.5.
Next to a 20-year-old, or men my age
The yardstick is a younger body: men of 20. A switch on the chart puts me next to men my own age instead. They’re US men, since I’m American, from NHANES, the CDC survey that examines and takes blood from a sample of Americans weighted to stand for the whole country.
The tool reads NHANES’s public files directly, 61 of them and 99 MB in SAS’s old transport format, and works out weighted percentiles for every age from 20 to 77, each pooled with the two years either side. Checked against the CDC’s own published tables for men in their twenties, the sample size matches exactly, at 801 men, and the BMI percentiles agree within 0.1.
NHANES doesn’t measure what WHOOP does, so heart-rate variability, resting heart rate and breathing rate overnight come from published wearable studies instead. Those were Fitbit users, so they’re marked approximate.
Next to US men of 2026, my age
18 markers measured so far. Bands: where the middle 95% and the middle half of men fall; the tick is the median. The dot is me, at 26.
Better than most men of 20 on 4 of 12 markers; for the other 6, the middle is best Better than most men of 26 on 5 of 12 markers; for the other 6, the middle is best
Furthest ahead of men of 20: systolic blood pressure (85%), HDL (84%), resting heart rate (83%) and HRV (65%). Furthest behind: AST (23%), γ-GTP (24%), diastolic blood pressure (36%), VO2max (38%), waist (38%) and ALT (39%). Percentages: the share of them I'm better than.
Furthest ahead of men of 26: systolic blood pressure (85%), resting heart rate (82%), HDL (81%), HRV (77%) and LDL (57%). Furthest behind: AST (23%) and γ-GTP (35%). Percentages: the share of them I'm better than.
Heart & fitness
Blood pressure
Body
Cholesterol & fats
Blood sugar
Liver & kidneys
Blood & inflammation
Source: NHANES (CDC), weighted percentiles for US men within two years of each age; labs from my 2026 workplace health check, the rest from WHOOP, MacroFactor and a tape measure. "Approx.": wearable norms from published Fitbit studies, which NHANES doesn't measure. Not measured yet: 10 more, from ApoB to grip strength.
See the numbers
| Marker | Me | vs men of 20 | vs men of 26 | Median at 20 |
|---|---|---|---|---|
| VO2max (estimated) | 43 ml/kg/min | better than 38% of 20-year-old men | better than 50% of men aged 26 | 45.4 |
| HRV (RMSSD, overnight) | 82.3 ms | better than 65% of 20-year-old men | better than 77% of men aged 26 | 66 |
| Resting heart rate (wearable) | 54.6 bpm | better than 83% of 20-year-old men | better than 82% of men aged 26 | 61.8 |
| Respiratory rate (sleep) | 15.6 breaths/min | mid-range for 20-year-old men (percentile 52) | mid-range for men aged 26 (percentile 53) | 15.5 |
| Systolic blood pressure | 107 mmHg | better than 85% of 20-year-old men | better than 85% of men aged 26 | 117 |
| Diastolic blood pressure | 69 mmHg | better than 36% of 20-year-old men | better than 49% of men aged 26 | 65.3 |
| Weight | 78.8 kg | mid-range for 20-year-old men (percentile 53) | mid-range for men aged 26 (percentile 44) | 76.8 |
| BMI | 25.4 kg/m² | mid-range for 20-year-old men (percentile 52) | mid-range for men aged 26 (percentile 45) | 25.1 |
| Waist circumference | 93 cm | better than 38% of 20-year-old men | better than 45% of men aged 26 | 86.4 |
| LDL cholesterol | 95 mg/dL | better than 46% of 20-year-old men | better than 57% of men aged 26 | 92 |
| Triglycerides | 84 mg/dL | better than 45% of 20-year-old men | better than 49% of men aged 26 | 78 |
| HDL cholesterol | 60 mg/dL | better than 84% of 20-year-old men | better than 81% of men aged 26 | 47 |
| Fasting glucose | 63 mg/dL | lower than almost all 20-year-old men | lower than almost all men aged 26 | 96 |
| ALT (GPT) | 25 U/L | better than 39% of 20-year-old men | better than 45% of men aged 26 | 21 |
| AST (GOT) | 29 U/L | better than 23% of 20-year-old men | better than 23% of men aged 26 | 22 |
| γ-GTP (GGT) | 25 U/L | better than 24% of 20-year-old men | better than 35% of men aged 26 | 17 |
| Hemoglobin | 15.1 g/dL | mid-range for 20-year-old men (percentile 42) | mid-range for men aged 26 (percentile 44) | 15.3 |
| Red blood cells | 512 ×10⁴/µL | mid-range for 20-year-old men (percentile 50) | mid-range for men aged 26 (percentile 56) | 512 |
Against men of 20, I’m ahead of most on four of the twelve markers that have a better direction; against men my age, on five. The liver enzymes AST and γ-GTP stay weak either way, and WHOOP’s VO2max estimate of 43 is typical of a man of 28. A fasting glucose of 63 is lower than almost anyone’s, but glucose is a marker where the middle is best, so it’s flagged to watch rather than counted as a win.
What it does for work
I didn’t build Blueprint only to live longer. My weekdays are teaching, then editing for a client and building things like this in the evening, and all of it runs on the same few hours of sleep, the same meals, and whatever time is left.
Sleep is the biggest lever. In a 2003 study, people allowed six hours in bed a night for two weeks built up cognitive deficits equal to up to two nights without any sleep, and they were largely unaware of it: how sleepy they felt hardly changed. Across five countries, RAND estimated that a worker sleeping under six hours loses about six more working days a year than one sleeping seven to nine, and put Japan’s yearly loss at up to 2.9% of its GDP.
That was me. In the month before the first plan, I slept 5.5 hours a night and was usually asleep at about half past one. Over the 15 nights since, with a bedtime set each week, I’ve averaged 6.3 hours and been asleep by about ten past midnight, and recovery has gone from 49% to 67%.
The month before the first plan, and the 15 nights after
Every night WHOOP recorded, as a bar from falling asleep to waking, dated by the morning. Grey: before the first plan on 29 Sept. Orange: under a plan.
- Asleep a night
- 5.5 h→6.3 h
- Asleep by (median)
- 01:28→00:10
- Recovery
- 49%→67%
- HRV
- 68 ms→83 ms
- Nights of 7 h or more
- 3 of 29→5 of 15
Source: WHOOP export through 14 Oct. Before: 31 Aug–29 Sept, 29 nights recorded; after: 30 Sept–14 Oct. Off the chart: 19 Sept (13:05–17:40) and 25 Sept (17:24–04:55), both kept in the averages. One person over a few weeks, not a trial.
See the numbers
| Before | After | |
|---|---|---|
| Asleep a night | 5.5 h | 6.3 h |
| Asleep by (median) | 01:28 | 00:10 |
| Recovery | 49% | 67% |
| HRV | 68 ms | 83 ms |
| Nights of 7 h or more | 3 of 29 | 5 of 15 |
| Sleep consistency (WHOOP) | 57% | 74% |
Scheduling saves the deciding. Each week, every session, meal and errand gets a time and a place once, when the plan is made. A 2006 meta-analysis of 94 tests found that plans saying when and where something will happen raise follow-through, with an average effect of d = 0.65, medium to large. The capacity check matters as much, because paid work goes into the same week as training and food, so an overbooked week shows up before it starts. When W42 was planned, the fit flagged that a 12-hour edit had only 7.2 hours of room before its Friday deadline. I’d already finished that one, but the check runs every week.
Food is planned for time as well as nutrition. W42’s shopping and batch cooking came to one 30-minute shop and two prep sessions, 2 hours 40 minutes for the week, and even in an exam week Thursday and Friday kept more than four free hours each after training. In a survey of 19,803 employees at three large US companies, those with unhealthy diets were 66% more likely to report lost productivity at work, and occasional exercisers 50% more likely. That’s self-reported and a correlation, and the same study found the biggest factor was the work itself, too much of it in too little time, which is the case for the capacity check.
What Blueprint doesn’t measure yet is the work itself. Sleep, recovery and the schedule are tracked every day; my output isn’t. So the link to productivity here rests on the research and on how the weeks have felt, and 15 nights is a short window. Measuring the work is the next piece.