Skip to content

Proposal: an opt-in Simple view — three scores up front, each opening the wearer's own data behind it #2463

Open

Description

@andremiliano

Summary

A proposal for an opt-in Simple view: a presentation mode that shows NOOP's existing numbers in a structure closer to what WHOOP wearers already know — three scores up front, and tapping one explains your data behind it. No new metrics, no new calculations; only what is shown, where, and in what order.

This is filed to agree direction before any code, since it touches both platforms and several screens. It is written to be delivered in small, separately reviewable steps.

The problem

NOOP computes more than most wearables, and shows nearly all of it at once:

  • More lists 27 destinations on iOS (StrandiOS/App/RootTabView.swift: What Moves You, Intelligence, Insights, Explore, Compare, Live, Workouts, Lift Log, Health, Lab Book, Stress, Breathe, Intervals, Rhythm, Your Data Fused, Apple Health, Mi Band, Data Sources, Backup & Sync, Shortcuts Export, NOOP Limitations, Alarms, Automations, Test Centre, Siri & Shortcuts, Power saving, Settings).
  • Today composes from 11 section kinds (Strand/Data/TodayLayoutPrefs.swift).
  • The most useful explanation NOOP has — why today's Charge is what it is — is not on the default screen at all (below).

A wearer coming from WHOOP, or comparing against a watch app, meets this density and — as happened while filing this — concludes the app is "tracking things wrong" when the numbers are right and the recipes simply differ (see #1545). Clarity is a correctness issue here, not only a taste one.

Reference: how WHOOP structures it

From WHOOP's own descriptions of its app, the structure (not the visual design) is:

  • Three dials front and centre — Sleep, Recovery, Strain — on an overview whose other cards are customisable and reorderable.
  • Tap a dial for a deep dive into that score.
  • Recovery is explained by its inputs: heart rate variability, resting heart rate, sleep and respiratory rate, each against the wearer's own baseline.
  • Sleep performance is explained by its parts: sufficiency (hours versus need), consistency, efficiency and stress.

Sources: WHOOP — the Overview screen, WHOOP Basics, WHOOP Sleep.

This proposal borrows that information architecture only. NOOP is clean-room; nothing here uses WHOOP's assets, artwork or naming, and all UI stays on NOOP's design tokens.

What already exists and is under-used

Most of what this needs is built:

  • The Charge driver breakdown. StrandAnalytics/ChargeDrivers.swift computes the per-driver contribution (HRV, resting HR, respiratory rate, sleep, skin temperature, each against baseline) from the identical inputs the score uses. It is wired into the classic Today (showChargeBreakdown, Strand/Screens/TodayView.swift) but not the default Liquid Today — so on the default screen the one explanation a WHOOP user expects first is unreachable.
  • Rest's parts. Sleep performance, consistency, need and debt are already stored per day (Repository's sleep_performance / sleep_consistency / sleep_need_min / sleep_debt_min series).
  • Effort's inputs. Time in HR zones, workouts and steps per day are already computed for the Effort dossier and workout detail.
  • A familiar Effort axis. Settings already offers Effort on a 0–21 scale alongside 0–100 (UnitPrefs.effortScaleKey, The Effort scale setting doesn't seem to be applied to the Today screen. (UI) #45).

The tap problem on the rings today

On Liquid Today each ring cell has two targets: the ring opens that metric's detail (#1995), and the label beneath it — the only element carrying a › chevron — opens the scoring guide, which explains what the score means in general. The visible affordance therefore leads to the generic explainer, and the path to the wearer's own data has no affordance at all. #2035 asks for fewer taps into the insight; this is the underlying reason it feels that way.

Proposal

A Simple view toggle (Settings, both platforms), off by default initially.

1. Today

Only:

  • The three rings (Charge / Effort / Rest), each whole cell tappable into its own detail page.
  • One sentence of synthesis (the existing Synthesis line).
  • Today's workouts.

Everything else remains available through the existing customisation, not deleted.

2. One detail page per ring — the wearer's data first

Each ring opens a page that answers "why is my number this today", in this order:

  • Charge — the score; the driver breakdown from ChargeDrivers (HRV, resting HR, respiratory rate, sleep, skin temp, each shown against the wearer's own baseline with a direction); a 7-day bar of Charge.
  • Effort — the score on the wearer's chosen scale; time in zones; the day's workouts and their share; a 7-day bar of Effort. A one-line note naming the Effort recipe in use (Edwards or Banister) and what it under-counts, per the discussion in Better accuracy on weightlifting/gym workout #1545.
  • Rest — the score; hours versus need, consistency, efficiency, stages; sleep debt; a 7-day bar.

The general explainer moves to a small info button on each page, so it is one tap away but no longer the default destination.

Optional, if Coach is configured: an "Ask Coach about this" entry on each page that opens Coach with that page's context, so an AI explanation is available where the chart is rather than only in the Coach tab (related: #1862, #762).

3. More

About six entries — Workouts, Health, Journal, Alarms, Data & Backup, Settings — plus "Show all features", which opens today's full list unchanged. Nothing is removed. (#1573 is the broader Settings/More reorganisation; this only chooses what Simple view shows first.)

Guardrails

  • Presentation only. Simple view composes existing views and resolvers; it must not recompute any figure. Per the rule that two readouts of one fact must not disagree, each number on a Simple page comes from the same resolver the full view uses — asserted by a test on the resolver, not by counting call sites.
  • Parity. Both platforms, feature-level (Design iOS and Android different - alignment possible? #2218 is the general version of this concern).
  • Design tokens only, as everywhere else.
  • No scoring changes. Recipe choices (Better accuracy on weightlifting/gym workout #1545) are discussed separately; Simple view only names the recipe in use.

Suggested phasing

  1. The toggle, and Simple Today — wire the whole ring cell to the detail page; move the guide behind an info affordance.
  2. The Charge detail page with the existing driver breakdown (the highest-value, most-reused piece).
  3. Effort and Rest detail pages.
  4. Simple More.

Each step is shippable and reviewable on its own.

Open questions

  1. Is a separate mode wanted at all, or should (1) and (2) simply become how the default Liquid Today behaves? The ring-tap and missing-breakdown problems exist regardless of any toggle.
  2. Should the Charge breakdown on Liquid Today be treated as a parity gap with classic Today and fixed independently of this proposal?
  3. Any objection to the "Ask Coach about this" entry, given Coach is the one feature that leaves the device?

Happy to prototype phase 1 if the direction is agreeable.

Activity

  1. pipiche38 commented on Sep 25, 2026

    @pipiche38

    I like very much the idea, and would vote for it.
    The current User Interface looks very complex with all the data.
    The beauty of NOOP is that ALL datas are accessible, but in return it is hard to be simple.

    Looking forward for your prototype

  2. andremiliano commented on Sep 26, 2026

    @andremiliano
    Author

    Prototype update: "Glance" (iOS working, Android next)

    Thanks @pipiche38! There's now a working iOS prototype, running on my phone daily. I renamed it Glance, because it ended up showing more than the classic Today, just arranged so each part reads at a glance. Code is on my fork: glance-prototype.

    What it's for

    Presentation only. It's opt-in (Settings → Glance layout, off by default), and the classic Today is untouched when it's off. It adds no new scores, no network, no accounts. Every number comes from a resolver NOOP already has:

    • ChargeBreakdownWiring
    • BodyVitalSigns / VitalBands
    • the Sleep tab's sleep-debt ledger
    • BehaviorInsights
    • CoupledView.optimalStrainRange
    • VitalityEngine
    • the Stress tab's day curve

    Where a number appears twice, both copies come from one resolver.

    Who it's for

    People coming from WHOOP, Bevel or a watch app, who find the current density hard to read. They take correct numbers as "wrong" because nothing says what they mean (as in the problem section above).

    What's in it

    • Today
      • One score card: the three rings, the day's synthesis, and two plan tiles (Effort target 48–67, Asleep by 23:10). The Effort target is hatched onto the Effort ring. It uses the existing recovery → optimal-strain mapping.
      • Stress through the day (highest, lowest and average hour).
      • A Health Monitor grid. Each vital says Normal for you, Higher than your normal, or Below the usual adult range before 14 nights, with the range shaded on a small gauge.
      • Tonight: sleep need (the ledger's base plus debt to make up) and a bedtime. The bedtime counts back from the wind-down wake time, or from the usual wake time if none is set.
      • What goes with your Charge: only effects BehaviorInsights marks significant, with day counts and a "correlation, not cause" note.
      • Training load, a timeline of workouts and the night, a dismissible "first weeks" guide (4 nights → Charge, 14 → your own normal, 30 → trends), and a small Body Age row.
    • Every ring, tile and row opens its data (this also covers Tapping the circles (Recovery, strain and sleep at the top of today view) on IOS and going straight into that insights. Instead of needing more taps. #2035):
      • Score pages for Charge, Effort and Rest.
      • A plain-language page per vital: what it is, your range, and where the range comes from.
      • Interactive trend pages: scrub to read any day, 30D/3M/6M/1Y, by weekday, and 3/7/14/30-day change. The full technical page stays one tap further.
    • Trends: an activity calendar and "days within your Effort target".
    • Experimental (a separate switch, off by default, labelled on screen): an Energy estimate. It's a stated rule of thumb from Charge, time awake, stress and Effort, not validated, and feeds nothing else.

    Screenshots from the iOS Simulator with NOOP's built-in synthetic demo data (no real health data):

    Today · Health Monitor and Tonight · Effort page (target hatched on the ring) · Charge page (with the #2501 wording)

    What it is not

    Verification so far

    • iOS Release build runs on device.
    • StrandTests 2185/2185 pass, including 28 Glance tests. Those cover the target band, usual range, trend analysis, tonight plan and usual wake time, and a sweep asserting each vital's quoted range always agrees with its VitalBands verdict.
    • i18n gate and doc lint are clean, with nine locales for every new string (machine-assisted, not native-reviewed).

    Plan, and questions for you

    Following the parity rule, I'll port it to Android before opening any PR. Then I'd send it as small PRs, each covering both platforms:

    1. Score and trend pages.
    2. The Glance Today layout.
    3. Tonight, plan tiles and first-weeks guide.
    4. What goes with your Charge.
    5. Trends consistency cards.
    6. The experimental Energy card, last and optional.

    Before I put weeks into the Compose port:

    • Is an opt-in layout like this something you'd want in NOOP at all? Would you prefer it behind the Experimental/beta flag first?
    • Is "Glance" OK as a name, and is splitting it that way reviewable for you?
    • Anything you'd rather not have in it (Energy, Body Age row, the Bevel-style ring hatch)?

    Happy to change direction. This is your project, and I'd rather it land well than fast.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions