Your WHOOP data, on your own devices, with a coach that actually remembers you.
| โ Your WHOOP, without WHOOP | Pairs straight with a WHOOP 4.0 or 5.0/MG over Bluetooth. No WHOOP account, no subscription, nothing in the middle. |
| ๐ฑ iPhone and Mac | Runs on iOS 17+ and macOS 13+, from the same codebase. |
| ๐ค A coach with a memory | 22 tools it uses to look things up mid-answer, a goal, a plan you agreed to, and facts it remembers across months โ not a chatbot bolted onto a dashboard. |
| ๐ Deep health analysis | Recovery, strain, sleep, HRV, readiness, training load and n-of-1 correlations โ all computed on your device, from published methods. |
| ๐ A home-screen widget, and Siri | The NOOP Rings widget (Charge alone, or Charge + Effort + Rest) at a glance, plus a "How's my recovery?" Siri/Shortcuts intent that answers without opening the app. |
| ๐ No server, no account | Everything lives in a database on your machine. The coach is the one thing that opens a socket, only with your own API key, only when you ask it something. |
| ๐ Apple-only, diverging freely | Forked from ryanbr/noop โ every protocol decoder and analytics formula started there โ but this fork dropped Android and no longer tracks upstream commit-for-commit. |
New here? The coach is what makes this fork different โ jump to The coach. Everything else is upstream NOOP, which is excellent and deserves the credit.
- The coach โ the reason this fork exists
- What NOOP itself does ยท What leaves your device
- Quickstart ยท What it looks like
- About the fork ยท Docs
- Attribution ยท Disclaimer ยท License
Upstream ships a chat-with-your-own-API-key coach that receives one pre-baked block of text per message. This fork turns that into something with a goal, a plan, a memory, and hands to go and fetch its own data.
Instead of a fixed summary, the coach reaches for 22 tools mid-sentence. Crucially,
get_readiness and get_charge_drivers read from the exact same engines the Today screen uses,
so its verdict can never contradict the number you're looking at.
- ๐ฏ
get_readinessโ the same push / maintain / rest verdict Today shows - ๐ฌ
get_charge_driversโ why today's Charge is what it is, term by term, never an invented reason - ๐
plot_metricโ draws a real chart inline in the chat - ๐
propose_planโ suggests a session; it cannot book one - โ
log_caffeine/log_journal/log_lab_markerโ writes to your real app data
That last group is the fun one: "just had a double espresso" becomes a real entry in the Caffeine card. "my Vitamin D came back at 38" becomes a Lab Book marker. Same data, logged by talking.
Most AI chat features either forget everything or dump everything into every prompt. This one works more like a person's:
- Facts have shape. Each carries a category (goal, injury, preference, physiology, schedule) and an importance. Pinned facts โ a serious injury, a hard constraint โ ride along on every reply; the rest surface only when relevant to what you just asked.
- It corrects itself. Tell it your knee is fine now and the stale fact is rewritten, not stacked next to a contradiction. Near-duplicates merge instead of eating the memory budget.
- It remembers conversations โ including when. Ask "what did I ask you yesterday?" and it searches by day, quoting your own questions back.
- It tidies up cheaply. Leaving a chat hands it to a small, cheap model (Haiku / gpt-4o-mini / Flash-Lite โ you pick) for a one-line summary. Your expensive model never pays for housekeeping.
Every fact is visible and editable in Settings. Nothing is remembered that you can't see or delete.
Set a target โ a run, a consistency streak, sleep, weight, or free-text โ and the coach stops improvising. Up to five goals can run at once, weighed against each other.
- Two safety checks, neither of which ever blocks you. Is the pace aggressive? Measured as a percentage of your own body weight or volume per week, so the same 20 kg cut reads correctly at 60 kg and at 160 kg โ an aggressive pace asks for a one-line reason and remembers it. Is it realistic? Checked against your on-device VOโmax estimate โ and for weight goals, always reported honestly as "no data to judge that on", because there isn't any.
- It never plans your diet. Training is the only lever it has, and it says so.
- No invented percentages. Progress is a real measurement against a real baseline, or nothing.
- A goal whose date passes gets a look-back โ once, asking what you want to do with it, rather than a verdict on a number it hasn't checked.
The coach can suggest a session. It cannot schedule one. Every suggestion waits as a proposal until you accept, decline, reschedule or swap it.
Swapping shows the consequence before you decide, computed from your own history rather than a generic table: "CrossFit at 10:00 instead of Zone 2 โ about 18 points and 2 recovery days instead of 6 and one. Tomorrow's projection drops from ~62 to ~45." Skipping is one tap and a reason; pain and illness are read back with context, not judgment, and a few skips never get a sport permanently written off.
Not every message from the coach deserves the same treatment โ a suggested session needs a decision; "your recovery is low" doesn't. The coach now picks a category, a priority, and how long something stays relevant, and the app renders each one differently instead of stuffing everything into one "Today's session" card:
- Needs a decision โ a proposed session, with Accept / Change / Decline right there.
- Just a hint โ a proactive nudge (a body signal worth knowing, a small win) that used to live only in chat, now also lands in the bell so it's visible without opening a conversation. Dismiss it or leave it for later; there's nothing to accept.
- Status & reminders โ read-only history: what a decided proposal turned into, a goal deadline, a restorable card.
The bell โ previously Classic Today only โ is now in both Today screens, reading the same inbox, so switching between them never hides what's waiting for you.
Svea or Marv โ two ready-made identities, each with its own name and avatar โ or make your own: any name, a symbol, or a real photo via the system picker. A photo never leaves the device or gets sent to your provider; it's rendered locally everywhere the coach shows up. Identity is who's talking โ separate from coaching style (Guardian / Friend / Commander), which only changes tone, never the methodology or the "I'm not a doctor" guardrails.
| Streams everywhere | Token-by-token on every provider, with tool calls running inline โ including local models, where it matters most. |
| Says when it spoke first | A daily brief or an unprompted nudge is labelled as such, and badged, so it never reads as a reply to a question you've forgotten asking. |
| Recovers from failures | Offline says offline; a rejected key offers the key screen; a rate limit counts down from the provider's own Retry-After. |
| Searchable, pinnable history | Full-text search across threads, pin the ones worth keeping, share any as Markdown. |
| A closer look on demand | Optionally set a heavier model for one question at a time โ "Look at this more closely" on a reply you've already read. Off unless you configure it. |
| In-chat charts | Native trend charts drawn in the conversation, and they survive a relaunch. |
| "Ask coach" on any card | A sparkle on Today's rings and every card โ a short, careful read of one number without leaving Today. |
| A name and a face | See ๐ญ It has a face and a name above. |
| Honest about cost | Token counts and cache behaviour after every question, on every provider. |
| Bring almost any model | Anthropic, OpenAI, Google Gemini, OpenRouter, or any OpenAI-compatible endpoint โ including a local Ollama or LM Studio server. |
| Replies in your language | The coach is told the app's current language and answers in it โ chat, check-ins and briefs alike, not just the UI chrome. |
| 8 languages in the UI | English, Deutsch, Espaรฑol, Franรงais, Italiano, Portuguรชs, ะ ัััะบะธะน, ไธญๆ(็ฎ/็น). German/Spanish/French are reviewed; the rest are machine-translated and would benefit from a native pass โ see docs/COACH.md. |
๐ The deep version โ docs/COACH.md: every tool's schema, the safety gates, the plan book's state machine, the memory ranking, provider support, and the file map.
Everything in this section is upstream ryanbr/noop, inherited
unchanged โ credit belongs there and in docs/FEATURES.md.
- Pairs directly with a WHOOP 4.0 or 5.0/MG strap over Bluetooth Low Energy. WHOOP straps don't appear in Settings โ Bluetooth; NOOP finds them on their own advertising profile.
- Computes its own scores on-device, from published methods: Charge (recovery), Effort (strain) and Rest (sleep quality) โ an energy economy you wake with, spend, and rebuild overnight โ plus HRV, resting heart rate, SpOโ, respiration and skin temperature. Honest approximations, explicitly not WHOOP's own scores.
- Everything lives in an on-device SQLite database. Import a WHOOP or Apple Health export for instant history, or just wear the strap and let it build.
- Automatic Apple Health sync (HealthKit background delivery), so the coach always reasons over fresh data.
Worth being precise about, because "AI" and "private" rarely share a sentence:
- The app itself is fully offline. Strap data, database, scores, goals, plan, memory and chat history are all local. There is no NOOP server and no account.
- Only the coach opens a socket โ only when you send a message, only to your own provider with your own key, and only if you've turned data access on. Turn it off and the coach still works; it just doesn't see your numbers.
- Data access isn't one switch โ it's seven. Core biometrics, workouts, planning, stress, logging, memory and personal patterns are each granted independently (Settings โ Privacy & data โ Data access), so you can hand the coach your workouts without your sleep, say, rather than all-or-nothing.
- Summaries, never raw signal. Derived daily numbers and short text โ never raw R-R streams or sensor buffers.
- You can go fully local. Point the Custom provider at Ollama or LM Studio and nothing leaves your network at all.
More: docs/PRIVACY_SECURITY.md.
You'll need a Mac with Xcode 26+ and xcodegen
(brew install xcodegen). For the iOS app you also need a physical iPhone โ Bluetooth and
HealthKit don't exist in the Simulator.
git clone https://github.com/DX23876/noop.git NOOP-AI
cd NOOP-AI
xcodegen generate # project.yml is the source of truth; the .xcodeproj is generated
open Strand.xcodeprojiPhone โ pick the NOOPiOS scheme โ select your iPhone โ Signing & Capabilities โ set your
Team โ โR. On the phone, trust the certificate under Settings โ General โ VPN & Device Management.
A free Apple ID works, with two small trade-offs (the Watch app/widget step back, and the build
expires after 7 days) โ ๐ docs/DETAILS.md.
Mac โ pick the Strand scheme and โR.
Then: pair your strap โ grant Apple Health access โ open Coach โ paste your API key โ optionally give your coach a name, a face and a goal.
|
Svea |
Marv |
| Pick a ready-made coach, or make your own โ any name, symbol or photo. | |
marketing/NOOP-demo.mp4.
NOOP AI is a personal fork of ryanbr/noop โ not a competitor, and not a rebrand that hides where it came from. Every protocol decoder, analytics formula and pixel of the design system comes from upstream; this fork adds a much bigger coach on top, in its own files, without rewriting upstream logic. Apple platforms (iOS + macOS) are what it builds and tests โ Android is dropped as a target, and this fork no longer necessarily tracks upstream; it diverges freely now.
Just want a great WHOOP app? Use ryanbr/noop โ macOS, Android and iOS, actively maintained, and the right answer for most people. This fork is for the narrow case where you want the coach pushed further than a cross-platform project could reasonably justify.
๐ The full rationale: docs/DETAILS.md.
- docs/COACH.md โ the coach in full: tools, goal gates, plan book, memory, providers.
- docs/DETAILS.md โ fork rationale, the complete tool table, architecture, signing fine print, where things stand with upstream, and the docs index.
- docs/PRIVACY_SECURITY.md โ the data posture in detail.
NOOP AI is a fork of NOOP by ryanbr โ please treat that
repository as the canonical project, not this fork. NOOP itself stands on community
protocol-documentation work: johnmiddleton12/my-whoop (WHOOP 4.0 BLE protocol),
b-nnett/goose (WHOOP 5.0/MG BLE protocol), groue/GRDB.swift (SQLite persistence), and
weichsel/ZIPFoundation (export unzipping).
NOOP contains no WHOOP proprietary code, firmware, logos, or assets. Full detail in
docs/DETAILS.md and ATTRIBUTION.md.
NOOP AI is an independent, unofficial, non-commercial interoperability project. It is not affiliated with, endorsed by, or connected to WHOOP, Inc. All references to "WHOOP" are nominative.
NOOP is not a medical device. Heart rate, HRV, recovery, strain, sleep stages, SpOโ, respiratory
rate and skin temperature are approximations from published methods โ not clinically validated,
not medical advice. The AI coach is not a doctor and must not be used to diagnose or treat. Consult a
qualified professional. Provided as-is, with no warranty, for personal and educational use.
See DISCLAIMER.md.
Source-available under the PolyForm Noncommercial License 1.0.0: free for personal and
other non-commercial use โ read it, run it, fork it. Commercial use is not granted. This fork keeps
the upstream LICENSE and Copyright 2026 NoopApp notice intact, per NOOP's mirroring terms;
bundled dependencies keep their own licenses (see NOTICE).

