Releases: tanarchytan/noop
Release list
NOOP 9.0.1-stable · 27 July 2026
The first stable release since 9.0.0-tan: a body-clock age, a real measure of sleep regularity, a
backup that restores from anywhere, and the app finally carrying a name of its own.
The app has a new name
NOOP's app identity is com.noop.tan (it was com.noop.whoop up to 9.0.0-tan).
Every NOOP fork shipped under the same com.noop.whoop identity. Android allows one app per identity,
so installing a second fork either failed outright or, when the signing keys differed, refused to
update. A distinct identity means this fork installs beside any other NOOP build, each keeping its
own data.
Coming from 9.0.0-tan or another fork, this does not upgrade it — you get a second app. To carry
your history over: in the old app open Backup & Sync → Export backup file…, then in this one
Backup & Sync → Restore from a backup… and pick that .noopbak. Once it's restored you can
uninstall the old app. Updates from here on behave normally.
Added
- Rhythm Age — a body-clock age from the strap's own on-wrist motion (a cosinor fit over the
rest-activity rhythm), shown in Health with a three-line chart against your actual age and your
fitness age. Needs about a week of wear before it first computes. - Sleep Regularity Index — regularity now means whether you are asleep at the same clock time from
one day to the next, not how consistent your sleep length is. Time with the strap off is treated
as unknown, never as wakefulness. - End sleep on Home — while a detected night is still running, one tap ends it and re-scores the day.
- Date of birth replaces the age wheel, so age-sensitive scores use your exact fractional age.
- Heart-rate recovery after a hard bout.
- Sleep schedule card bridges fragments of one night into a single session.
- Personal sleep need and consistency feed the Rest score; Recovery Index slope and Activity
Balance feed Recovery. - Steps calibration is a stepper you can actually hit instead of an undraggable slider.
Fixed
- Restoring a backup could quietly quarantine your database — the restore swapped the file while
the corruption handler still held it. Restores are now staged and applied at startup, with progress
shown and a clear message if one fails. - A restored database could crash-loop on open, because it kept the identity of the build it came from.
- Backups import from any fork or version by copying rows on content rather than position.
- Opening More could land you on Health — the More list's Health row pushed onto More's own history,
so the next tap on More replayed it. - "Going to sleep" / "I'm awake" did nothing — they wrote a timestamp nothing read. Replaced by
End sleep on Home. - Body Age uses a sourced mortality-doubling time of 10 years rather than an unsourced 8, so every
Body Age sits further from your actual age. Your zero point is unchanged. - Devices listed placeholder hardware; it now shows only real bands and lets you delete one. The
WHOOP import moved to Data Sources. - Skin temperature shows an absolute reading on Home and Compare, not a deviation.
- Calories fall back to the strap's own estimate when a bout has none.
Cleaned up
- Health: the empty Skin Temperature heading and the Records & sources block are gone; the age cards
are one Ages section. - Sleep: the "Why this sleep?" note is gone.
- The readiness word on Home comes from your HRV against your own normal band instead of restating the
recovery score.
With thanks
Several fixes here were cherry-picked from upstream ryanbr/noop.
Thanks to @ryanbr, @kavemang and @digitalerdude for the original work, and to
@MasterSMax12, @pilleuspulcher-blip, @agentfloley, @bartmuskala and @macor47 for
reporting the problems behind them.
Thanks also to @vishk23, whose v18 field inventory and decode corrections are driving the protocol
work in whoop-rs that this release line runs on.
NOOP-tan is an Android-only fork; where a fix helps everyone it goes back upstream as a PR.
Known limits
- Blood oxygen on WHOOP 4.0 is not trustworthy in this build. It reports a percentage derived from
the strap's red/IR channels, and that figure reads far too low. The channel is sampled once a second,
which is below what a pulse-based reading needs, so the value is an artifact rather than a
measurement. A later build stops reporting it. The 5.0/MG reading comes from the strap itself and is
unaffected. - Rhythm Age needs about seven days of continuous wear before it produces anything.
- WHOOP 4.0 support is decoded and unit-tested but only lightly exercised on real hardware.
Download — sideload on Android 8+ (minSdk 26).
- NOOP —
NOOP-android-v9.0.1-tan.apk(com.noop.tan) — the app. - NOOP Mock —
NOOP-android-mock-v9.0.1-tan.apk(com.noop.tan.mock) — preloaded with synthetic data, installs alongside. For trying it out with no strap.
Paired with whoop-rs — the Rust BLE client and protocol core that owns every score.
NOOP v9.0.1-rc3-tan — release candidate (build 296)
Release candidate. Bug fixes and menu cleanup, plus the last scoring engines moving to the shared Rust core.
The app has a new name
NOOP's app identity is com.noop.tan (it was com.noop.whoop up to v9.0.0-tan).
Every NOOP fork was shipping under the same com.noop.whoop identity. Android allows one app per
identity, so installing a second fork either failed outright or, when the signing keys differed, refused
to update. Moving to a distinct identity means this fork installs beside any other NOOP build, each
keeping its own separate data.
Coming from v9.0.0-tan or another fork, this does not upgrade it — you get a second app. Your old
data stays in the old one. To carry it over: in the old app open Backup & Sync → Export backup file…,
then in this one Backup & Sync → Restore from a backup… and pick that .noopbak. Once it's restored
you can uninstall the old app. Updating from rc2 or rc3 to a later build keeps its data as normal.
Fixed
- Opening More could land you on Health — the More list's Health row pushed onto More's own history,
so the next tap on More replayed it. - "Going to sleep" / "I'm awake" did nothing — they wrote a timestamp nothing read and never touched
detected sleep. Home now offers End sleep while a detected night is still running; one tap ends it
and re-scores the day. - Sleep regularity measured the wrong thing — it read how consistent your sleep length was, blind to
a bedtime that swings. It now uses the Sleep Regularity Index: whether you're asleep at the same clock
time from one day to the next. - Time with the strap off counted against your regularity — gaps are now unknown time, which is what
they are. - Blood oxygen on WHOOP 4.0 was stored as raw sensor counts that never became a percentage. Both
generations now show a percentage on the same card; the 4.0 figure is an uncalibrated estimate. - Body Age uses a sourced mortality-doubling time of 10 years rather than an unsourced 8, so every
Body Age sits further from your actual age. Your zero point is unchanged.
Cleaned up
- Health: the empty Skin Temperature heading and the Records & sources block are gone.
- Sleep: the "Why this sleep?" note is gone.
- The readiness word on Home comes from your HRV against your own normal band, instead of restating the
recovery score.
Under the hood
Workout detection, IMU features, bout calories, HRV spread, baselines and body age all moved to the shared
Rust core, which is now the single owner of every score. The Body Clock card shows real data for the first
time.
Release candidate: not yet verified on hardware.
Download — noop-9.0.1-rc3-tan.apk, sideload on Android 8+ (minSdk 26). com.noop.tan.
Paired with whoop-rs — the Rust BLE client + protocol core that owns every score.
NOOP Staging — base 9.0.1-rc2-tan · 2026-07-24 · 45a5037
Rolling latest testing build — refreshed in place, so this tag is always the newest. NOOP main + ryanbr's open PRs + vetted community PRs, built with the NOOP Staging identity (installs beside the official app, separate data). Filenames carry the base app version (v9.0.1-rc2-tan).
- Android (release) —
NOOP-android-v9.0.1-rc2-tan.apk— optimized, non-debuggable build; installs beside the official app.com.noop.whoop.staging. - Android (debug) —
NOOP-android-debug-v9.0.1-rc2-tan.apk— debuggable build.com.noop.whoop.debug.
Base app version 9.0.1-rc2-tan · built 2026-07-24 · 45a5037.
NOOP v9.0.0-tan — first official Android-only release
First official noop-tan release. Android-only fork of ryanbr/noop.
Download: NOOP-v9.0.0-tan.apk — sideload on Android 8+ (minSdk 26). com.noop.whoop.
Changes since upstream fork
- iOS/macOS/Swift app removed — Android-only
- Home screen: Effort→Strain, ring tap navigation, swipe transitions, pull-to-sync
- Health Monitor: bottom bar (was Trends), beating HR heart, SpO2 dual-mode, skin temp absolute
- Menu cleanup: ⓘ scoring guide removed, Data Sources streamlined, Settings/Automations deduped
- Shared components: 6 reusable composables extracted, 72+ call sites consolidated
- Bottom bar: Home · Health · Sleep · More
- Calibration milestones persist nightly + Profile progress
- Full code review + ECR pass on both Kotlin and Rust (whoop-rs)
- Protocol decode + analytics routed through whoop-rs FFI
Paired with: whoop-rs — the Rust BLE client + protocol core.