Documentation

Guides, tutorials, and frequently asked questions

Read HRV Stress Insights from Apple Health | Cozy

Frequently asked questions

Does Cozy read my heart rate variability from Apple Health?
Yes, read-only and optional. Cozy reads the SDNN heart rate variability quantity type from HealthKit and never writes to Health.
Is it opt-in?
Yes. The Apple Health connection is optional and the onboarding screen offers a skip button. Nothing is read until you authorize, and you can revoke access any time in iOS Settings.
What does Premium unlock in the HRV features?
The deep trend analysis behind the Body Rhythm card and detail page, including stress alerts. The current value card stays visible on the free tier.
Which HRV number does Cozy use?
SDNN, the standard deviation of normal-to-normal intervals, which is what Apple Watch samples into Health. It is not RMSSD, and Cozy does not compute its own beats.
Why does it take a few days before the trend appears?
The stress classification is relative to your own median baseline, and the card waits for at least three days with data before showing a seven-day trend instead of a collecting state.
Where are my entries stored?
Entries are local by default. Optional encrypted iCloud sync is off by default, Cozy has no server for your records, and analytics are anonymous only.

The short answer

Cozy reads heart rate variability from Apple Health — the SDNN quantity type your Apple Watch has been sampling — and it does so read-only: the permission request asks to read HRV and no other type, and nothing is ever written back to Health. Every calculation happens on your phone inside a local database; there is no Cozy server holding your samples, no account, and no upload.

What you get is a daily reading in milliseconds, a stress band judged against your own 30-day median, a seven-day sparkline, and a detail page that compares today against 7-, 30- and 90-day baselines. That pairing is the point: it turns "I felt rough" into "my HRV was 18% below baseline on the days I logged as tense." Premium unlocks the deep analysis behind that view; the current value is visible either way.

Why the searcher is here

Almost nobody lands on this query wanting a chart. The question behind it is one of three things, and they need different answers:

  • "I do not have an Apple Watch." This is the hard limit. Apple does not synthesize HRV on iPhone, so if your samples come from a chest strap or a third-party app, you will get an empty card. Nothing in the product can fix that.
  • "Will an app that reads my health data see everything?" It will not. HealthKit gives a read-only app no visibility into samples it was not granted, and Cozy asks for one type. HealthKit also deliberately hides from the reader which app wrote each sample, so the app sees values and timestamps, not your other health data.
  • "I feel fine but my sleep and resting heart rate are terrible." You want a second opinion that is not your own mood. That is a legitimate use, and also the one most likely to be over-read. HRV is a signal, not a diagnosis; the app ships no medical claims and is filed in the App Store as Health & Fitness, not Medical.

What "read-only" actually buys you

The permission request is narrow in two directions:

  • Read scope. One quantity type: heart rate variability SDNN, in milliseconds. Sleep, resting heart rate, heart rate and every workout are not requested, so they are not visible even if they exist in your Health database.
  • Write scope: none. The authorization call passes an empty set of types to share. There is no code path that saves a sample to Health, so nothing you do here — no mood, no stress reading, no pet state — appears to any other app as a Health record.

The data then lands in a local SQLite time-series database. Daily aggregates are recomputed from it whenever new samples arrive, and a decision log of every notification considered (sent, suppressed, or skipped, with the reason) is kept for two weeks. The privacy policy is blunt about it: HRV samples never leave the phone, and optional iCloud sync — off by default — moves mood records through your own CloudKit container without Cozy's servers touching them.

The stress math, in full

This is the part competitor pages skip, so here is the whole of it.

With a baseline. The baseline is the median of your samples over a window — 7, 30 or 90 days — recomputed when at least ten new samples arrive and no more than once an hour. The reading is divided by it, and the ratio becomes one of four bands:

Your average ÷ baselineBand shown
90% and aboveLow — "Calm flow"
75%–90%Moderate — "Steady"
60%–75%High — "Time to ease"
below 60%Very High — "Take a deep breath"

Without one. If there is no baseline yet, the same bands are cut against absolute milliseconds: 50 ms and above is Low, 35 ms Moderate, 25 ms High, below that Very High. That is the fallback you will see in your first days.

Two things follow. A person whose normal is 25 ms never sees "Very High" because 25 ms is their everyday: once a baseline exists, the whole scale is personal.

