Skip to content

DX23876/noop

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

1,610 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

NOOP AI

NOOP AI

Your WHOOP data, on your own devices, with a coach that actually remembers you.

Platform Straps AI coach No cloud Fork of ryanbr/noop License: PolyForm Noncommercial 1.0.0

NOOP โ€” your strap, your data, your machine


What you get

โŒš 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.


Contents


The coach ๐Ÿค–

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.

๐Ÿ”ง It looks things up while it answers

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.

๐Ÿง  It has a real memory

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.

๐ŸŽฏ It knows your goal, and stays honest about it

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.

๐Ÿ“… It proposes; you decide

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.

๐Ÿ“ฌ It decides what reaches you, and how

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.

๐ŸŽญ It has a face and a name

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.

๐Ÿ’ฌ The chat itself

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.


What NOOP itself does โŒš

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.

What leaves your device ๐Ÿ”’

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.

Quickstart ๐Ÿš€

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

iPhone โ€” 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.

What it looks like ๐Ÿ“ธ

NOOP AI โ€” Trends, Today and the on-device Intelligence read, side by side

Svea, one of the two ready-made coach identities
Svea
Marv, the other ready-made coach identity
Marv
Pick a ready-made coach, or make your own โ€” any name, symbol or photo.

Today: Charge, Effort and Rest at a glance, with the coach one tap away

โ–ถ๏ธ Short demo video: marketing/NOOP-demo.mp4.

About the fork ๐Ÿด

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 ๐Ÿ“š

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

Attribution ๐Ÿ™

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.

Disclaimer โš ๏ธ

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.

License ๐Ÿ“„

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

About

An iPhone WHOOP companion with a coach that actually knows you. Local-first, your own API key, no cloud.

Resources

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages