Your unused strap. Your iPhone. Your choice.
An independent, open-source fitness app for a WHOOP 4.0 you already own, with local processing on your phone.
Features · Accuracy · Help validate · Quick start · Docs · @adidshaft
Got an unused WHOOP 4.0 in a drawer? Atria is an optional way to explore its signals: live heart rate, sleep, recovery, strain, steps and more, computed on your iPhone. No WHOOP account, no cloud, no subscription.
Independent project, not affiliated with or endorsed by WHOOP. Use with hardware you own is voluntary; Atria does not require replacing the official app or services and does not claim to be better than them. Strap data is processed locally and the developer cannot remotely access it. Atria provides fitness estimates; seek a doctor's advice before making medical decisions.
| ❤️ Live heart rate | All day, in the app, widgets, Live Activity and Dynamic Island |
| 😴 Sleep | Detected nights and naps, stages as a labelled estimate, sleep need and debt |
| 🔋 Recovery & HRV | From your own overnight baselines, never population guesses |
| 🔥 Strain & workouts | Heart-rate-based strain; possible workouts to review in one tap |
| 👣 Steps | Counted from the strap's own motion sensor, even with the phone locked |
| 🌡️ Skin temperature | Night-to-night change from your own baseline |
| 🧠 Coach | Answers from your data, written by Apple's on-device model; nothing leaves the phone |
| 🔄 Catch-up | Pulls the strap's stored history after time away from the phone |
| 🔒 Local only | Backups and HealthKit export stay under your control |
Every number is being checked against a trusted reference, one metric at a time: a known truth, a fixed test, repeats, and a pass bar written down before any data (validation plan).
First one done: steps. Walking to a sample-exact metronome, one step per click, on a real iPhone:
| Test | Steps taken | Atria counted |
|---|---|---|
| 100 per minute | 100 | 95 |
| 80 per minute | 80 | 80 |
| 120 per minute | 120 | 107 |
| Phone locked in a pocket | 100 | 100 |
| Two minutes typing at a desk | 0 | ≈ 0 |
Most of the gap is human reaction time at the first and last click (#21).
Atria is built by one person with just a WHOOP 4.0 and an iPhone: no chest strap, no watch or ring, no WHOOP membership, no pulse oximeter. Every accuracy check that needs one of those is waiting for someone who has it.
If you own any of these, you can move a metric from "estimate" to "validated":
| You have | You can validate | Start here |
|---|---|---|
| 🫀 A chest strap (Polar H10, Garmin HRM, Wahoo, Coros, Suunto) | Heart rate, HRV, resting HR, strain, calories | #66 |
| ⌚ A watch or ring (Apple Watch, Oura, Garmin, Samsung, Pixel/Fitbit, Ultrahuman, RingConn) | Sleep timing & stages, breathing rate, skin temperature, VO2max | #67 |
| 💪 An active WHOOP membership | Recovery and strain against WHOOP's own numbers | #68 |
| 🩸 An overnight pulse oximeter (Wellue O2Ring, Masimo, Nonin) | Blood oxygen | #69 |
| 📝 Nothing but 2–3 weeks of a one-line diary | Sleep timing, recovery direction, workouts, whole-day steps | #70 |
How it works
tools/validation.dev. It has to hold on every repeat and
work for everyone (no constants tuned to one person), with a test.You need a Mac with Xcode, an iPhone on iOS 26.1+ (Bluetooth can't be tested in the Simulator), and a WHOOP 4.0 that isn't connected to the WHOOP app.
git clone https://github.com/adidshaft/atria.git
open atria/Atria/Atria.xcodeproj
Pick the Atria target and your iPhone, set your signing team, and press Run. The app walks you through pairing the strap. No strap yet? Tap Explore sample data on the welcome screen.
Stuck? docs/SETUP.md covers signing, logs and the common errors.
ATRIA_DEVICE_ID="YOUR-PHYSICAL-DEVICE-ID" ./live_device_debug.sh --seconds 45 --log logs/live-device/run.log --log-gate-status --standard-hr-only --long-wear-mode --leave-running
Offline checks (known failures tracked in [#44](https://github.com/adidshaft/atria/issues/44)):
./test_handoff_local.sh
Overnight long-wear monitor (non-invasive; samples without relaunching Atria):
ATRIA_DEVICE_ID="YOUR-PHYSICAL-DEVICE-ID" python3 tools/monitor_long_wear.py --preset overnight --label overnight-$(date -u +%Y%m%dT%H%M%SZ)
Accessibility and scroll-performance evidence: `tools/capture_accessibility_visual_evidence.sh`,
`tools/capture_dashboard_scroll_performance.sh`, then
`tools/prepare_accessibility_performance_evidence.py`. Summarise handoff evidence with
`python3 tools/audit_handoff_status.py --skip-external-reference`.
| Path | What's there |
|---|---|
| `Atria/` | SwiftUI app, widgets, HealthKit, Bluetooth and metrics |
| `tools/validation/` | Accuracy validation: data pull, chest-strap recorder, scorer |
| `tools/strap-mac/` | Mac Bluetooth research: protocol captures, metronome |
| `tools/` | Analysis helpers for captures and evidence |
| `docs/` | Protocol research, plans and status — start at [`docs/README.md`](https://github.com/adidshaft/atria/blob/HEAD/docs/README.md) |
| `evidence/` | Device evidence. Gitignored: may contain personal health data |
Work lands on dev; reviewed changes reach main through the
integration PR. Read CONTRIBUTING.md, then pick an
open issue. They are labelled by
area and by what they wait on (needs: reference, needs: device proof,
help wanted: reference device). Accuracy help is the most valuable
contribution right now: see Help make Atria accurate.
Atria keeps your data on your phone. Logs and evidence files can contain timestamps, heart rate, sleep and device names, so review them before sharing. Atria is a personal-fitness and research project, not a medical device. Don't use it for diagnosis, treatment or safety decisions.
Dual licensed under MIT or Apache-2.0.
| 日期 | 榜单 | 排名 | 周期新增 | 总 STAR |
|---|