Skip to content

Your Apple Health data, delivered where you choose

Health Data Relay reads Apple Health on your iPhone and sends it to destinations you choose, such as your own server, MQTT, email or a file. Every changed day can be re-sent whole, deletions included, in an open, documented schema or any format you write.
A pipeline card: its parts, up to date, and a Run button
Each pipeline is a card you can run
A scheduled pipeline card counting down to its next run
Or give it a schedule and watch the countdown
A pipeline's detail screen: its format, destination and trigger, and a passing connection test
Any HTTP endpoint, tested in one tap
A pipeline's delivery log: each batch of days with the receiver's answer
Each delivery with the receiver’s answer

Apple Health has no cloud API. The only way your data leaves the phone is through an app on the phone, and the existing options pre-aggregate it, change their payload between versions, or sync when they feel like it. Health Data Relay does one job and does it exactly.

Exact, incremental sync

Bookmarks on every Health type find exactly the days that changed. Each one is sent whole, every type and source, so your receiver ends up with what the phone has, edits and deletions included.

One open schema

A single documented JSON format in Apple Health’s own terms, versioned by name. If you read export.xml today, you already know it. Read the schema. Need another shape? Templates write JSON, CSV, Markdown, GPX or your own format.

Destinations you choose

Any HTTP endpoint with an optional bearer token and headers, or, with a template, MQTT, email, your calendar, a folder or the share sheet. Each pipeline keeps its own place; one failing never holds up another.

Private by design

No account, no backend, no analytics. Data goes only to your destinations and the tools you turn on, and tokens live in the Keychain.

Runs when you say

Each pipeline runs when you tap Run, on a schedule, at a set time, or when Health records something. Unsent batches stay on disk and retry with backoff.

Per-source detail

Daily statistics per source (Watch, iPhone, scale, apps) plus the raw samples where they matter: sleep stages, blood pressure, workouts with routes, ECG traces.

1. Health changesA watch sync, a weigh-in, last night’s sleep.
2. Days markedThe days that gained samples, plus today and yesterday.
3. Read wholeEvery type and source for each of those days.
4. DeliveredJSON batches to each destination, kept until accepted.

Write a receiver in an afternoon: accept a POST, check a token, store the days, answer 200. Writing a receiver has the rules, and the repository includes a reference receiver and canonical fixtures to test against.

Every pipeline keeps a log of its deliveries with the receiver’s answer, and Data by type shows which Health types had data in the last 30 days, so a permission switched off in Settings is easy to spot.

Data by type: each Health type with when it last had data
Which types are arriving, at a glance