Niko McGrathSelected work, 2021–2026
← All work

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.

2026-W42 The health state planned Wednesday 14 October · 10:13–11:29

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

trainer · w42-tr-02HIIT 4x4 (3 intervals)

when
Wed, 16:30–20:30
length
32 min, straight after the lift
can bend
shorten to 25 min, move to Thu

nutritionist · w42-nu-01Grocery shop (one trip for the week)

when
Wed, 16:25–21:00
length
30 min
can bend
shorten to 25 min, move to Thu

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

  1. 10:32→11:15Video edit due Friday: 12 h needed, 7.2 h fit“I actually finished the video today. so it is finished.”
  2. 11:18→11:20HIIT can't follow Wednesday's lift: second trip, or Thursdaymove to thu (18:40)
  3. 11:18→11:21The video deadline is still on the calendar“The video is done so remove it”
  4. 11:23→11:29Thursday now has three gym trips and three showersshorten to 18m on thu
  5. 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

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 19 of 28 can't tell · 0 low · 1 over the limit

Vitamins

Vitamin A low can't tell 28% + 72% 28%
Vitamin C 438% 415% met met 28% + 72% 28%
Vitamin D low can't tell 12% + 88% 12%
Vitamin E low can't tell 36% + 64% 36%
Vitamin K met met 28% + 72% 28%
Thiamin (B1) met can't tell 48% + 52% 48%
Riboflavin (B2) 267% 228% met met 54% + 46% 54%
Niacin (B3) 389% met met 50% + 50% 50%
Pantothenic acid (B5) met can't tell 46% + 54% 46%
Vitamin B6 446% 374% met met 56% + 44% 56%
Folate low can't tell 47% + 53% 47%
Vitamin B12 743% 604% met met 25% + 75% 25%
Choline low can't tell 35% + 65% 35%

Minerals

Calcium low can't tell 51% + 49% 51%
Copper met can't tell 46% + 54% 46%
Iron met can't tell 48% + 52% 48%
Magnesium low can't tell 47% + 53% 47%
Manganese met can't tell 46% + 54% 46%
Phosphorus met can't tell 47% + 53% 47%
Potassium low can't tell 51% + 49% 51%
Selenium 201% met met 46% + 54% 46%
Sodium over the limit met 70% + 30% 70%
Zinc low can't tell 46% + 54% 46%

Fats, fibre and limits

Fibre low can't tell 49% + 51% 49%
Omega-3 (ALA) low can't tell 33% + 67% 33%
Saturated fat a limit, no target within the limit can't tell 51% + 49% 51%
Added sugar a limit, no target over the limit over the limit 7% + 93% 7%
Caffeine a limit, no target within the limit can't tell 4% + 96% 4%

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
NutrientMacroFactor aloneWith estimatesCovered
Vitamin A18%, can't tell34%, low28% measured + 72% estimated
Vitamin C415%, met438%, met28% measured + 72% estimated
Vitamin D28%, can't tell47%, low12% measured + 88% estimated
Vitamin E24%, can't tell48%, low36% measured + 64% estimated
Vitamin K107%, met131%, met28% measured + 72% estimated
Thiamin (B1)86%, can't tell112%, met48% measured + 52% estimated
Riboflavin (B2)228%, met267%, met54% measured + 46% estimated
Niacin (B3)196%, met389%, met50% measured + 50% estimated
Pantothenic acid (B5)72%, can't tell144%, met46% measured + 54% estimated
Vitamin B6374%, met446%, met56% measured + 44% estimated
Folate77%, can't tell97%, low47% measured + 53% estimated
Vitamin B12604%, met743%, met25% measured + 75% estimated
Choline30%, can't tell66%, low35% measured + 65% estimated
Calcium36%, can't tell50%, low51% measured + 49% estimated
Copper59%, can't tell110%, met46% measured + 54% estimated
Iron93%, can't tell123%, met48% measured + 52% estimated
Magnesium32%, can't tell64%, low47% measured + 53% estimated
Manganese85%, can't tell146%, met46% measured + 54% estimated
Phosphorus74%, can't tell168%, met47% measured + 53% estimated
Potassium38%, can't tell68%, low51% measured + 49% estimated
Selenium111%, met201%, met46% measured + 54% estimated
Sodium124%, met168%, over the limit70% measured + 30% estimated
Zinc35%, can't tell71%, low46% measured + 54% estimated
Fibre34%, can't tell42%, low49% measured + 51% estimated
Omega-3 (ALA)29%, can't tell47%, low33% measured + 67% estimated
Saturated fat—, can't tell—, within the limit51% measured + 49% estimated
Added sugar—, over the limit—, over the limit7% measured + 93% estimated
Caffeine—, can't tell—, within the limit4% 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.

