Heartlab

Heartlab records heart rate continuously on a Wear OS watch, derives a strain and recovery picture on the device, and says when to back off. Every figure can show its formula, its inputs, and where the data came from. Nothing is sent to a server.

The premise is that all heart-rate elevation is strain. Training, work, illness, a stressful day, and a bad night all draw on the same recovery capacity, so Heartlab measures them as one pool with one number rather than separating “training load” from life.

One lever: reduce

The app never prescribes load. There is no readiness-to-train score and no suggested workout. Its alert rules — sustained high heart rate, elevated heart rate at rest, resting-HR elevation, strain outpacing the norm, heavy strain days — all point towards reducing. On a calm day it says so and stops.

Spells, not guesses

Passive heart rate cannot reliably tell a hard effort from a fever, a hot room, or a loose strap. Instead of guessing, Heartlab shows each detected elevation as a spell with the evidence it has: duration, intensity, movement, and whether the watch logged an exercise. The user marks whether it was real. Rejected spells are subtracted from the day and shown, dimmed, next to the total — so what the sensor recorded and what was accepted are both visible.

That verdict is the only input the app accepts that is not a measurement, and the only thing that can lower a strain figure.

No HRV, deliberately

Wear OS’s Health Services exposes heart rate but no RR/beat-to-beat interval stream and no HRV data type. This was verified on a Pixel Watch 2 rather than assumed: the watch declares the relevant permissions and ships the Health Connect controller, but has no data store. Health Connect integration was removed rather than kept as an optional path that can never work on the device with the sensor.

Architecture

The code is split into Kotlin modules: core:model for domain types and configuration, core:algo for metrics and alert evaluation, core:data for Room and DataStore, core:sync for the Wearable Data Layer transport, plus separate wear and mobile apps. Metric algorithms are pure Kotlin and unit-tested. The project is AGPL-3.0.

Heartlab is a fitness and wellness tool, not a medical device.

Built with

  • Kotlin
  • Jetpack Compose
  • Wear OS
  • Room
  • DataStore
  • Coroutines
← All projects