Skip to content

NOOP 9.0.1-stable · 27 July 2026

Latest

Choose a tag to compare

@github-actions github-actions released this 27 Jul 09:31

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

  • NOOPNOOP-android-v9.0.1-tan.apk (com.noop.tan) — the app.
  • NOOP MockNOOP-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.