Skip to content

NOOP 11.8.0

Choose a tag to compare

@github-actions github-actions released this 17 Sep 12:39

NOOP v11.8.0

A release about doing more on the strap itself, and about turning off the parts you do not want.

A gym log book, advanced from your wrist

NOOP now carries an on-device lift log. Build a session, and move between sets with a double-tap on the
strap rather than picking the phone up mid-set. It is stored in a new schema with a matching Room twin
on Android, and the set metrics are computed by the same engine on both platforms rather than by two
that can drift apart.

A Coach that switches off

The AI Coach now has a single master switch. Turning it off retires the tab, the generated brief, the
home-screen widget and the tray notification, and it stops every request that would otherwise leave the
device. This is the whole feature going quiet, not just the screen being hidden.

Its settings moved onto their own screen rather than sitting in a crowded list. Android gained the
bottom-bar tab that iPhone already had, Disconnect is now somewhere an iPhone can reach, the current
OpenAI models are offered with the catalogue kept up to date, and a rate-limited request shows what the
provider actually said instead of a generic failure.

Sync the strap from a shortcut

A Sync Strap App Intent runs a sync from Shortcuts, the Lock Screen or a Home Screen button. A Live
Activity shows the offload while it runs, and an optional setting keeps the screen awake for as long as
it takes.

Reconnecting when the app is off-screen changed underneath that. iOS throttles background scanning hard
enough that a strap could sit undiscovered for minutes and then appear seconds after the app came to the
foreground. NOOP now asks for the last strap by name in the background, which iOS does honour, and keeps
scanning in the foreground so a strap you have switched to is still found.

Workouts that are easier to keep tidy

Sessions shorter than a minute are discarded rather than cluttering the list, and the list itself splits
into Current and Archived so a long history stays navigable. Deleting a workout now clears it from every
namespace the list reads, including the copy Apple Health had kept after the store let go of it.

The WHOOP sports that were missing are selectable, and the icons those exposed are fixed.
Auto-detection no longer saves anything on its own: it asks, and waits.

Readings that admit when they failed

A failed WHOOP 5 flag read was being reported as though it were a value. It now says it failed, on both
platforms. The frame integrity verdict reaches every consumer intact rather than being narrowed on the
way through, and the strap family NOOP records is the one the connection actually established rather
than the one it initially picked.

On Oura, a notification that tiles exactly into several packets is now read to the end instead of
stopping at the first. A young ring no longer adopts an anchor unit ten times too large, settled by
adjacency rather than assumption, and a diagnostic reports which ring epoch each sidecar row believes
in.

Charts that stop redrawing everything

Workouts and Sleep were re-evaluating their entire screens on every live heart-rate tick, roughly once a
second whenever a strap was connected. They no longer do. Three charts that had no hover gained a
tooltip, two uncapped series are downsampled before drawing, the sleep motion trace computes its peak
once rather than per epoch, and the Apple stress level rounds the way Android's already did.

The steps charts are clearer, with an optional 30-day average card.

Apple Health that keeps up

A re-score that was deferred now publishes to Apple Health once it lands, rather than being missed
because the publish already ran. Workouts are observed for live delivery, and a pass running in the
background paces itself under the CPU limit iOS enforces instead of being killed by it. A CSV import no
longer turns a correct SDNN into RMSSD on the way back out.

Localization

Chinese is complete in both scripts, across the app and the watch complications. The French recovery and
strain words are repaired, and the theme picker says light rather than lightweight.

A gap that had been letting UI copy ship English in every locale is closed. The scan that checks whether
a string has a catalogue entry was not looking at the spelling the codebase tells you to prefer, so
nothing reported strings that had none. Closing it surfaced the Home screen's own labels and the terms
you agree to on first launch, both of which are now translated.