Compare with

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

VO2max 43 ml/kg/min better than 38% better than 50% higher is better · typical of 28
HRV, overnightapprox. 82.3 ms better than 65% better than 77% higher is better · typical of men younger than 20
Resting heart rate, overnightapprox. 54.6 bpm better than 83% better than 82% lower is better
Respiratory rate (sleep)approx. 15.6 breaths/min mid-range (52nd percentile) mid-range (53rd percentile) the middle is best

Blood pressure

Systolic blood pressure 107 mmHg better than 85% better than 85% lower is better · typical of men younger than 20
Diastolic blood pressure 69 mmHg better than 36% better than 49% lower is better · typical of 26

Body

Weight 78.8 kg mid-range (53rd percentile) mid-range (44th percentile) the middle is best
BMI 25.4 kg/m² mid-range (52nd percentile) mid-range (45th percentile) the middle is best
Waist circumference 93 cm better than 38% better than 45% lower is better · typical of 28

Cholesterol & fats

LDL cholesterol 95 mg/dL better than 46% better than 57% lower is better · typical of 21
Triglycerides 84 mg/dL better than 45% better than 49% lower is better · typical of 27
HDL cholesterol 60 mg/dL better than 84% better than 81% higher is better

Blood sugar

Fasting glucose 63 mg/dL lower than almost all lower than almost all the middle is best

Liver & kidneys

ALT (GPT) 25 U/L better than 39% better than 45% lower is better
AST (GOT) 29 U/L better than 23% better than 23% lower is better
γ-GTP (GGT) 25 U/L better than 24% better than 35% lower is better

Blood & inflammation

Hemoglobin 15.1 g/dL mid-range (42nd percentile) mid-range (44th percentile) the middle is best
Red blood cells 512 ×10⁴/µL mid-range (50th percentile) mid-range (56th percentile) the middle is best

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
MarkerMevs men of 20vs men of 26Median at 20
VO2max (estimated)43 ml/kg/minbetter than 38% of 20-year-old menbetter than 50% of men aged 2645.4
HRV (RMSSD, overnight)82.3 msbetter than 65% of 20-year-old menbetter than 77% of men aged 2666
Resting heart rate (wearable)54.6 bpmbetter than 83% of 20-year-old menbetter than 82% of men aged 2661.8
Respiratory rate (sleep)15.6 breaths/minmid-range for 20-year-old men (percentile 52)mid-range for men aged 26 (percentile 53)15.5
Systolic blood pressure107 mmHgbetter than 85% of 20-year-old menbetter than 85% of men aged 26117
Diastolic blood pressure69 mmHgbetter than 36% of 20-year-old menbetter than 49% of men aged 2665.3
Weight78.8 kgmid-range for 20-year-old men (percentile 53)mid-range for men aged 26 (percentile 44)76.8
BMI25.4 kg/m²mid-range for 20-year-old men (percentile 52)mid-range for men aged 26 (percentile 45)25.1
Waist circumference93 cmbetter than 38% of 20-year-old menbetter than 45% of men aged 2686.4
LDL cholesterol95 mg/dLbetter than 46% of 20-year-old menbetter than 57% of men aged 2692
Triglycerides84 mg/dLbetter than 45% of 20-year-old menbetter than 49% of men aged 2678
HDL cholesterol60 mg/dLbetter than 84% of 20-year-old menbetter than 81% of men aged 2647
Fasting glucose63 mg/dLlower than almost all 20-year-old menlower than almost all men aged 2696
ALT (GPT)25 U/Lbetter than 39% of 20-year-old menbetter than 45% of men aged 2621
AST (GOT)29 U/Lbetter than 23% of 20-year-old menbetter than 23% of men aged 2622
γ-GTP (GGT)25 U/Lbetter than 24% of 20-year-old menbetter than 35% of men aged 2617
Hemoglobin15.1 g/dLmid-range for 20-year-old men (percentile 42)mid-range for men aged 26 (percentile 44)15.3
Red blood cells512 ×10⁴/µLmid-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.

First plan median 01:28 median 00:10
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
BeforeAfter
Asleep a night5.5 h6.3 h
Asleep by (median)01:2800:10
Recovery49%67%
HRV68 ms83 ms
Nights of 7 h or more3 of 295 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.