device link · architecture
The WHOOP 4.0 strap has no display and no internet. It quietly records your body about once a second into a two-week memory — even with no phone nearby. Everything below is how our app reaches across Bluetooth, pulls that history off, and turns it into the charts on the dashboard. No phone, no problem; the strap just keeps a buffer until we catch up.
The phone and the strap talk over Bluetooth Low Energy. The phone is the “central” that opens the connection; the strap is the “peripheral.” Once paired, the link stays bonded so it can silently reconnect in the background. Information travels on a handful of dedicated channels — each one carries a different kind of traffic, in a fixed direction.
Every time the phone reaches the strap, it runs the same short opening sequence — exactly once per connection — to wake the link, agree on the time, and line up the history transfer. It mirrors what WHOOP’s own app does. Running it more than once (an early bug) jams the strap, so it’s strictly one pass, then the data flows.
Two kinds of information come off the strap. Live readings are streamed in the moment (only when you ask for them). The stored history — the real prize — is a two-week, roughly one-per-second log of your biometrics that the strap keeps whether or not a phone is around. Plus housekeeping: events, battery, and firmware info.
The strap records ~1 sample/second into a rolling two-week memory, on-wrist, offline. On every sync we offload this log. It’s the backbone of everything on the dashboard. Each record carries:
Real-time beats-per-minute plus beat-to-beat timing, streamed as it happens.
The strap announces moments: boot, clock set, wrist on/off, and other state changes.
Charge level, charging state, and the strap’s hardware / firmware version.
Sleep, recovery, strain and daily summaries are computed from the stored signals after they land.
The history transfer is a strict, in-order drain. We ask once; the strap streams its log oldest-first in chunks. The crucial detail: the strap only lets go of a chunk once we acknowledge it, and that acknowledgement moves a one-way read cursor forward — records behind it are considered delivered and can’t be served again. So the golden rule is save first, acknowledge second.
The cursor is one-way: once a chunk is acked, the strap drops it for good. We never ack a chunk we haven’t durably stored.
We don’t sync constantly — that would drain both batteries. Instead a sync is triggered by a few events, each rate-limited by a cooldown so bursts don’t pile up. The strap keeps logging the whole time, so whenever the next sync fires, the two-week buffer has us covered.
Each time the phone (re)reaches the strap, it offloads whatever piled up.
first connect always runsWhile connected, a background timer kicks a routine catch-up.
~15 min floorOpening the app nudges a fresh sync so you see current data.
~90 s cooldownThe strap can prompt its own sync by pushing an event.
~90 s cooldownA tap forces an immediate offload, no cooldown.
on demandReal-time streaming runs only while you explicitly keep it on.
opt-in onlyFollowing a single reading from your wrist to this dashboard: