StrapLog HRV

Every heartbeat from your chest strap, in a file you own.

StrapLog records beat-by-beat RR intervals from a Polar H10 (or any H10-compatible strap) on your iPhone — overnight, on a walk, on the bike — and saves each recording as one SQLite file in your iCloud Drive. Live heart rate, RMSSD and DFA α1 while you record; markers from the app, Lock Screen, Apple Watch or Siri; and no account, server or analytics. Apple's privacy label for StrapLog reads Data Not Collected.

Get StrapLog on the App Store $0.99 · iPhone (iOS 18+) · Apple Watch optional

StrapLog recording screen: heart rate 67 bpm, DFA α1 0.77 in the green easy band, heart-rate chart with a marker
Recording
StrapLog recording summary: duration, mean and lowest HR, RMSSD, artifacts, coverage, α1 band minutes and markers
Summary
StrapLog Apple Watch app during a recording: heart rate, α1 and a marker button
Apple Watch

What you need: an iPhone and a Polar H10-compatible strap (about $90). Watches and wrist sensors do not connect; that is the point — a strap reads the heart's electrical signal to about a millisecond, which optical sensors cannot.

StrapLog is a personal measurement tool, not a medical device.

Why a recorder and not another HRV app

Most HRV apps sell you a score. StrapLog records the evidence and leaves the interpretation to tools you can inspect and improve: a Python package and a set of open-source Claude skills that read the files directly. Analysis built into an app is frozen on the day it ships; analysis that lives in your own tools gets better every month without an app update.

The app's job is narrow and it does it carefully: keep recording with the phone locked, survive Bluetooth drops and relaunches, write files that are never half-written, and tell you honestly how much of the night it actually heard (coverage).

Your files

Every recording is one file in Files → iCloud Drive → StrapLog (or On My iPhone → StrapLog without iCloud), named by start time and name, e.g. 261016-2304-sleep_2026-10-16.sqlite. On a Mac the same folder is

~/Library/Mobile Documents/iCloud~com~personalscience~straplog/Documents/

Beside the recordings sits index.json, a list of every recording with start time, duration, beat count, coverage and marker labels — so a script or an agent can find the right night by reading one file.

