Open Wearables 0.5.2: Polar Webhooks, Sport Type Expansion, and HRV Score Integrity
Open Wearables 0.5.2 is out. This release focuses on a full Polar refactor with webhook support, expanded sport type coverage across providers, new Garmin fields, and a stricter HRV-CV scoring policy. Full release notes are on GitHub. If you want to see Open Wearables running in your stack, book a Discovery call.
Key takeaways
- Polar now syncs sleep and timeseries data, with optional webhook support
- WorkoutType enum expanded: 70+ provider-specific mappings updated across Apple, Garmin, Suunto, and WHOOP
- Garmin now fetches allDayRespiration and moveIQActivities
- HRV-CV Resilience Score returns null instead of a fallback SDNN value when RMSSD data is missing
- New recovery summary endpoint added
- Two new contributors, bringing the total to 36
Polar refactor and webhook support
The Polar integration has been reworked to synchronise sleep and timeseries data. By default, Periodic Pull remains the active sync method. Webhooks are opt-in: enable them in Settings > Providers. Once enabled, Polar pushes data to your Open Wearables instance rather than waiting for the next pull cycle.
A few things worth knowing before you enable webhooks. Your instance needs to be publicly reachable. Polar webhook delivery has the same retry behavior as other providers, so handle duplicate event delivery gracefully. The fix for duplicate EventRecordDetail inserts in this release (using savepoints to handle conflicts) covers exactly this kind of scenario.
If you are building a wellness or fitness app where Polar data timeliness matters, the webhook path is now viable. If you are running batch analytics, Periodic Pull is still the simpler option.
Expanded sport type support
Before 0.5.2, a lot of provider-specific activity types ended up mapped to WorkoutType.OTHER. That made sense as a placeholder, but it became a problem when you needed to differentiate activities in your application logic or analytics pipeline.
This release expands the WorkoutType enum and adds explicit support for activities that were previously swallowed by OTHER. Over 70 provider-specific mappings have been updated across Apple, Garmin, Suunto, and WHOOP. New named types include cricket, lacrosse, racquetball, bowling, archery, fencing, fishing, wakeboarding, parkour, curling, and more.
This is a non-breaking expansion since new enum values are additive. Existing records mapped to OTHER will not be retroactively updated, but new syncs will use the correct types.
New Garmin fields
Two fields have been added to Garmin-specific attributes: allDayRespiration and moveIQActivities.
allDayRespiration provides continuous respiration rate data across the day, not just during tracked workouts. moveIQActivities exposes Garmin automatic activity detection: walking, running, cycling, and swimming identified without requiring the user to manually start a workout.
Strict RMSSD enforcement for HRV-CV Resilience Score
Previously, when overnight RMSSD data was missing for a user, the HRV-CV Resilience Score calculation would automatically fall back to SDNN. RMSSD and SDNN measure different aspects of heart rate variability. They are correlated but not equivalent, and using one as a silent substitute for the other produces scores that look valid but are computed on different underlying data.
0.5.2 disables the SDNN fallback pending further validation. Users without overnight RMSSD data will now receive a null score instead of a fallback value. A null score is honest. A score computed from a different metric without disclosure is not.
If your application currently displays HRV-CV scores, add handling for null values and consider surfacing a message to users explaining why the score is unavailable when RMSSD data is missing. The fallback may be re-enabled once the relationship between RMSSD and SDNN in this specific calculation has been validated more rigorously.
Other fixes and changes
- New recovery summary endpoint
- Fix: commit each data type individually and rollback session on exception for Oura and Whoop
- Fix: cast to local date for summary endpoints
- Fix: validation for date parameters in OpenAPI specs
- Fix: skip invalid user rows during email validation
- Fix: handle duplicate EventRecordDetail inserts gracefully with savepoint
- Updated all Python and TypeScript dependencies
Upgrading
docker compose pull && docker compose up -d
Full changelog: github.com/the-momentum/open-wearables/releases/tag/0.5.2
Docs: docs.openwearables.io
Questions or feedback: join the Discord or open an issue on GitHub.