synheart_wear 0.4.3
synheart_wear: ^0.4.3 copied to clipboard
Flutter SDK for wearable signals — Apple HealthKit, Health Connect, WHOOP, Garmin, Oura, and Fitbit. Unified HR, HRV, steps, calories, distance, stress.
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased #
0.4.3 - 2026-05-26 #
Fixed #
- iOS: BLE HRM auto-reconnect on cold start no longer fails with
DEVICE_NOT_FOUND.BleHrmHandler.connect(deviceId:)used to rely on an optional chain overCBCentralManager, which isnilon the first BLE call after a process launch —retrievePeripheralsandretrieveConnectedPeripheralsthen returned nothing and the connect short-circuited before the radio came up. The fix mirrors whatscan()already does: lazily instantiate the central manager, and if the state is still.unknown/.resetting, stash the request in a newpendingConnectslot and finish it fromcentralManagerDidUpdateStateonce.poweredOnis reached. On.poweredOff/.unauthorizedthe pending request is failed with the same error codes the scan path already returns. Hosts that drive auto-reconnect viaBleHrmService.ensureConnected()at app startup now reconnect to a previously paired strap without a manual "Re-scan" tap.
0.4.2 - 2026-05-19 #
Changed #
- Logging hygiene pass across the four wearable adapters (WHOOP, Garmin, Fitbit, Oura). Default log level demoted so a live debug run no longer drowns the operator in init dumps and full-payload request / response logs. Multi-line emoji-prefixed init blocks collapsed to one summary line each. Full URIs, full third-party response bodies, and user identifiers are no longer logged at INFO level — they're DEBUG-only or redacted to suffix-only at INFO. Errors and lifecycle events still emit at WARN/ERROR.
Privacy #
- User identifiers and OAuth state nonces are no longer logged in full at INFO. Full URIs and full third-party API response bodies are DEBUG-only.
0.4.1 - 2026-05-08 #
Fixed #
- iOS: Auto-detect
Frameworks/Companion.xcframeworkatpod installtime. When the licensed Garmin Companion XCFramework is present, the podspec now wires upvendored_frameworksand-weak_framework Companionautomatically (previously this required hand-uncommenting two lines, and licensed users hitUnable to resolve module dependency: 'Companion'if they forgot). OSS consumers without the framework continue to get a cleanpod install; Garmin methods surfaceGarminSDKErrorat runtime as before.
0.4.0 - 2026-05-07 #
The SDK collects normalized wearable signals from the device's platform
health store (Apple HealthKit on iOS, Health Connect on Android) and
from supported third-party vendors (WHOOP, Garmin, Oura, Fitbit) via
their public APIs. Normalization happens in the SDK; HSI generation
happens upstream in synheart_core.
Public surface #
SynheartWearfacade,SynheartWearConfig.withAdapters({...}).DeviceAdapterenum —platformHealth,whoop,garmin,oura,fitbit. (platformHealthcovers both Apple HealthKit and Health Connect; the legacy nameappleHealthKitwas renamed to make the cross-platform behavior obvious.)MetricType(hr,hrvRmssd,hrvSdnn,steps,calories,distance,stress),WearMetrics,PermissionType,ConsentStatus.RamenEventtyped event surface with aDeliveryHintenum (stream/ping/unknown) andRamenEventDispatcherthat materializes aRamenEventinto a payload map regardless of delivery flavor.- Garmin Dart layer (platform channel, device manager, SDK adapter,
error types, all data models —
GarminDevice,GarminConnectionState,GarminRealTimeData,GarminWellnessData,GarminSleepData,GarminActivityData) ships open-source. Only the native Kotlin/Swift wrapper that calls Garmin SDK symbols requires a Garmin license; without it, Garmin methods surfaceGarminSDKError. - BLE Heart Rate Monitor adapter for direct BLE sensor access.
Platform support #
- iOS 16.0+
- Android API 26+ (Android 8.0+)
- Flutter 3.10.0+