Tracks overnight HRV values
Translation pending
HealthHTML · JavaScriptGitHub @AltroadOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A personal HRV tracking web app built for Apple Watch data exported via Health Auto Export. Runs entirely in the browser — no server, no account. Data stored in localStorage with optional GitHub sync.
Slow Wave Sync (primary method)
Paste three Health Auto Export JSON exports together — previous day HRV, morning HRV, and sleep analysis. The app matches each HRV reading against Apple Watch sleep stage segments in priority order:
Priority 1 — Deep Sleep HRV
HRV readings whose timestamp falls inside a Deep (slow wave) sleep segment. Collected first, any time of night.Read the full README ↗An overnight recovery tracker for Apple Watch data exported with Health Auto Export. It tracks HRV, resting heart rate, respiratory rate and wrist temperature, plus training load, tags and ectopy. Each metric is judged against your own rolling baselines.
It runs entirely in the browser as an installable PWA, with no server and no account. Data lives on the device and, optionally, syncs to a JSON file per user in this repo.
Live app: https://altroad.github.io/HRV-Tracker/
| # | Panel | What it shows |
|---|---|---|
| 1 | Baselines strip | Current baselines: HRV · RHR · RR · TEMP · KCAL |
| 2 | Top card | Latest / 3D avg / 7D avg / Trend, with the zones underneath. It auto-rotates HRV → RHR → RR → Kcal → Temp every 5 s; tap to flip manually (auto-rotation stops for the session). |
| 3 | Status | A combined verdict from the latest night, with HRV · RHR · RR · Temp columns. Tap it for the Status Reference. |
| 4 | Today panel | The night's HRV · RHR · RR · TEMP, the sleep-stage strip and stats, and the readings used. Below a divider is the previous day's activity: kcal (tap to edit), Quick Add + and tags. |
| 5 | Capture Window | Auto or manual shift of the overnight windows (below) |
| 6 | Chart | 14D / 60D trend of HRV, RHR, RR, Temp and Kcal |
| 7 | Year at a Glance | Heatmap: HRV, RHR, Kcal, Temp or Ect |
| 8 | Data Analysis | Every entry, with averages, sorting, note search and tag filters |
An iOS Shortcut uploads the morning's Health Auto Export JSON to the inbox, either data/inbox-<user>.json or a timestamped file in data/inbox-<user>/. When the app opens it:
Each reading is dated from the data itself, not from when the app was opened.
Copy the export and tap IMPORT, or paste it via ≡ → Overnight Capture. If that date already has a reading, you're asked to REPLACE or KEEP it.
| Export | Required | Used for |
|---|---|---|
| HRV (yesterday + this morning) | ✓ | HRV capture |
| Sleep analysis | ✓ | Sleep stages, timeline, RR matching |
| Heart rate | RHR | |
| Respiratory rate | RR | |
| Sleeping wrist temperature | Temp | |
| Workouts | Kcal (previous day) |
Respiratory-rate history: an upload containing respiratory rate and sleep analysis but no HRV, e.g. a few weeks exported in one go, only backfills RR for every night in it. HRV entries are left untouched.
Chips show the readings used: dark blue = deep, cyan = core, dark red = trimmed. Readings recorded back to back share one bordered block.
A late night pushes sleep later, so the Core top-up and RHR windows can shift by up to 1 hour.
The deep anchor always follows actual deep sleep.
The lowest stretch of heart rate lasting at least 9 minutes (gaps up to 7 min bridged), between midnight and 3:30am, shifted by the capture window.
The plain average of every Apple Watch respiratory-rate sample taken during Core, Deep or REM sleep in the night's main sleep session. Awake, "In Bed" and daytime samples are excluded, and at least 5 samples are needed. This matches AutoSleep's nightly figure.
Apple Watch's sleeping wrist temperature, taken from the export.
An entry's kcal is the previous day's activity, the session that shaped that morning's numbers. If Strava and Garmin record the same ride, it's counted once (Strava preferred). Extra activity can be added with Quick Add + or ≡ → Log Reading.
| Metric | Baseline | Zones |
|---|---|---|
| HRV | Average of the last 12 months (all data until then) | High ≥ 110% · Good 95–110% · OK 80–95% · Low < 80% |
| RHR | Average of the last 90 logged nights | Excellent ≤ +1 · Good +2–4 · Elevated +5–7 · High ≥ +8 bpm |
| RR | Average of the 30 nights before each night (needs 7) | Low ≤ −1 (informational) · Normal −1 to +1 · Elevated +1–2 · High ≥ +2 breaths/min |
| Temp | Manual start, then the median of the last 14 nights after 7 | Low < −0.5° · Normal ±0.5° · High > +0.5° |
| Kcal | 42-day average | Low / Medium / High / Extreme relative to it |
Starting baselines for Temp and RR can be set in ≡ → Set Baselines. A manual value applies until 7 nights have been logged after it, then the rolling baseline takes over.
A low RR isn't a warning. A lower sleeping rate usually means deeper, calmer sleep or improving fitness, and it's normal for a while after returning from altitude.
The status message combines the latest HRV zone × RHR zone (16 messages) and adds notes for a raised temperature, an elevated or high RR, or a low RR. Four warning signals escalate it:
HRV Low · RHR High · Temp > +0.5° · RR +1 or more
| Signals | Result |
|---|---|
| Temp + RR up while HRV and RHR hold | Early illness signal (amber) |
| Any 3 of the 4 | Triple-system alarm (red), naming the three |
| All 4 | Quadruple-system alarm (red) |
Tap the status bar for every combination.
A morning rating at the top of the Today panel, so subjective feel can be compared with the data:
| 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|
| Wrecked | Flat | OK | Good | Great |
Tap a tag pill (or TAG) to open the picker. Lit options are active; tap to toggle. Days without an HRV reading (e.g. travel days logged with only RHR or kcal) can be tagged too; the tags move onto the HRV reading if one is logged for that day later.
Training load (one at a time): Rest, Active Recovery, <100TSS, 100-200TSS, 200-300TSS, 300TSS+, Race
Sick · Sauna · Cold: independent toggles
Ectopy (PACs), one grade, logged on the morning entry for the previous day's ride:
A logged ECT 0 (clean on a ride that would have shown it) and ECT X (too easy to tell) are both kept separate from a day that wasn't logged.
data/<user>.json. The token is kept in the browser only.Baseline_Backup.csv with the columns date, hrv, rhr, temp, note, tag, activities, ectopy, rr, kcal, feel. activities holds Sick/Sauna/Cold, and kcal holds the previous day's items as Name=kcal;Name=kcal. Import CSV restores it (adding only what's missing).| File | Purpose |
|---|---|
index.html | The whole app: HTML, CSS and JS in one file |
sw.js | Service worker: network-first HTML, cached fonts, icons and Chart.js |
manifest.json | PWA manifest |
fonts/ | Self-hosted fonts |
data/<user>.json | Synced data per user |
data/inbox-<user>… | Shortcut uploads waiting to be imported |