Consulting Work Blog Contact
← Back to blog

I'm finally getting the most out of my Apple Watch data

I'm finally getting the most out of my Apple Watch data

I wore an Apple Watch for six years before I understood what the data was for.

It tracked my heart, my sleep, my steps — four thousand a day, most of them to the kitchen — and wrote all of it into a database I never opened. Then I started cycling to skip an always-late train, the gym stopped being a twice-a-year place, and one question began showing up before coffee every morning: go hard today, go easy, or rest? For years I answered by feel. Feel, it turns out, is a coin flip in a lab coat. So I sat down with Claude and built the thing that answers it properly.

Normal for me, not for everyone

Every morning my Apple Health export lands in a small database on my own machine — nothing leaves the house. The system reads four signals, and scores each one not against some textbook average but against me: a rolling 28-day baseline of my own numbers.

  • Heart-rate variability — the tiny gaps between heartbeats. Lots of variation means a recovered nervous system; when it collapses I’m tired, stressed, or fighting something off. It’s the most honest signal on the watch, and it usually knows before I do.
  • Resting heart rate — the floor my pulse settles to overnight. A few beats above my baseline is an early warning: under-recovery, or a cold coming on.
  • Sleep — how much I actually got, measured against my own normal.
  • Training load — how much work I’ve really done, pulled from a log of every session.

Each signal becomes a z-score — how far today sits from my normal, measured in my own spread — and the four collapse into a single 0-to-100 number where an average morning is 50. Population norms are useless here: a resting heart rate that’s fine for the average person can be a quiet warning sign for me. The only baseline that means anything is your own recent history.

The load nobody warns you about

Load isn’t just a total; it’s a ratio — this week’s training against the last month’s. Stay roughly between 0.8 and 1.3 and you’re progressing safely. Push higher and you’re ramping faster than your body can adapt, which is where injuries live. Drift lower and you’re detraining — quietly losing what you built.

I expected it to catch overtraining. The morning it told me I’d gone too soft for too long, I laughed out loud — a small program politely refusing to let me confuse well-rested with well-trained.

The database that predicts soreness

Every workout goes into a training database: which muscles, when, how hard. That log feeds the load ratio, and then it does something smarter — it predicts soreness.

DOMS, the deep ache a day after a hard session, is sneaky because it’s delayed. It arrives twelve to twenty-four hours later, peaks one to three days out, then fades. Your recovery signals can look flawless while your quads are still rebuilding. So the database reads what I trained and when against that curve: hammer legs on Monday, and by Wednesday it knows they aren’t ready — however green the score.

That’s the whole point of a system instead of a number. The recovery side and the training side have to agree before it tells me to go heavy. Apple Health says how recovered I am; the training log says what I’ve done to my body and what’s still mending. Green score but sore legs? Upper body today, legs tomorrow.

A colour for every morning

What comes back is a colour and a verdict, and from the inside they feel nothing alike.

Readiness 27, red — a rest day

Readiness 27, red. Everything’s slightly off — variability in the basement, resting pulse up overnight. The old me would have called the gym discipline and paid interest on it for three days. Now I close the app and make breakfast. A rest day is also training.

Readiness 56, yellow — an easy day

Readiness 56, yellow. Most mornings. Move, but stay honest: an easy session, some technique, sets left a couple of reps short of failure. Yellow days, stacked up, are quietly where the fitness comes from.

Readiness 86, green — train hard

Readiness 86, green. The morning you build the whole thing for. Train hard, before noon. The difference between a green day and a red one used to be invisible to me; now I see it before I’ve brushed my teeth.

When I can talk back, and when it shuts up

The database predicts soreness, but it can’t predict life. Tweak a knee carrying a couch up three flights and neither the watch nor the log has any way to know. So I tell it: “left knee’s off, skipping legs.” That goes in as a constraint, and the next morning the score can be a glorious green while it routes around the knee anyway — upper body only. Two layers keep me out of trouble: the soreness it infers, and the limits I tell it.

Readiness 79, green, but the left knee is flagged

Readiness 79, green — but the knee is flagged.

And my favourite part: it knows when to say nothing. Check too early, before Apple has finished the overnight numbers, and a lesser tool would paper over the gap with a confident guess. Mine counts how many signals are actually usable, and if there are too few it returns one word: insufficient. A fake 50 that looks like a verdict is worse than an honest blank — you can plan around a blank.

No verdict yet — insufficient data

No verdict yet — and that’s the right answer.

The number is the truth; the words are bedside manner

Everything above — the z-scores, the weighting, the load ratio, the soreness curve — is plain, deterministic arithmetic. Same inputs, same output, every time; I can re-run it by hand and see exactly why today is a 56 and not a 70. The language model shows up only at the end, to turn a cold number into a sentence I’ll read at six in the morning. Swap the model out tomorrow and the score wouldn’t move by a point — it never had a vote.

What six years taught me

It fires on its own around 6am, and the verdict is waiting before I’ve decided whether to be a person yet. None of this is medical advice; it diagnoses nothing. It’s a readiness heuristic built on my own data — normal for me, not for some imaginary average human.

I always assumed training better meant more: more data, more tracking, a fancier watch. But I’d been swimming in six years of data the whole time. What I lacked was never information. It was the discipline to read the same few numbers every morning and actually do what they said.

The watch had been telling me all along. I finally built something that listens.

Stack: Apple Health · Python · SQLite · Claude

Need something like this for your own business? See how I can help →