-
Notifications
You must be signed in to change notification settings - Fork 645
Features
NOOP is a local-first companion app for WHOOP straps (4.0 and 5.0/MG) that runs fully offline on macOS and Android. Everything — pairing, metrics, automations, notifications — happens on your device. This page walks through every screen and capability.
Important: NOOP is not affiliated with WHOOP, not a medical device, and every metric (HR, HRV, recovery, strain, sleep, SpO₂) is an approximation for personal use only. See Privacy and Security for data ownership details.
When you launch NOOP for the first time, a calm, paged onboarding wizard walks you through:
- Welcome — "all your data, none of the cloud"
- What NOOP does — three value slides on the recovery ring, live heart rate, and offline ownership
- Bluetooth priming — explains that your connection is local BLE with no server in the middle
- Wear & wake — instructions to put the strap on snugly with the sensor on skin, charge it, and stay within ~1 meter
- Scan — initiates BLE pairing; a reassurance card explains why the strap won't appear in System Settings (it uses a custom profile)
- Bonded celebration — the recovery ring blooms in when pairing succeeds, with battery %
- Profile — your age, sex, weight, height (feeds HR zones, calorie estimates, and baselines), plus estimated max HR
- Import (optional) — points to Data Sources for bringing in your history; fully skippable
- Done — "Your thread starts here"
You can revisit pairing and profile anytime from Settings.
The strap reports one of three states throughout the app:
- Disconnected — no strap found (red dot)
- Connecting — found and pairing; finishing the secure handshake (amber)
- Bonded — paired and streaming; haptics and live HR available (green)
Features that need haptics or live realtime data require a bonded connection; the UI disables those buttons until you bond.
NOOP uses a two-column layout: a sidebar of screens on the left and a detail pane on the right. A live connection-status pill anchors the sidebar's bottom. Below is every screen, grouped by whether it needs a connected strap.
| Needs bonded strap (live BLE) | Works from imported data alone |
|---|---|
| Live, Breathe, Intervals, Health (live HR), Automations, Notifications (to buzz) | Control Center, Explore, Compare, Insights, Sleep, Trends, Workouts, Stress, Apple Health, Data Sources |
The home dashboard: a tight, gapless grid with:
- Health alert banner — illness early-warning card appears here when triggered (see #Illness early-warning below)
- Today's Synthesis — your signature Recovery Ring (with HRV and resting HR inside) beside a plain-English read-out ("Recovery is strong and sleep was consistent") and a recovery state word (Depleted / Low / Steady / Primed / Peak)
- Key Metrics — tiles for Recovery, Day Strain (of 21), Sleep (hours + efficiency), HRV, Resting HR, Blood Oxygen, Respiratory, Steps, Weight, and Calories. Each shows a 14-day sparkline. WHOOP metrics come from imported data or live strap; Steps, Weight, Calories, and Respiratory pull from Apple Health. Sparse series auto-widen to all history so they never show empty
- Last Workouts — up to six recent sessions as cards (duration, date, avg HR, kcal)
- Data Sources — footer showing whether WHOOP and Apple Health are present, with counts
The hardware-test surface and pairing screen:
- Smoothed heart rate (BPM) — NOOP shows a spike-filtered median over ~10 seconds, not raw per-beat, so it's stable. Recent R-R intervals (milliseconds) listed beneath
- Status grid — battery %, last decoded frame type, last decoded event
-
Controls:
- Scan & Connect / Re-scan — start or restart BLE scanning
- Buzz strap — fire a test haptic pulse (bonded only)
- Disconnect — drop the connection
- BLE log — a scrolling feed of frames, events and actions for confirming the strap is streaming
Opening Live starts the realtime HR stream and requests a fresh battery reading; leaving it stops the realtime stream (the background HR recording continues).
Live vitals dashboard:
- Live heart rate hero — a streaming HR sparkline tinted by #HR zones, with zone pill, "% Max", your Max HR, and a streaming/idle state. If the strap reports HR as 0, NOOP derives it from the latest R-R interval and notes "from R-R"
- Vital Signs — a tile grid from your most recent imported day: Respiratory Rate, Blood O₂, Resting HR, HRV, and Skin Temp, each colored green (in range) or amber (out of range)
HRV haptic breathing biofeedback trainer — NOOP's flagship novel feature. Because the strap both measures HRV (from R-R intervals) and buzzes, NOOP can pace your breath with felt cues and watch your HRV respond live.
- Pick a pace: Relax 4-6 (4 s inhale / 6 s exhale), Coherence 5.5 (equal ~5.5 breaths/min), or Box 4-4
- Start a session — a soft orb expands on inhale and contracts on exhale, with live BPM in its centre. With a bonded strap you feel one pulse on the inhale, two on the exhale, eyes closed. Without a strap it's visual-only
- Live readouts: heart rate, rolling HRV (RMSSD) over the last ~30 beats, current pace
- Coherence estimate — a normalized bar (RMSSD mapped 0–120 ms) with a band word (Building / Settling / Coherent / Deep calm). This is an estimate, not clinical — trends across a session matter more than single numbers
A "Test buzz" button fires a single pulse (bonded only).
Silent haptic HIIT interval timer — train hands-free; the strap buzzes every transition so you never look at the screen.
- Configure Work seconds (5–600), Rest seconds (5–600), Rounds (1–30)
- Large stage face — WORK / REST / DONE, current round, countdown ring, and total-session progress bar
-
Haptic cues (bonded strap):
- Triple-buzz into each WORK block
- Single buzz into REST
- 3-2-1 tick on the last seconds of each phase
- Long 5-loop buzz on finish
- Controls — Start / Pause / Restart and Reset
With no bonded strap it still works as a visual timer, prompting you to bond on Live.
A catalog of every signal. The root is a grouped list by metric category; tap any metric to open its detail dossier:
- W / M / 3M / 6M / 1Y / ALL range control
- Hero trend chart with latest value and "as of date"
- Stat row: Average, Min, Max, Latest, and Δ vs previous equal-length window (tinted by whether the change is "good" for that metric)
- What correlates — Pearson scan over the visible window (|r| ≥ 0.30, n ≥ 10); top 6 with r-bars
Sparse metrics (weight, body fat) auto-widen the window when the range holds no data, so you always see real values.
Overlay 2–4 metrics and read how they move together:
- Pick metrics from a grouped menu; selected metrics show as removable chips
- W / M / 3M / 6M / 1Y / ALL range control
- Normalized overlay chart — each line min–max scaled to 0–1 within the window so different units share an axis. Hover shows a crosshair and tooltip with every series' real value on the nearest day; legend lists each series' true min–max range
- How They Move Together — every selected pair gets a live Pearson r with a plain-English conclusion ("When weight rises, recovery tends to fall — a moderate negative link")
Sparse series auto-widen so they still overlay against dense ones.
"Interrogate what affects what" in two halves:
-
Behaviour Effects — splits your logged WHOOP journal answers (Alcohol, Caffeine, Late meal, Meditation, etc.) into days each behaviour was vs was not logged, then compares a chosen outcome (Recovery / HRV / Sleep / RHR) between groups. Each card shows a plain-English sentence, with/without means and group counts, a SIGNIFICANT / EXPLORATORY pill, and effect size (Cohen's d) with a magnitude word. Tint is sign-aware: green if the behaviour moves the outcome the "good" way, red if "bad"
-
Metric Relationships — a curated set of Pearson correlations: Sleep performance ↔ Recovery, HRV ↔ Recovery, Resting HR ↔ Recovery, and Recovery → next-day recovery (1-day lag). Each is a one-line insight with r, significance pill, r-bar, and strength/direction reading
Last night, read in two seconds:
- Stage breakdown hero — a hypnogram (reconstructed from stage durations) or, if intervals can't be reconstructed, a proportional stacked bar. Footer shows REM / Deep / Light / Awake each as "Xh Ym · NN%", time-in-bed, efficiency, and onset–wake times
- Night detail — tiles with sparklines and "vs typical" captions: Sleep Performance, Efficiency, Consistency, Hours vs Needed, Restorative (deep + REM share), Respiratory, and Sleep Debt (vs your personal sleep need, floored at 7.5 h)
- Stages vs typical — Deep / REM / Light as horizontal bars, last-night minutes with a marker at your personal mean
- Asleep duration — trailing-30-night hours trend with avg / min / max
If no sleep sessions are imported, NOOP points you to Data Sources.
A single-number Stress Monitor (0–3) with a LOW / MEDIUM / HIGH band and one plain-English line on why:
- Today's value is your recorded daily stress score if one exists; otherwise NOOP derives it by comparing your resting HR and HRV to your personal 30-day baseline (higher RHR and lower HRV both push stress up), combining z-scores and squashing onto 0–3 with a logistic curve
- Semicircular gauge with its own blue → mint → amber ramp, band, and explanation tuned to your RHR/HRV shifts
- Today's markers — the stress value (with sparkline), Resting HR and HRV vs baseline (tinted toward stress or recovery), and "Calm time" (share of recent days in the LOW band)
- Multi-range trend chart
- "How this is computed" card with exact method and band legend
The longitudinal view ("the thread of you over time"):
- W / M / 3M / 6M / 1Y / ALL range control (default 3M)
- Hero Recovery chart with avg / peak / low / day-count
- Daily signals — small multiples for HRV, Resting HR, and Day Strain, each with mean / min / max
- Recovery year heat-strip — a calendar of recovery scores across the past year (or all history on ALL), with a depleted→peaked legend
Windows are taken relative to your latest recorded day and auto-widen on sparse data.
The activity log:
- 7D / 30D / 90D / 1Y / All range control (auto-picks tightest range with ≥2 sessions)
- Summary tiles — Total Workouts, Total Time, Total Calories, Total Distance, Most Active sport
- Activity Breakdown — per-sport cards (sessions, time, kcal, avg per session) with sport-specific icons
- All Sessions — table with date/time, sport, duration, avg HR, kcal, distance, and source badge (WHOOP or Apple Health) per row
The import hub. Everything stays on your device.
Import your full WHOOP history — recovery, strain, sleep, workouts — from a data export (.zip or unzipped folder). Works for WHOOP 4.0, 5.0 and MG. Get one from app.whoop.com → Data Management. NOOP reports records imported and date span, and shows days and sleeps stored.
Import an Apple Health export (export.zip) from Health app → profile → Export All Health Data. NOOP streams and aggregates it locally — years of HR, HRV, sleep, SpO₂, steps, body composition and more. Large exports take a minute or two.
Shows whether the strap is bonded and streaming. Pairs directly over Bluetooth — no WHOOP app, no cloud. Open Live to pair if it isn't connected.
All imports run on-device; nothing is uploaded. WHOOP data is stored under the my-whoop source and Apple Health under apple-health, so per-source pages and cross-source consensus stay distinct.
Browse and reconcile data imported from your Apple Health export:
- W / M / 3M / 6M / 1Y / ALL range control
- Tiles: Steps, Resting HR, HRV, VO₂ Max, Weight, Body Fat, Lean Mass, Asleep avg, Workouts
- Chart sections — Heart & Vitals (resting HR, HRV, blood oxygen, respiratory rate), Activity & Energy (steps, active energy), Body Composition (weight, body fat, lean mass, BMI), and Sleep (asleep). Each has avg / min / max / point-count footer
Sparse weekly series (weight, body fat) auto-widen to all history so short windows never show empty; a single reading is shown as "Latest reading" rather than an empty chart.
Turn the strap's physical inputs and live biometrics into Mac actions and haptic coaching, all on-device.
Double-tap the strap to trigger an action on your Mac. Options:
| Action | What it does |
|---|---|
| Nothing | No action |
| Lock the Mac | Locks the screen immediately (falls back to "Lock Screen" Shortcut if needed) |
| Buzz back (confirm) | Fires a confirming wrist buzz |
| Mark a moment | Records a timestamped "moment" (with a confirming buzz) |
| Run a Shortcut… | Runs any macOS Shortcut by name |
A Test action button runs it without the strap. Recent moments are listed and can be cleared.
React when the strap comes off or goes on:
- Lock the Mac when I take the strap off — fires the moment the strap leaves your wrist
- Run a Shortcut when taken off — presence automation (set a Focus, pause media, set away, etc.)
- Run a Shortcut when put back on — reverse it when you return
Note: macOS reserves true auto-unlock for Apple Watch, so NOOP can lock, not unlock.
- HR-zone coaching — buzz when you hit your top zone (ease off) and again when you recover, using your max HR from Settings
- Resting stress nudge (experimental) — a gentle buzz when your HRV drops while your heart rate is calm — a cue to take a paced breath. Conservative, rate-limited to once every 15 minutes, off by default
Wake to a wrist buzz. This arms the strap's own firmware alarm, so it still fires even if the Mac is asleep or NOOP is closed. Set your wake time — the strap buzzes at exactly that time. NOOP does not currently do light-sleep early wake.
Mac side-effects are sandbox-friendly: screen lock uses macOS's own entry point, and Shortcuts run via the shortcuts:// URL scheme — anything you can build in Shortcuts is reachable.
Choose which Mac apps tap your wrist, and how. Everything runs on your Mac.
- Wrist alerts master switch (opt-in, off by default). Test buzz fires immediately (bonded only). Strap status mirrors connection state
- Per-app control — NOOP discovers installed, notification-capable apps and groups them: Email (Outlook, Mail), Messaging (WhatsApp, Messenger, Messages, Discord, Slack, Telegram, Signal), Meetings & Calls (Teams, Zoom, FaceTime), and Calendar & Reminders. Each app shows its icon, on/off switch, and buzz pattern picker — Single / Double / Triple / Long — with a per-app test button
-
Behaviour:
- "Only buzz when worn"
- Quiet hours — mute wrist alerts overnight (default 22:00–07:00), with from/to time picker
Note: Wrist delivery of macOS notifications is not live yet — it needs a small on-device watcher (coming in an update). Your per-app choices and patterns are saved and apply automatically once delivery ships. Everything stays on your Mac.
NOOP watches for the classic early-illness signature on-device. It compares your last ~2 days against a ~28-day baseline (ending 3 days ago) for resting HR, HRV, skin-temperature deviation, and respiration. When two or more anomalies appear — e.g. resting HR up ≥5 bpm, HRV down ≥20%, skin temp up ≥0.6 °C, respiration up — a banner appears on Control Center:
"Your body looks strained — … Consider taking it easy."
On a banner transition from clear to raised, NOOP also posts a system notification (at most once per local day) so the warning reaches you when the window is closed. The toggle lives in Automations → Illness early-warning. Defaults differ by platform on purpose: macOS is opt-in (off by default — enabling it triggers the notification-permission prompt), while Android is opt-out (on by default). Needs at least 14 days of history. On-device and approximate — informational only, not a diagnosis.
Always available:
- Profile — age, sex, weight, height, and max heart rate (auto-estimated via Tanaka, or a manual override). These power zones, calorie estimates, and recovery baselines
- Strap — connection status, battery, and Re-scan / Disconnect controls
- About — version, the "all your data, none of the cloud" note, a medical disclaimer, and attribution to community reverse-engineering work
Always available. NOOP is free and always will be.
- Built on — credit to community reverse-engineering projects
- Donate (optional) — never a paywall; the whole app works without it. Copy-to-clipboard crypto addresses (Bitcoin, Cardano, Ethereum, XRP) for anyone who wants to chip in toward future work (Windows, the iOS port, new features). The app never asks again
- Reminder — not affiliated with WHOOP; interoperability software for your own device and data; not a medical device
NOOP lives in the macOS menu bar. The label is a zone-tinted heart dot plus live HR (or "—" when not streaming). Click it to open a compact popover:
- Recovery ring
- Live heart rate
- Battery / resting HR / HRV
- Quick actions: start/stop live feed, refresh battery, scan/reconnect, or disconnect
On Android, a home-screen widget shows your recovery ring and key metrics at a glance without opening the app.
- Live strap: requires a bonded WHOOP 4.0 or 5.0/MG strap
-
WHOOP history: import a
.zipfrom app.whoop.com → Data Management once, then it's yours forever -
Apple Health: import an
export.zipfrom Health app → profile → Export All Health Data - Baseline: recovery sharpens after ~5 nights; for full history, import your WHOOP CSV
The strap always tells you what's happening:
| State | Meaning | Can you… |
|---|---|---|
| Disconnected | No strap found | See imported data; open Live to scan |
| Connecting | Found, pairing | Live HR coming soon |
| Bonded | Paired & streaming | Use all features: haptics, live HR, alarms, automations |
- Light-sleep early wake — NOOP's alarm is firmware-only at exact wake time
- Wrist notification delivery — choices are saved; once on-device delivery ships, buzzes come through automatically
- WHOOP 5.0 deeper metrics — live HR works; recovery/strain/sleep reverse-engineering is ongoing. See Strap Support and Pairing for the current state
- Offline by design. NOOP talks to your strap directly over Bluetooth — no server in the middle. No account, no sync, no cloud.
- On-device storage. All history (imported and live-captured) is stored locally in SQLite.
- Your data is yours. Imports happen once and stay on your device; nothing is uploaded.
For more, see Privacy and Security.
- Installation — download and first launch
- How NOOP Works — architecture and the science behind the metrics
- Protocol — the Bluetooth protocol and reverse-engineering details
- Strap Support and Pairing — WHOOP 4.0 vs 5.0/MG, bonding steps, troubleshooting
- Privacy and Security — data flows, what gets sent where, encryption
- Contributing — how to report bugs, request features, or submit code
NOOP is an independent, unofficial, non-commercial interoperability project — not affiliated with, endorsed by, or sponsored by WHOOP, Inc. "WHOOP" is a trademark of WHOOP, Inc., used nominatively. Works only with a device you own; not a medical device; every metric is an approximation, not medical advice. · Privacy and Security · Donations · Releases
Get started
Tutorials
- Tracking a Workout
- Recovery, Strain & Readiness
- Automations
- Breathe & Intervals
- Importing History
- AI Coach
- Widget & Notifications
- Reading Your Sleep
- Explore & Compare
Reference
Project