What's Changed

  • Add the v46 schema for an in-app strength log, with its Room twin by @UtkuDenizAltiok in #2098
  • coach(ios): put Disconnect where iPhone can reach it in #2207
  • doc(issues): let the bug form name an Oura ring, not only a WHOOP strap by @pipiche38 in #2209
  • health(ios): delete the workouts Apple Health kept and the store did not in #2213
  • battery: say whose charge it is on all seven surfaces, not three in #2216
  • nav(android): give Coach the bottom-bar tab it has on iOS in #2222
  • Repair parity governance maintenance flow by @bhelm in #2212
  • doc(issues): point an Oura reporter at the ring's known limits, as the 5.0/MG line does for straps by @pipiche38 in #2215
  • fix(workouts): make auto-detection confirmation-only by @tigercraft4 in #2220
  • fix: do not report a failed WHOOP 5 flag read as a value by @Trillient in #2193
  • whoop5: guard the failed flag read on every platform, and on Android too in #2223
  • docs: expand protocol coverage and clarify WHOOP 4/5 compatibility by @bhelm in #2183
  • test(sleep): pin the night-caption label and date pairing (#2199) in #2224
  • Lift Log: an on-device gym log book, advanced by a double-tap on the strap by @UtkuDenizAltiok in #2099
  • i18n(zh): complete the Android locale and carry it to the Apple catalogue in #2226
  • i18n(watch): translate the complications into both Chinese scripts, and build them in #2227
  • i18n(apple): complete zh-Hans in the main catalogue, and take zh-Hant to 79 in #2228
  • Test real Room upgrades against the released schema by @kavemang in #2225
  • tools(parity): make a one-sided property declarable in #2231
  • analytics(android): Kotlin LiftMetrics twin of the Swift engine (#2099) in #2232
  • tools(parity): give the stale-base dead end an exit, then take it in #2233
  • parity_ledger: keep trailing hex digits f/d when stripping literal suffixes by @bhelm in #2221
  • fix(sleep): name a night by the evening it belongs to, not its onset date in #2235
  • i18n(design): complete Chinese, and stop asking anyone to translate previews in #2244
  • i18n(design): repair the French recovery and strain state words in #2247
  • i18n: make the theme picker say light, not lightweight, on both platforms in #2249
  • i18n: drop two dead keys, and gate format specifiers in every locale in #2250
  • Fix Coach rate-limit error details by @kavemang in #2245
  • fix(rescore): let a resumed pass stand down when nothing changed in #2251
  • fix(oura): settle the 0x13 anchor unit by adjacency so a young ring never adopts ticks×10 by @pipiche38 in #2240
  • diag(oura): report which ring epoch each sidecar row believes in in #2253
  • feat(coach): move the coach settings onto their own screen in #2254
  • Propagate the full frame integrity verdict to every consumer by @bhelm in #1985
  • feat(coach): make the live model catalogue reachable, and keep it current in #2256
  • feat(coach): offer the current OpenAI models in #2255
  • fix(oura): read every packet of a notification that tiles exactly into several by @pipiche38 in #2237
  • test(oura): name the framing test hex helper so it cannot alias a production one in #2257
  • doc(readme): say which ring each Oura row was measured on, and update the SpO₂ and ring-only-day rows by @pipiche38 in #2236
  • Align Apple stress-level rounding with Android by @kavemang in #2258
  • tools(parity): stop the scan walking into build output in #2259
  • feat(workouts): offer the WHOOP sports NOOP was missing, and fix the icons they exposed in #2260
  • stress: take the Apple screen's work off the main actor too in #2263
  • Persist the family the strap actually established by @kavemang in #2230
  • fix: stop the half-open range operator erasing a callsite in the parity scan in #2267
  • feat(coach): offer a master switch that turns the AI Coach off in #2269
  • fix(health): stop a CSV import turning a correct SDNN into RMSSD on export in #2271
  • docs: share agent guidance through AGENTS.md by @bhelm in #2140
  • fix(workouts): delete from every namespace the list reads, not just the active strap in #2286
  • feat(workouts): discard sub-minute sessions and split the list into Current and Archived in #2287
  • perf(sleep): compute the motion trace peak once per body evaluation in #2288
  • fix(notif): stop the morning recap arriving at 00:40 in #2290
  • feat(health): observe workouts, so a Watch session does not wait for the next app open in #2291
  • fix(timeline): name the active device on the Deep Timeline source row, not a hardcoded "My WHOOP" by @pipiche38 in #2276
  • fix(ui): stop stat labels running into their neighbour in #2292
  • fix(health): publish to Apple Health once a deferred re-score lands, and stop a suspended pass deferring every one after it by @Iskrata in #2279
  • fix(rescore): pace a backgrounded pass under iOS CPU limits (rebase of #2280) in #2296
  • Ios sync shortcut by @npapatheodorou in #2272
  • perf(charts): stop AppModel's 1 Hz tick re-rendering chart screens, and add the missing chart tooltips by @Iskrata in #2295
  • i18n: check the catalog key behind String(localized:) copy, and localize the terms and Home strings it surfaces in #2299

New Contributors

Full Changelog: v11.7.0...v11.8.0


Downloads — NOOP Staging identity, installs beside the official app (separate data):

  • Android — NOOP-android-v11.8.0.apk (com.noop.whoop.staging)
  • macOS — NOOP-macos-v11.8.0.zip (unzip, then right-click → Open)
  • iOS — NOOP-ios-unsigned-v11.8.0.ipa (AltStore / Sideloadly)