All posts

Tired, or getting sick? IntervalCoach now catches it before you feel it

MR
Martijn Russchen
·4 min read

There is a particular morning every endurance athlete knows. You wake up, glance at your watch, and your HRV is on the floor. Resting heart rate up. Recovery score red. And the question that decides your whole day: is this just yesterday's ride finally landing, or am I coming down with something?

It matters enormously which one it is. If it is training fatigue, that low HRV is the cost of a good session and the adaptation you wanted; you back off a little and carry on. If it is an infection taking hold, training into it is how a two-day cold becomes a two-week hole. Same number on the screen, opposite correct response.

Most tools, including earlier versions of IntervalCoach, could not tell you which. Here is why, and what we did about it.

HRV cannot answer the question

The honest problem is that a hard workout and an early infection produce the same autonomic picture. Both suppress overnight HRV. Both nudge resting heart rate up. That overlap is not a bug in the sensor; it is real physiology. Your body responds to a brutal threshold session and to a virus through the same stress pathways.

Which means any system that flags illness from HRV alone is really just flagging "you trained hard," and it will cry wolf on exactly the sessions you should be proud of. We did not want to ship that.

The signals training cannot fake

The way out is to stop looking only at the signals that training and illness share, and start looking at the ones they do not.

A hard ride does not change how fast you breathe while you sleep. It does not drop your blood oxygen overnight. It does not raise your skin temperature for days. An infection does all three. Breathing rate, SpO2 and skin temperature are largely orthogonal to training load: your watch records them every night, and they sit flat no matter how big the weekend was, right up until your immune system starts working.

So the rule is simple to state. When two or more of those signals drift off your personal baseline together, in the illness direction, that is the pattern of something brewing, not the pattern of a hard Tuesday. HRV and resting heart rate stay in the picture as corroboration, but they are never allowed to make the call on their own.

Two of my own mornings

I will use my own data, because it happens to contain both cases inside two weeks.

Morning HRV Resting HR Breathing rate Blood oxygen Skin temp What it was
Late May down ~25% up ~20% normal normal normal hard training
Mid June down ~27% up ~12% up dropped sharply up getting sick

Look at the first two columns. On HRV and resting heart rate, those mornings are twins. A naive detector flags both, or neither. But they were not the same morning at all.

The late-May case followed two of the biggest training days of my month. Strain was through the roof, HRV crashed, heart rate jumped, and every signal that an infection would have touched stayed perfectly quiet. My breathing rate was actually a touch below normal. That was fatigue, full stop, and the right move was to let it ride.

The mid-June morning came on an easy day, no big session behind it, and this time the quiet signals were not quiet. Blood oxygen had fallen about two standard deviations below my baseline. Breathing rate was up. Skin temperature was up. The autonomic crash had company, and the company is what gave it away. It was a minor immune blip, and it cleared by the next morning, but it was real, and it was not training.

A detector built on HRV would have called both mornings the same. A detector built on the orthogonal signals separates them cleanly. That is the whole idea.

What IntervalCoach does with it now

When that multi-signal pattern shows up on a given morning, IntervalCoach eases the day toward recovery instead of sending you into the intervals your plan had queued. Your dashboard and your daily briefing say so plainly, and they name the signals that triggered it, so it is a recommendation you can understand and overrule, not a black box telling you to stop.

It also quietly protects the rest of the system. IntervalCoach learns how long each kind of session takes you to recover from by watching how your body responds afterwards. An illness in the middle of that window would poison the lesson, teaching the model that an easy ride wrecked you for four days. So those days are now left out of that learning entirely. Your recovery profile stays a record of training, not of the week you had a cold.

The honest limit

This only works if your wearable records breathing rate, blood oxygen and skin temperature overnight, which a Whoop, an Apple Watch, an Oura ring and similar devices do. If all IntervalCoach has from you is HRV and resting heart rate, it deliberately stays silent on illness. With only those two, sick and tired are genuinely indistinguishable, and a confident wrong answer that pulls you off a session you were fine for is worse than no answer at all. Precision matters more here than catching every sniffle.

It is a small feature with a simple promise: read the part of the data that actually answers the question, and keep quiet when the data cannot. The more of your context IntervalCoach can see, the less you have to guess on the mornings that matter.