Connectors
A connector teaches Open Health Sync one source. Each maps into the same canonical model.
There are two ways data arrives, and a connector can do both.
On-device: your app uploads
The data lives on the phone (HealthKit on iOS, Health Connect on Android). Your app reads it and posts it with a user token. The server never talks to the vendor.
Cloud: the server pulls
The user consents over OAuth, then the server pulls on a schedule and on the provider's notifications. You register your own developer app with the vendor.
Available today
Apple Health
On-device. Your iOS app uploads gzip NDJSON parts. No keys needed, always enabled.
Withings
Cloud. OAuth, scheduled pulls and push notifications. Bring your own developer app.
Oura
Cloud. Sleep, readiness, activity, heart rate and workouts, with optional webhooks.
WHOOP
Cloud. Strain, recovery, sleep stages and workouts, with webhooks.
Strava
Cloud. Activities as workouts, with webhook events.
Polar
Cloud. Exercises, activity, sleep, Nightly Recharge and heart rate, with webhooks.
Fitbit
Cloud, through the Google Health API. Activity, heart rate, HRV, SpO2, sleep, workouts and body, with signed webhooks. Google is not onboarding new projects yet.
Suunto
Cloud, partner program. Workouts, with signed notifications.
Ultrahuman
Cloud, Partnership API. Ring sleep, heart rate, HRV, temperature, steps and M1 glucose.
intervals.icu
Cloud. Activities from Garmin, Wahoo, Zwift, Coros and more, plus daily wellness, with webhooks.
Health Connect
On-device. Your Android app uploads Health Connect records, from any app that writes there.
Dexcom
Cloud. CGM glucose readings, coded as interstitial glucose in FHIR.
OMRON
Cloud, partner API. Blood pressure, pulse, possible AFib flags, weight and body composition.
Something differs from what you see with your account? Open an issue.
Garmin, Coros and more are planned. FreeStyle Libre has no public API; its readings arrive through Health Connect or Apple Health (notes). The sources page has the status, integration path and tracking issue of each one.
Turning a connector on
A device connector needs no keys and is always on. A cloud connector is on when its keys are set:
OHS_<PROVIDER>_CLIENT_ID=...
OHS_<PROVIDER>_CLIENT_SECRET=...Restart, then run ohs doctor: it reports each connector as ok, skip (no keys) or fail
(only some keys), and prints the callback URL to register with the provider,
<OHS_PUBLIC_URL>/oauth/<slug>/callback. GET /v1/providers lists what is enabled on an
instance.
Give the keys to every process that pulls or deletes
The collect role pulls with them, and the etl role uses them to revoke grants when a user
is deleted. If you split roles across processes, set the keys on both.
Build one
Connectors are self-contained packages under connectors/, and need no change to the core.
Start with Write a connector, and pick a
good first issue.