Introduction
Health data from devices and apps, in one clean model. Self-hosted, free, one Go binary plus Postgres.
Open Health Sync (ohs) is a self-hosted ingestion and normalization layer for health data. It
pulls from providers, accepts uploads from phones, stores each payload verbatim, maps it to one
canonical model with one set of units, and serves it over a REST API and a read-only MCP server.
Your iOS app uploads gzip NDJSON parts.
OAuth pulls and push notifications.
Every payload kept verbatim, on disk or S3, never rewritten.
Map, convert units, validate, de-duplicate, roll up local days.
One canonical model, scoped by tenant and user.
Described by OpenAPI 3.1.
Read only, for AI agents.
It stops at clean, traceable data. It is not a dashboard, a coaching app or a medical device: scores, insights and products belong in what you build on top.
Quickstart
Run an instance, upload a heart rate reading and read it back, in under five minutes.
Learn by building
Seven short projects on your own data: a sleep report, an HRV trend, an AI assistant, a dashboard.
Self-host it
Docker Compose, a Raspberry Pi 5, an S3 bucket or a single binary.
Connect sources
Apple Health, Withings, Oura, WHOOP, Strava, Polar, Fitbit, Suunto, Ultrahuman and intervals.icu today.
API reference
Every route, generated from the OpenAPI 3.1 file that leads the code.
Give it to an AI agent
A read-only MCP server, with a token that can only read one person's data.
Hosted platform
A managed instance for developers who would rather not run one. Planned.
Why it exists
Every health source speaks its own dialect. Apple Health sends one JSON line per HealthKit
sample, heart rate in count/min, oxygen saturation as a fraction. Withings sends a daily
activity object keyed by date, and intraday series keyed by Unix epoch. Each one has its own idea
of a day, a device and a duplicate.
So teams write a script per provider: a parser, a table, a cron job. It works until the second provider, the first re-sent upload, the first mapper bug that needs a backfill, or the first person who asks you to delete everything you hold about them. Open Health Sync is that layer, written once, with the boring parts done properly.
| A script per provider | Open Health Sync | |
|---|---|---|
| Add a source | a new parser, new tables, a new cron job | a connector that maps into the same model |
| Units | whatever each API sends | one unit per quantity, the original kept in metadata |
| "Today" | UTC, or the provider's clock | the local calendar day of the record's time zone |
| A re-sent upload | stored twice | answered 200 with "duplicate": true |
| Raw payloads | parsed, then thrown away | kept verbatim, so a user can be re-processed after a fix |
| Is it done? | guess, or read the logs | GET /coverage: pending, parked and rejected counts |
| Provider OAuth tokens | a plain column | sealed with AES-256-GCM |
| Delete a user | grep across tables and buckets | DELETE /v1/users/{id}, then poll the job |
What ships today
Available Sources: Apple Health through your iOS app or a Health app export, and Withings, Oura, WHOOP, Strava, Polar, Fitbit, Suunto, Ultrahuman and intervals.icu over OAuth.
Available Outputs: the REST API, the read-only MCP server and a FHIR R4 export.
Planned Next: more connectors, more standard outputs (Open mHealth, exports, webhooks, client SDKs), then health records (EHR) through SMART on FHIR. The sources page tracks each one.
Early preview
Releases are 0.x: the API, the configuration and the schema may change in any of them. Read the changelog before you upgrade.
Who sees the data
Only whoever runs the instance. Open Health Sync is software you run, with no account to create, no analytics and no call home. The server talks to the providers you enable and to your own database and raw store. Logs never contain tokens, keys or health values.
No software is compliant on its own, and Open Health Sync is not certified, audited or covered
by a business associate agreement. What it gives you: data stays on infrastructure you choose,
DELETE /v1/users/{id} is a hard delete of raw files and rows, OHS_RETENTION_DAYS enforces a
retention period, every query is scoped to a tenant and a user, keys and tokens are stored
hashed, and provider OAuth tokens are encrypted. Health records themselves are not encrypted
by ohs: use disk or database encryption, TLS in front of the API, and your own access
controls.
Nothing. The server is free and open source. You pay for wherever you run it, which can be a Raspberry Pi 5 with 4 GB. Cloud providers such as Withings need your own developer application, registered with them.
So the layer stays open. Anyone can run, study and change it; if you run a modified Open Health Sync as a network service, you publish your changes under the same license. The client SDKs are AGPL-3.0 too. An app that only talks to an unmodified server over its API is not a derivative of it.
Yes. A company can run it, modified or not, to power its own product. The AGPL only asks that users who interact with a modified server over the network can get its source. This is not legal advice: read the license or ask your counsel.
No. It moves and normalizes data. It does not diagnose, score or advise, and it is not clinical software.