NOOP AI 9.3.0 DX Beta
NOOP AI 9.3.0 DX Beta
Built on RyanBR's NOOP 9.3.0 (35 upstream commits since 9.2.1), this release takes upstream's health
imports and scoring corrections while keeping every fork surface — the Coach, its memory, and the
Heute prototype — intact.
Added
- Water and caffeine import from Apple Health (upstream ryanbr#949). Read-only in both directions that
matter: imported entries keep their own row so they can never overwrite a manual one, and NOOP
never writes either type back. iPhone asks permission once for the two new scopes, including for
users who granted Health access before this version existed. The Coach'slog_caffeinetool writes
through the same shared store, so chat-logged and imported intakes sit side by side. - One Customize Today editor (upstream ryanbr#940). The separate Arrange, Key Metrics and Your Cards
sheets are replaced by a single Shown/Hidden list with drag-to-reorder, Cancel/Save over a draft,
and "Edit" rows that deep-link to the two child pages. The fork's Tiles per row picker moved
onto the Key Metrics page and is now discarded by Cancel like every other setting there.- The Coach banner is an ordinary row in that list. It can be dragged to any position or moved
to Hidden, exactly as before. The floating Coach button and the Heute header entry are unchanged.
- The Coach banner is an ordinary row in that list. It can be dragged to any position or moved
Changed
- Effort scoring (upstream ryanbr#963, ryanbr#983). Heart-rate samples are weighted by their own gap rather
than the window's first one, and a saved workout is scored against your measured resting heart rate
instead of a hardcoded 60. Expect Effort numbers to move in either direction, including on past days. - Version identity is 9.3.0 DX Beta (build 215; Android
versionCode307). The AltStore and
SideStore source moves to this release as it is published, so "Check for updates" and a sideload
install both resolve to 9.3.0 DX Beta. - This release ships a macOS build too. 9.2.1 and 9.2.2 DX Beta were iOS-only; the release now
carriesNOOP-macos-v9.3.0-dx-beta.zip(universal x86_64 + arm64, ad-hoc signed so macOS 26 can
hold its Bluetooth permission) alongside the unsigned iOS.ipa.
Fixed
- Oura days no longer spike to a 90+ resting heart rate (upstream ryanbr#375). A nap or a short
fragment could outrank the real night and claim the whole day's numbers. Re-import your Oura
history to correct days already stored. - Sleep staging cannot jump from awake to deep or REM (upstream ryanbr#348/ryanbr#987).
- The i18n gate is green again. The watch String Catalogs had accumulated Xcode build churn that
invented three untranslatable keys and pushed the non-focus locales past their ratchet allowance,
and two fork release titles were still raw Kotlin literals. Both are fixed; the audit baselines
were ratcheted down (Android 215 → 213, Apple 64 → 16 tracked entries). - The
tools/tree is normalised intoTools/(upstream ryanbr#979/ryanbr#1009). The fork carried both
spellings; on a case-insensitive macOS checkout they look like one directory, so upstream's rename
did not land here and sixlinux-capturefiles stayed on an older revision — the newspo2_candidate_82
tests arrived without the decoder change they cover, andTools Python CIwas red. The 27 stray
paths moved, the six files match upstream again, and the suite runs 212 tests green. - The Whoop source badge is visible again on Classic Today. A fork commit had suppressed the
per-ring provenance badge whenever the resolved source was "Whoop", which for a WHOOP user hid it
entirely under the Charge and Rest rings. Both Today screens now match upstream exactly.
Verification
xcodebuildbuild of both app targets — macOSStrandbuilt universal
(ARCHS="x86_64 arm64" ONLY_ACTIVE_ARCH=NO, the way CI builds it, so an arm64-only thinning cannot
hide an Intel break) and iOSNOOPiOSfor the simulator — both succeeded.swift testfor WhoopProtocol (472), WhoopStore (334), StrandAnalytics (1209) and StrandImport
(221) — all green.StrandTestsunderxcodebuild … test— 1726 tests, 0 failures (1 skipped). The
CoachMemoryDedupTestsfailure noted while this merge was in flight is resolved.Tools/linux-capture— 212 tests green after theTools/normalisation above (the workflow
requires at least 200 to be discovered).Tools/i18n_audit.py --cigreen.- Not verified on hardware.
Strand/BLE/BLEManager.swiftmerged automatically (upstream +201
lines) and no CI or local test covers the CoreBluetooth path. Pair with a real strap and watch one
offload.
Thanks
Built on upstream work by:
- @vishk23 — the Oura main-sleep selection behind the resting-heart-rate fix (ryanbr#375), the
wake → deep/REM staging guard and the de-contaminated benchmark that justified it (ryanbr#987, ryanbr#935,
ryanbr#991), the reversible R22 deep-data unlock (ryanbr#932), and theHrBroadcastersubscription-leak fix
(ryanbr#933). - @bartmuskala — reported the Effort gaps this release closes (ryanbr#983), the Updates-page problems
(ryanbr#984), and that a computed value was labelled "Whoop" where it should read "on-device" (ryanbr#936). - @NoBrainNoHeadache — asked for the Apple Health hydration integration that became the water and
caffeine import (ryanbr#949), and supplied French translation corrections (ryanbr#884). - @tanarchytan — found that Health Connect records were day-keyed with the phone's current zone
instead of the offset each record carries (ryanbr#1002). - @pipiche38 — the raw Oura history-notification capture (ryanbr#937), the localized Android What's New
title (ryanbr#878), and the evidence that Oura respiration reads low because banked IBI is not
beat-accurate (ryanbr#882). - @tigercraft4 — retention for scheduled debug exports (ryanbr#960, ryanbr#642, ryanbr#650) and the warning that a
.noopbakis a readable, unencrypted archive (ryanbr#962, ryanbr#644). - @longhoang2810 — localized the Android device-actions menu and fixed a timezone-dependent sleep
test (ryanbr#946). - @Malik-HBS — the connection and sync report (ryanbr#964).
And everyone who filed the reports behind these fixes.