Repository navigation
Heart Rate Recovery
Status: Current implemented behavior. Audience: Users and contributors. Implementation:
domain/insights/HeartRateRecovery.kt,features/recovery,features/activity,features/manualentry/activity/recording. Navigation:heart/recovery, a card on an activity's detail screen, and a surface on the heart screen. Related: Feature map, Heart and vitals, Activity recording.
How far your heart rate falls in the minute after hard effort stops is a well-studied marker of cardiovascular fitness. OpenVitals measures it from the heart rate samples attached to a workout, and is deliberately conservative: a number that would mislead is withheld rather than shown.
The measurement needs an abrupt, recorded stop. Nothing in an ordinary workout says where the effort ended, so measuring from the session end instead gives a recovery computed from a heart rate that had already been falling for minutes — sometimes a negative one.
That is why OpenVitals offers a guided test during recording. It needs a connected heart rate sensor, because the measurement wants a reading every few seconds through the minutes after you stop; data that arrives from a watch after the fact cannot drive it.
The guided test writes the moment the effort stopped into the saved session, and that mark is what the reading is measured from later.
Readings are taken at 30 seconds and at 1, 2, 3, 4 and 5 minutes after the stop.
The one-minute drop is the headline: it is the mark with a body of normative literature behind it, and the one comparable across monitors. There is deliberately no ten-second mark — optical sensors smooth over several seconds, so a figure that early is unreliable on the monitors people actually wear.
A sample counts as a mark only if it lands within 3 seconds of the 30-second mark or 5 seconds of the others. Heart rate falls fast right after cessation, so a looser window would cost several bpm of a number that is only tens of bpm wide. A mark with no sample near enough is reported as missing; it is never invented.
Every reading carries a verdict, so a weak measurement is never presented as a strong one:
- Clean — near-maximal effort, a peak taken close to the stop, and at least the one-minute mark present.
- Approximate — usable, but something was estimated or coarse: the headline mark is missing, the peak rests on a single sample, or no maximum heart rate could be resolved.
- Not comparable — a real drop, from an effort too easy to compare against your other readings.
- Invalid — the number would mislead, so it is not charted. Either you eased off before the stop, so the "drop" measures your cool-down, or the heart rate did not fall at all, which means the recording stopped before you did.
- No data — there was nothing to measure.
Only readings good enough to compare are charted; the rest are shown with their reason.
Judging whether effort was near-maximal needs a maximum heart rate. OpenVitals resolves one in this order:
- The maximum you entered in Body profile.
- The highest rate actually observed, when it is plausible against your resting rate.
- An age estimate: Gulati (206 − 0.88 × age) when the body profile says female, otherwise Tanaka (208 − 0.7 × age). Both are more accurate than the older 220 − age rule.
An estimated maximum widens the band that counts as near-maximal, because the estimate itself is uncertain. If none of the three can be resolved, the reading is marked approximate rather than being judged on a guess.
- Duplicate samples on the same instant — a strap and a watch both recording — keep the higher reading. That is the conservative choice in both directions: a higher peak is harder to clear the effort gate with, and a higher recovery reading means a smaller reported drop.
- The reading is an OpenVitals wellness estimate computed on your device. It is not a Health Connect record and not medical advice.
Generated from docs/features/heart-rate-recovery.md. Edit it there; changes made here are overwritten.
This wiki mirrors the Markdown in Hale-MTU/OpenVitals on every push to main.
Features
- Features
- Achievements
- Activity And Training Plans
- Activity Metrics
- Apple Health Import
- Beverage Logging And Caffeine
- Bluetooth LE Sensors
- Body Energy
- Body Metrics
- CoMaps Navigation Context
- CSV Import
- Cycle Tracking
- Daily Readiness
- Elevation Correction
- Feature Map
- FIT Files Import
- Food Logging
- GPX/KML/KMZ/TCX Route Import
- Health Connect Metrics Dashboard
- Health Report Export
- Heart And Vitals
- Heart Rate Recovery
- Home Screen Widgets
- Hydration
- Manual Entry Of Metrics
- Medical Records
- Metric Detail Customization
- Mindfulness
- Non Health Connect Metrics Dashboard
- Nutrition
- Offline Maps Support
- Onboarding And Permissions
- Preloaded Beverage Nutrition Reference
- Privacy, Support, And Diagnostics
- Recording Of Activity
- Reminders
- Settings And Preferences
- Sleep Score And Recovery
- Sleep Tracking
- Statistics
- Sync With Another Phone
How-to
App
- App Guide
- FAQ
- Getting Started
- Health Connect
- Install
- Local And Connected Editions
- Permissions
- Privacy
- Screenshots
- Support
Reference
- Design Reference
- Reference
- Design Guidelines for Offline & Sync
- OpenVitals UI Notes
- Reference: Data Capture
- Reference: Data Display
- Reference: Health Connect Matchmaking
- Reference: Health Connect Onboarding
- Reference: Health Connect Permissions
- Reference: Health Connect UX
- Reference: Promoting Health Connect
Engineering
- Code Analysis
- Engineering
- Flutter ↔ Kotlin test-parity matrix
- apple-health-import
- Architecture
- body-cycle-recovery
- Design system conformance
- Development
- Feature Playbook
- Flutter -> Kotlin test parity: domain/data/core/contract/state/navigation/di/bootstrap/l10n/widget_test
- Flutter → Kotlin test-parity matrix: features section
- Flutter → Kotlin test-parity matrix: ui / goldens / integration / fixtures
- Flutter-to-Kotlin test-parity matrix — dashboard + devicesync
- manual-entry
- Translations
Proposals
- Proposals
- Activity Start Flow Analysis
- Activity Start Flow Simplification Proposals
- Caffeine Detail And Future Sleep Insights
- Cycle Tracking: Design and Status
- Medical Records Through Health Connect
- Medical Records: What Is Left
Releases
- OpenVitals 2.16.0
- OpenVitals 2.15.2
- OpenVitals 2.15.1
- OpenVitals 2.15.0
- OpenVitals 2.14.5
- OpenVitals 2.14.4
- OpenVitals 2.14.3
- OpenVitals 2.14.2
- OpenVitals 2.14.1
- OpenVitals 2.14.0
- OpenVitals 2.13.0
- OpenVitals 2.12.0
- OpenVitals 2.11.2
- OpenVitals 2.11.1
- OpenVitals 2.11.0
- OpenVitals 2.10.1
- OpenVitals 2.10.0
- OpenVitals 2.9.1
- OpenVitals 2.9.0
- OpenVitals 2.8.0
- OpenVitals 2.7.3
- OpenVitals 2.7.2
- OpenVitals 2.7.1
- OpenVitals 2.7.0
- OpenVitals 2.6.6
- OpenVitals 2.6.5
- OpenVitals 2.6.4
- OpenVitals 2.6.3
- OpenVitals 2.6.2
- OpenVitals 2.6.1
- OpenVitals 2.6.0
- OpenVitals 2.5.0
- OpenVitals 2.4.1
- OpenVitals 2.4.0
- OpenVitals 2.3.2
- OpenVitals 2.3.1
- OpenVitals 2.3.0
- OpenVitals 2.2.8
- OpenVitals 2.2.7
- OpenVitals 2.2.6
- OpenVitals 2.2.5
- OpenVitals 2.2.4
- OpenVitals 2.2.3
- OpenVitals 2.2.2
- OpenVitals 2.2.1
- OpenVitals 2.2.0
- OpenVitals 2.1.0
- OpenVitals 2.0.4
- OpenVitals 2.0.3
- OpenVitals 2.0.2
- OpenVitals 2.0.1
- OpenVitals 1.9.0
- OpenVitals 1.8.0
- OpenVitals 1.7.7
- OpenVitals 1.7.6
- OpenVitals 1.7.5
- OpenVitals 1.7.4
- OpenVitals 1.7.3
- OpenVitals 1.7.2
- OpenVitals 1.7.1
- OpenVitals 1.7.0
- OpenVitals 1.6.3
- OpenVitals 1.6.2
- OpenVitals 1.6.1
- OpenVitals 1.6.0
- OpenVitals 1.5.1
- OpenVitals 1.5.0
Project