Inside each file are tables for recording, beat (every RR interval as the strap sent it, in 1/1024 s, plus ms and an estimated time), event (markers, connects and disconnects, pacer, posture), motion (the strap's accelerometer, once per second), notification and meta. Times are Unix epoch milliseconds UTC, with the recording's time-zone offset stored alongside. Files are written as single-file snapshots (VACUUM INTO), so you never see -wal or -shm companions and never read a partial file.

Full schema: docs/SCHEMA.md. Any SQLite tool opens the files: DB Browser for SQLite, sqlite3, Python, R.

Analyze it

Python. pip install straplog (or uv add straplog). The straplog command lists your recordings and prints RR intervals, events and metadata as CSV or JSON; the package also carries the HRV algorithms the skills use (artifact filter, RMSSD, DFA α1).

straplog ls --json            # every recording in the iCloud folder
straplog rr <file.sqlite>     # RR intervals as CSV
straplog events <file.sqlite> --markers

Claude skills. The straplog-skills plugin gives Claude Code the analyses I use myself:

SkillQuestion it answers
hrv-overnightHow was the night? RMSSD and SDNN trajectory in blocks, Bluetooth coverage gaps, reconciled against Apple Watch sleep staging
hrv-restingToday's resting HRV — RMSSD, LnRMSSD, SDNN, pNN50 — logged with a rolling 7-day baseline
h10-sessionA workout: heart-rate zones, DFA α1, cardiac drift, per-set peaks and recovery for lifts, optional GPX/FIT overlay
hrv-ramp-testAerobic and anaerobic thresholds (α1 = 0.75 and 0.50) from a graded ramp, and your training zones
h10Routes any recording to the right skill by activity

Install in Claude Code (needs uv):

/plugin marketplace add personalscience/straplog-skills
/plugin install straplog-skills@personalscience

Then, with the iCloud folder in reach, ask: “How did I sleep last night?”

Both the package and the skills are MIT-licensed on GitHub: personalscience/straplog-py and personalscience/straplog-skills. The app's source is at personalscience/StrapLog.

No shell? On a recording's page in the app, Share export sends the file anywhere.

One experiment a month

I write Personal Science, a newsletter on measuring yourself with tools you control. Each StrapLog experiment — a protocol, what to record, what a null result looks like — goes out there first.

Subscribe Free. No other mail.

Guide

The manual that ships inside the app (tap ? on Home).

Getting started

What you need

Put the strap on

  1. Wet the electrodes (the textured pads on the inside of the strap) with water.
  2. Snap the sensor onto the strap and fasten it around your chest, just below the chest muscles, snug but comfortable.
  3. The sensor wakes up when it touches skin. It sleeps again when you take it off, so there is no switch.

First launch

When StrapLog opens for the first time, iOS asks for permission to use Bluetooth. Allow it, or StrapLog cannot hear the strap.

StrapLog then looks for a strap nearby. The heart at the top left of the screen shows what is happening:

The first strap StrapLog connects to becomes your strap. From then on it only connects to that one, so a partner's strap in the same room will not get mixed up with yours. (To switch to a different strap, see Troubleshooting.)

When you start your first recording, iOS also asks whether StrapLog may send notifications. Allow them if you want an alert when the strap stops sending beats (see Alerts and gaps).

Your first recording

  1. Put the strap on and wait for the red heart.
  2. On Home, choose Other, and tap Start.
  3. Sit still for a few minutes and watch the numbers fill in. Heart rate shows at once; the HRV numbers need about 2 minutes of beats.
  4. Tap Stop… and confirm. StrapLog saves the recording and writes its file.
Home after a recording: the Last recording card sums it up
Home after a recording: the Last recording card sums it up

That's it. The chapters below explain everything else.

Recording

Choosing an activity

Home offers two activities. StrapLog remembers the one you used last.

Activity Use it for What's different
Sleep Overnight recordings Can stop itself at your wake time. Never sends link alerts. Marker buttons: lights out, awake, up.
Other Everything else: rest, exercise, breathing practice Marker buttons: a, b, c, end.

You can give the recording a name, or leave it blank and StrapLog names it after the activity and the date ("sleep 2026-10-16"). You can rename it later.

You can start a recording before the strap connects. Beats are saved from the moment it does.

The recording screen

A recording in progress: heart rate, α1, the chart and the marker buttons
A recording in progress: heart rate, α1, the chart and the marker buttons

The title shows a red dot, the elapsed time and the recording's name.

Heart rate (bpm), left tile. The strap's own beats-per-minute reading, sent about once a second. The strap smooths it, so it lags sudden changes by a few seconds. A warning appears under it when the strap loses skin contact.

DFA α1, right tile. The latest α1 (see DFA α1 and training zones), refreshed every 20 seconds. The tile takes the colour of its intensity band, so a glance tells you how hard you are working. Until there are 2 minutes of beats it reads "First α1 after 2 min of beats".

The line beneath shows the latest RMSSD, the artifact % and how long ago α1 was computed. If that age keeps growing, too few clean beats are arriving.

The chart. Pick HR, α1 or RR. The chart follows the newest beats.

Markers sit below the chart (see Markers). The wind button at the top opens the breathing pacer (see Paced breathing).

In landscape, the numbers sit on the left and the chart fills the right.

Stopping

Tap Stop… and confirm. StrapLog closes the recording, writes its file and shows a summary on Home.

You can also stop from the Lock Screen, the Apple Watch, Siri or Shortcuts. A Sleep recording can stop itself (see Sleep recordings).

If the app is closed

You do not need to keep StrapLog on screen. Lock the phone or switch apps and it keeps recording in the background.

If iOS or you close StrapLog during a recording, it picks the same recording up again the next time it opens. A recording left untouched for more than 6 hours is closed instead.

While recording, StrapLog rewrites the recording's file every 30 minutes and whenever it goes into the background, so even an unexpected shutdown loses very little.

Sleep recordings

Choose Sleep on Home before bed. Two extra settings appear:

How a Sleep recording ends

StrapLog uses the strap's motion sensor to tell lying down from sitting or standing up. A change of posture only counts once you have held it for a minute.

While a Sleep recording runs, the heart-rate tile adds two lines, for example "Low 46 at 03:40" and "5 h 12 min": the night's lowest heart rate so far (the same 2-minute average as Lowest HR in the summary), when it happened, and how long you have been recording. A low late in the night often follows a late meal, alcohol, a hard evening workout or stress.

The recording screen spells out the plan, for example "5 min resting at 06:30, then stops; or after 10 min upright". Turn Stop at wake time off and only the 10-minutes-upright rule applies.

Overnight tips

To start a Sleep recording automatically at bedtime, see Shortcuts and Siri.

Markers

A marker stamps the current moment with a label: "lying down", "start stage 3", "coffee". Markers are saved with the recording, so you can later compare the parts of a session (before vs. after, rest vs. exercise). They never change any measurement.

You can also add markers from the Lock Screen, the Dynamic Island, the Apple Watch and Siri.

Lock Screen and Dynamic Island

While recording, StrapLog shows a Live Activity on the Lock Screen and in the Dynamic Island:

The Lock Screen Stop button stops at once, without asking. Use it with care.

The Live Activity updates every 10 seconds or so, and immediately for markers and link changes. If it says "No update for over a minute — open StrapLog", iOS has paused the app; opening it catches up. iOS ends a Live Activity after 8 hours; StrapLog starts a fresh one with the next update.

If you see no Live Activity, check that Settings → StrapLog → Live Activities is on.

Apple Watch

The Watch app is a remote display and control for the recording on your iPhone. The iPhone does all the recording; the Watch never stores beats.

The Watch app

The Watch app during a recording
The Watch app during a recording

The Watch taps your wrist when a command is sent, and buzzes twice if the strap stops sending beats while the app is on screen.

The Action button and Siri on the Watch

The Next Marker action adds the next marker from the Watch. Assign it to the Apple Watch Ultra's Action button, or say "Mark next in StrapLog".

When the iPhone is out of reach

If the Watch app is on screen and the iPhone has gone quiet (out of range, or left in another room), the Watch listens to the strap directly and shows its heart rate with the caption "no iPhone". This is heart rate only: no α1 and nothing is saved. It switches back as soon as the iPhone reports again. The first time, the Watch asks for Bluetooth permission.

Heart rate straight from the strap while the iPhone is away
Heart rate straight from the strap while the iPhone is away

Complications

Add StrapLog to a watch face (circular, corner, rectangular or inline). While recording it shows a heart and your heart rate or the elapsed time, or an orange warning if the strap has a problem. When idle it reads "Not recording". Tap it to open the Watch app.

To save battery, the complication updates only now and then (at start, stop, link changes and about hourly). The heart rate it shows can be up to 20 minutes old and disappears after that; open the app for the live number.

Keep StrapLog on screen

By default the Watch goes back to the clock face 2 minutes after you lower your wrist. To keep StrapLog up during a workout or a long session, on the Watch open Settings › General › Return to Clock, scroll to StrapLog, turn on Custom and choose After 1 hour (or Always).

With the wrist down, on a Watch with Always On, StrapLog stays on screen dimmed: just your heart rate, a heart (or an orange warning if the strap has a problem) and how many markers you have added. It updates about once a minute in that state, which costs little battery; raise your wrist for the full screen and the live number.

If the Watch has gone back to the clock anyway, the complication is the quickest way back: tap it.

Alerts and gaps

During a recording that isn't Sleep, StrapLog sends a notification when beats stop arriving:

You get one alert when the problem starts, not a stream of them, and it disappears once beats come back. The alert is time-sensitive: it can break through a Focus if you allow time-sensitive notifications for StrapLog. If your iPhone is locked, it also reaches your Apple Watch.

Gaps and coverage

Beats that happen while the strap is out of touch are lost; the strap does not keep them for later. StrapLog keeps the recording open through any disconnect and carries on when the strap returns.

The summary's Coverage is the share of the recording that had heart data. Any silence longer than 3 seconds counts as a gap. A few short gaps overnight are normal. Long gaps mean stretches with no data, and analysis skips the windows they fall in.

The strap sheet

Tap the heart at the top left for details:

Your recordings

Home lists every recording with its name, local start time, duration and beat count. open means it is still recording.

After you stop, a Last recording card sums up the session:

Tap the card or any row to open the recording: its summary, a chart of the whole session (pinch to zoom, drag to pan), the markers with their clock times and the strap's battery at start and end. Tap a marker to centre the chart on it.

You can change the name, activity and notes there. Saving renames the file to match.

A finished recording's page
A finished recording's page

Swipe a row left to delete a recording. This removes it from the iPhone and deletes its file from iCloud Drive, so share or copy the file first if you want to keep it.

Analyzing your recordings

StrapLog's numbers on screen are a live view. The real product is the file each recording leaves behind: every beat, marker and posture change, in a format any tool can read (see Exports and your data). Ready-made analyses read those files directly.

Claude skills. Five open-source skills for Claude Code turn a recording into a report:

To install them, run these two commands in Claude Code on a Mac (it also needs uv, from docs.astral.sh/uv):

  1. /plugin marketplace add personalscience/straplog-skills
  2. /plugin install straplog-skills@personalscience

In the app, Copy install command on the guide's contents page copies both lines. Then, with iCloud Drive on the Mac, ask Claude "How did I sleep last night?"

Python. The straplog package (pip install straplog) lists your recordings and prints beats, events and metadata as CSV or JSON, with the same HRV algorithms the skills use.

The skills, the package and StrapLog itself are open source; personalscience.com/docs/straplog links to all three.

Exports and your data

Where the files go

Every recording is saved as one file in Files → iCloud Drive → StrapLog, or in Files → On My iPhone → StrapLog if iCloud Drive is off. The exact location appears under Last export.

Files are named by start time and name, like 261016-2304-sleep_2026-10-16.sqlite. The folder also holds an index.json listing every recording.

On a recording's page, Share export sends the file anywhere (AirDrop, Mail, Messages), and Export again rewrites it if it went missing.

Opening the files elsewhere

Each file is a standard SQLite database holding one recording, so any SQLite tool opens it: DB Browser for SQLite, the sqlite3 command line, Python, R or a spreadsheet add-in. Inside:

All times are stored in UTC (milliseconds since 1970), with your time-zone offset saved for each recording. A beat's time is an estimate, because the strap does not time-stamp beats: StrapLog infers it from when the phone received each beat.

Reinstalling

Your recordings live in two places: the app's own database, and the files above. If you delete and reinstall StrapLog, it reads the files back in when it opens, and your recordings reappear on Home. Files that iCloud has moved off the phone come back a little later, once they have downloaded.

Files in On My iPhone are deleted along with the app. If iCloud Drive is off, copy the StrapLog folder somewhere safe before you delete the app.

Shortcuts and Siri

StrapLog's actions work from Siri, the Shortcuts app and the iPhone's Action button, without opening the app:

A Sleep start uses the wake time set on Home.

Start recording automatically at bedtime

  1. Open Shortcuts → Automation → New Automation → Sleep (or Focus → Sleep).
  2. Choose When Turning On, then Run Immediately.
  3. Add the StrapLog action Start Recording and set Activity to Sleep.

Put the strap on before Sleep Focus turns on, so the night's first beats are caught.

What the numbers mean

RR interval (ms)

The time from one heartbeat to the next, in milliseconds. This is the raw material for everything else. 1000 ms between beats is 60 bpm; 500 ms is 120 bpm (bpm = 60 000 ÷ RR).

The RR chart (a tachogram) plots it over time. Up means slower beats, down means faster. At rest it rises and falls with your breathing: beats speed up as you breathe in and slow down as you breathe out. Big, smooth waves are typical of a relaxed state. A flat line means little variability, which is normal during hard exercise.

A chest strap measures RR from the heart's electrical signal, accurate to about a millisecond. Optical wrist sensors can't match that, which is why StrapLog uses a strap.

Artifacts and artifact %

Not every reported beat is real. A missed beat shows up as one interval twice as long as usual. An extra beat shows up as a short interval followed by a long one. Movement and poor contact add more. StrapLog removes suspect beats before computing anything:

  1. It discards any interval shorter than 300 ms (above 200 bpm) or longer than 2000 ms (below 30 bpm).
  2. It compares each beat with the median of its five-beat neighbourhood and drops any beat more than 25 % away from it, repeating up to three times.

Artifact % is the share of beats removed.

Artifact % Meaning
under 2 % Clean. Trust every number.
2–5 % Fine for RMSSD and heart rate. Treat DFA α1 with care.
over 5 % Fix the strap before reading anything into DFA α1. RMSSD may read high.

Occasional extra beats are common, but they inflate HRV. That is why the cleaning matters.

Analysis windows

The HRV numbers are computed over a 2-minute window. In the saved analysis it moves forward every 60 seconds; on screen, α1 steps every 20 seconds over the same 2 minutes. Each window is cleaned on its own and needs at least 60 beats, or it is skipped (shown as "--"). So:

Heart rate

The live tile shows the strap's own reading. The summary and the analysis use the average over cleaned beats (60 000 ÷ mean RR), which is steadier.

RMSSD (ms)

Root mean square of successive differences: how much each beat's interval differs from the one before, averaged over the window. It reflects fast, beat-to-beat changes driven mainly by the "rest and digest" (parasympathetic) side of the nervous system.

LnRMSSD

The natural logarithm of RMSSD. A jump from 80 to 100 ms means less than a jump from 20 to 40, and taking the log evens this out, so averages and day-to-day comparisons behave better. Many HRV apps track this form (some show it × 20).

RMSSD LnRMSSD
20 ms 3.0
33 ms 3.5
55 ms 4.0
90 ms 4.5

How to use it: keep a rolling 7-day average of your morning value. A single low day means little. Several days in a row well below your usual range are worth noticing.

SDNN (ms)

Standard deviation of all RR intervals in the window: total variability, fast (breathing) and slow (posture shifts, slower body rhythms).

Motion and posture

The strap's motion sensor is summarised once per second and saved with the recording. It shows when you were still and when you moved or turned over. StrapLog uses it to tell lying from upright for Sleep recordings. It isn't shown on screen; it's in the exported file.

DFA α1 and training zones

DFA α1 (detrended fluctuation analysis, short-term exponent) measures the pattern of variation rather than its size: whether one beat's interval tends to predict the next few.

As exercise gets harder, α1 falls in a consistent way. That makes it a strap-only way to estimate your training zones without a lab test:

α1 Band (colour) Rough intensity
above 1.0 rest / very easy (blue) Recovery effort
0.75–1.0 easy (green) Comfortably conversational
0.75 aerobic threshold Top of truly easy training
0.50–0.75 moderate (orange) Between thresholds ("tempo")
0.50 anaerobic threshold Hard; sustainable for tens of minutes at most
below 0.50 very hard (red) Above threshold
The α1 chart: shaded bands with the 0.75 and 0.50 lines
The α1 chart: shaded bands with the 0.75 and 0.50 lines

Finding your thresholds

  1. Choose Other and start a recording. Warm up easily for 5–10 minutes.
  2. Walk, cycle or row, raising the effort a little every 3 minutes. Tap a marker at each step.
  3. Note your heart rate (or pace, or power) when α1 crosses 0.75, and again at 0.50.
  4. Repeat every few months; the crossing points move as your fitness changes.

Only exercise as hard as is safe for you.

Caveats

Paced breathing

Tap the wind button at the top of the screen to breathe along with a guide, any time, recording or not. It runs by default at 6 breaths per minute (5 seconds in, 5 seconds out), adjustable from 4.5 to 7, and remembers the rate you chose. The phone taps at each turn so you can close your eyes.

The breathing pacer
The breathing pacer

Around 6 breaths a minute, breathing and heart rate fall into step. The RR chart turns into big, smooth waves and SDNN rises well above its usual resting value.

Most people have a personal resonance rate between 4.5 and 7 breaths a minute. To find yours, try a few rates for 2–3 minutes each on different days. The rate that gives the biggest, smoothest RR waves (highest SDNN) is yours.

The pacer is saved only while a recording is open. Start one while pacing and the recording notes the pacer from its first second; stop the recording and the pacer keeps going. Hiding the pacer stops it.

Don't compare RMSSD from breathing sessions with your normal resting baseline: slow breathing raises it.

Getting good data

Troubleshooting

The heart stays grey and searching. Make sure you are wearing the strap with wet electrodes (it is off until it touches skin), Bluetooth is on, and StrapLog has Bluetooth permission (Settings → StrapLog). Check the strap's battery.

I have a new strap, or StrapLog connects to the wrong one. StrapLog remembers the first strap it connected to. To switch, stop any recording, take the old strap off, put the new one on, then tap the heart and Use a Different Strap.

Heart rate shows, but Beats doesn't grow and α1 stays at "--". The strap is connected but not sending beats, almost always because of poor contact. Wet the electrodes and tighten the strap.

α1 reads oddly low at rest. Check artifact %. Bad contact or extra beats push α1 down.

The recording has gaps. Keep the phone closer, replace the strap battery, and wear the strap snug. Each disconnect is saved in the file's events.

I got no alert when the strap dropped. Sleep recordings never alert. For other recordings, check that notifications are allowed for StrapLog, and that your Focus lets time-sensitive notifications through.

There is no Live Activity on the Lock Screen. Turn on Settings → StrapLog → Live Activities.

The Watch says "Waiting for iPhone…". The iPhone is out of reach or locked away. The command is sent when the iPhone is back in range; you can also cancel it.

Something else. The strap sheet (tap the heart) shows the app's version and build. Include it when you write to support@personalscience.com.

Support

Email support@personalscience.com with the app version and build from the strap sheet (tap the heart). Bugs and feature requests: GitHub Issues. StrapLog is open source and community-supported; I read everything, but I do not promise a reply time.

Privacy

StrapLog makes no network connections. Recordings stay on your iPhone and in your own iCloud Drive; nothing leaves your devices unless you share a file. There is no account, no analytics and no third-party SDK that transmits data; the Polar BLE SDK talks only to the strap. (This website, unlike the app, counts visits with Google Analytics.) Full policy: StrapLog privacy policy.

StrapLog is a personal measurement tool, not a medical device. It does not diagnose, treat or prevent any condition.