A wellness app for Bluetooth heart-rate bands. Tracks HR, HRV, sleep, recovery, and strain, entirely on your device. No account, no cloud, no subscription.
Free · on-device · auditable.
All on-device. No subscription, no cloud, no black box.
Continuous heart rate, zones, and RMSSD heart-rate variability, computed directly from R–R intervals using the 1996 ESC/NASPE standard.
Four-stage sleep from overnight HR, a WHOOP-style recovery score (HRV percentile vs your 30-day baseline), and zone-weighted strain. All from published methodology, not black boxes.
A readiness forecast for tomorrow's HRV, rhythm-anomaly detection, and post-workout summaries with GPS routes, zones, and recovery impact, all computed on your phone.
Everything stays on your device: samples, scores, sleep history. One-tap JSON export for migration, one-tap delete-everything.
HARDWARE
Heart speaks the standard BLE Heart Rate Service (UUID 0x180D). Pair once, wear it 24/7, get insights every morning.
Worn on the chest, upper arm, or forearm. Full support: live HR, RR-interval HRV, battery reporting. Heart was built and tested with this band.
Polar H10, Wahoo TICKR, Garmin HRM-Dual, anything speaking Heart Rate Service 0x180D + Measurement 0x2A37.
Live HR works on optical wrist straps, but RR-interval availability varies, so HRV is coarser than from a chest strap.
Available for Android. iOS coming soon. Pair your band, wear it 24/7, get insights every morning.
Full release history: changelog · privacy policy
ACCURACY · CHEST STRAP VS WRIST
Published literature puts wrist optical sensors at ±5–15 bpm against ECG during effort and ±10–20 ms on overnight HRV. Chest straps as a category reach ±2 bpm and ±3–5 ms. Heart pairs with a chest strap by default, so the input it computes from is fundamentally cleaner.
Same algorithmic class as WHOOP and Oura for derived scores, without the subscription, the cloud, or the closed source.
Heart ingests raw R–R intervals off a BLE characteristic, runs classical signal processing on a 300-sample sliding window, and produces auditable scores. No neural network, no model weights, no remote inference. Every formula traces to a published paper.
VALIDATION · 13 ALGORITHMS · 84 TEST CASES
Every closed-form algorithm in Heart produces output matching the numpy reference (the backend behind pyhrv, hrv-analysis, and Kubios HRV) to floating-point precision: global maximum deviation 1.42 × 10⁻¹⁴, at the IEEE-754 double-precision noise floor.
Reproducible via flutter test test/algorithm_validation_test.dart. Because every formula is closed-form (Tanaka 2001, Uth 2004, Keytel 2005, Holt 1957, ESC/NASPE 1996, Banister 1975, Coyle 1998), "matches numpy" equals "matches Kubios" by mathematical identity.
RAW BYTES → RECOVERY SCORE
STEP 1 · BLE INGEST
BLE 0x2A37 notify frame
flags[0] | bpm[1] | RR_low[2] | RR_high[3] … · ~1 notify / sec
bit1(flags) == 1 → RR values present in frame
STEP 2 · PARSE
RR interval extractor
uint16_le(frame[i], frame[i+1]) / 1024.0 × 1000 → ms
physiological gate: discard RR outside [300 ms, 2000 ms]
STEP 3 · PERSIST
JSONL log · heart_samples/YYYY-MM-DD.jsonl
{"ts_ms": 1715608800000, "bpm": 72, "rr_ms": [812, 819, 808]}
appended live · sandboxed app storage · OS-encrypted at rest
STEP 4 · HRV
300-sample ring buffer → RMSSD
RMSSD = √( Σ(RRᵢ₊₁ − RRᵢ)² / (N − 1) ) [N ≥ 4]
ESC/NASPE Task Force · Eur. Heart J. 17:354–381 · 1996
STEP 5 · SLEEP
Deterministic four-stage classifier · 5-min HR buckets
mean_bpm < baseline + 8 → sleep candidate
onset gate 0.70 · stability σ < 6 bpm · awake / light / deep / REM · heuristics over ML: overnight tflite inference would drain phone + band battery
STEP 6 · BASELINE
OvernightBaselineComputer · 30-day rolling window
RMSSD_array[−30 … −1] → percentile rank of last night
recovery = floor( rank × 100 ) · strain = zone-weighted effort Σ
EVERY FORMULA, EVERY SOURCE
The validation above proves the algorithm, not end-to-end accuracy: sleep staging vs PSG and calories vs calorimetry haven't been independently measured yet. Heart is a wellness application, not a medical device. Scores are estimates from consumer-grade sensors, built for tracking trends, not diagnosis.
IN PROGRESS
Replace static population-norm tables with a personal regression fit once 30+ nights of baseline data exist, surfaced in the UI when calibration is reliable.
PLANNED
Validate the rule-based + prior-calibrated stager against published polysomnography datasets and tighten it where deltas exceed ±10 minutes per stage.