NOOP 8.4.0
NOOP v8.4.0
A broad tune-up: platform fixes (Intel Macs, iOS sideloading), a picker-free backup option, meaningfully faster sleep/recovery analysis, and better honesty around strap-clock and alarm problems. Update from the Releases page, AltStore, or brew upgrade.
Added
- Backup & Sync: "Use NOOP's own folder" (iOS, #52). Some iOS 26 builds won't let the system folder picker select a folder at all. NOOP now offers a picker-free option that backs up inside its own folder — browsable in the Files app under On My iPhone → NOOP → Backups, or dragged into iCloud Drive to read on a Mac. The picker path is also instrumented so a debug export shows exactly where it fails.
- Oura ring live heart rate in the Live console (#56, #59). A connected Oura ring's live stream is recognised as a trusted source and shown in the console — on both iOS/macOS and Android.
Fixed
- Intel Macs: native again (#51, #58). The macOS app is now built as a universal binary (x86_64 + arm64), fixing an arm64-only regression that left Intel Macs running under translation (or not at all).
- iOS sideloading: "integrity could not be verified" (#53). The prebuilt IPA is now a Release build, which re-signs and installs cleanly via AltStore / Sideloadly — the debug artefacts in the old build were what modern iOS rejected.
- Oversized Settings screen (#43). The Sex selector could force the whole Settings column past the screen edge — most visibly in German or at larger text sizes. It's now a compact menu that fits any label length.
- Restore no longer risks your newest history (#57). After restoring a backup, a sync could run into the just-closed database and discard freshly-offloaded records, and an empty offload could advance past history that never got stored. NOOP now blocks that path and prompts a clean restart. Both platforms.
- Smart-alarm phone backup follows the alarm (#34). The backup notification was gated behind the unrelated wrist-alerts switch, so people who set a smart alarm without enabling wrist alerts got no backup at all. It's now tied to the alarm itself.
Performance
- Faster sleep & recovery analysis (#68). The nightly re-score read each session's motion/sleep-state one database row at a time; those are now single batched queries (N+1 → one), cutting the round-trips on the score-of-record path. Output is identical and equivalence-tested.
- Live decode does the work once (#47). Each live WHOOP 4.0 frame is now parsed a single time instead of two or three, and the offload gesture path skips the full decode of frames it doesn't need.
- Lighter app art (#46, #48). Scene backdrops re-encoded to HEIC/WebP for a smaller download and quicker screen loads.
Diagnostics & honesty
- Strap log shows where offloaded sleep actually landed (#67). A strap whose clock has reset banks last night with a wrong date, so the night lands off the recent timeline and reads as "missed sleep." The log now records where the rows landed and whether the stale-clock correction could engage — turning a silent misdating into a one-glance diagnosis.
- On-device warning when a strap refuses the alarm (#34). When a strap keeps reporting back a different alarm time than NOOP sends (a reset/corrupted alarm register), the Alarms screen now says so and points to a strap reset — instead of the alarm silently never firing.
Notes
- The strap firmware alarm and the iOS phone backup are still best-effort: a sideloaded build can't sound a guaranteed loud wake, so keep your phone's built-in Clock alarm as your real backup.
- Dead links to the retired upstream repository were cleaned up across the docs (#60, #61).
What's Changed
- Android: recognize the Oura ring's live stream as trusted in the Live console (#56 parity) in #59
- Fix/oura live console trusted stream in #56
- CI: build the macOS app as a universal binary (x86_64 + arm64) (#51) in #58
- docs: repoint dead NoopApp/noop links to ryanbr/noop (curated from #54) in #60
- docs: fix two remaining dead NoopApp/noop links (#60 follow-up) in #61
- Restore: don't sync into a closed DB, and never ack past un-stored history (#57) in #62
- perf: decode each live WHOOP4 frame once, not 2–3× (#47) in #63
- perf: skip full decode of non-EVENT frames on the offload gesture path (#47 follow-up) in #64
- resources: re-encode day-cycle scene backdrops as HEIC (−2.8 MB, ~85%) in #46
- resources: re-encode Android day-cycle scenes as WebP (−1.4 MB, ~86%) in #48
- iOS: build the sideload IPA in Release, not Debug (#53) in #65
- Strap log: surface WHERE offloaded rows landed + WHY (stale-RTC "missed sleep", #67) in #69
- Strap log: soften stale-RTC diag wording ("no clock correlation at decode") — #67 follow-up in #71
- iOS Backup & Sync: "use NOOP's own folder" fallback + folder-picker instrumentation (#52) in #66
- perf: batch the per-session motion/sleep-state reads (N+1 → one query) in #68
- Settings: Sex picker → .menu, fixes oversized Settings screen (#43) in #72
- Smart alarm: instrument + warn when the strap keeps refusing the alarm (#34) in #75
- Smart alarm: phone backup follows the alarm, not the wrist-alerts master (#34) in #73
Downloads — NOOP Staging identity, installs beside the official app (separate data):
- Android —
NOOP-android-v8.4.0.apk(com.noop.whoop.staging) - macOS —
NOOP-macos-v8.4.0.zip(unzip, then right-click → Open) - iOS —
NOOP-ios-unsigned-v8.4.0.ipa(AltStore / Sideloadly)