The trend, the windows, and what "collecting" means

The Home card shows a value, a stress band, a trend pill and a seven-day sparkline of daily averages. It waits for three days with data before showing any of that. Until then the card reads "Collecting" with the line "Just started · 3 days for a stable trend," because two points do not make a trend.

The pill itself comes from a simple split: the window is halved, the first half's average is compared to the second half's, and a change beyond ±5% is rising or easing; anything inside that band is stable, and fewer than three points in the window reads "insufficient data." The stress alerts use a separate rule, because a notification should not fire on two samples.

The alert analyzer climbs an adaptive ladder of windows and stops at the first one with enough points: 2 samples in the last hour, 3 in 4 hours, 4 in 8 hours, 6 in 24 hours. That is tuned to Apple Watch's real sampling density, roughly one SDNN sample every one to two hours — so on a typical day the 4-hour rung is the one that fires. It alerts in both directions: 15% or more below your 30-day baseline means "Stress is rising" (Time Sensitive); 10% or more above it means "Stress is easing."

The restraint is the part worth knowing. The same notification kind cannot fire twice within 30 minutes, no more than three HRV alerts go out in any hour, and nothing is sent between 22:00 and 08:00 unless it is critical. If the newest sample is more than 4 hours old, the analysis is skipped entirely as stale — which is also how a day without your watch surfaces.

Where it breaks, and how it fails

  • No watch, no data. iOS 17 on iPhone is required, and the card is hidden entirely when HealthKit is unavailable or when today has no samples. There is no manual HRV entry.
  • The 90-day baseline is empty for a month. It is a median of your samples, not a calendar window, so it only becomes meaningful after roughly three months of wear.
  • Revoked access looks like denial. Because HealthKit does not tell a reader whether you said no, the app probes with a zero-width query and maps "query failed" to denied, pointing you at Settings → Health → Data Access to change it.
  • A first-day 90 ms and a first-day 30 ms are not comparable. Until the median exists, both are graded on the absolute scale, which knows nothing about you.
  • It is not a medical device. No diagnosis, no treatment advice, no claims.

How it compares to the obvious alternative

Apple Health itself collects the same samples and draws a fine chart of them. What it does not do is grade them against a personal baseline, pair them with a mood log, or surface the result on your Home Screen where a five-second log already happens. The contribution is context and cadence, not a better sensor.

Dedicated HRV apps often go the other way: richer charts, longer histories, and a server. Cozy's answer is that analysis is cheap enough to do locally, and the pairing with mood is the part a heart app cannot do.

A spreadsheet is free and honest but costs ten minutes a day, which is what kills habit apps.

What Cozy does differently, and honestly where it stops

The differentiator is the pair: a personal-baseline stress band and a five-second mood log, on the same screen, both computed on-device. On top of that, Cozy ships alerts tuned to Apple's sparse sampling cadence, a decision log so you can see why a notification did or did not fire, and no server for your samples. The product page is at agentsmesh.app/products/cozy; the listing is Cozy on the App Store.

The honest limits, so you are not surprised:

  • SDNN only. Not RMSSD, not beat-to-beat, not clinical-grade.
  • About three days of watch wear before the trend means anything, and a month before the alerts can find a stable 30-day baseline.
  • Background monitoring is on by default once you authorize; declining notification permission means no silent background work.
  • Free versus Premium. On the free tier you can see today's HRV value and band and the card is marked PRO; Premium ($4.99/month or $29.99/year in the US, with a seven-day free trial on the yearly plan for first-time subscribers, or $49.99 once for lifetime) unlocks the Body Rhythm detail page: the seven-day trend, the 7/30/90-day baseline comparison, the 30-day stress distribution and the stress alerts. The store listing also names "triggers, recovery patterns and advice" under Premium; treat that as the paywall's label for the deeper analysis, not a named feature list.

The decision

If you wear an Apple Watch most days and want a second signal next to your moods without your heart data leaving the phone, this is one of the few places that does the pairing locally. If you have no watch, if you want clinical-grade or RMSSD data, or if you would rather read raw numbers in Apple Health and think about them yourself, it is the wrong app — and it will say so within a day rather than after a subscription. Keep logging for a week and let the baseline arrive before you decide anything about Premium.

Related apps