Skip to content

NOOP 8.4.0

Choose a tag to compare

@github-actions github-actions released this 08 Jul 06:49

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):

  • AndroidNOOP-android-v8.4.0.apk (com.noop.whoop.staging)
  • macOSNOOP-macos-v8.4.0.zip (unzip, then right-click → Open)
  • iOSNOOP-ios-unsigned-v8.4.0.ipa (AltStore / Sideloadly)