HealthSync
A daily snapshot of your Apple Health data,
in a folder you own.
HealthSync reads your Apple Health data on your iPhone and writes one JSON file per day to a destination you choose — a folder on your phone, iCloud Drive, a network share, or your Google Drive. It does this on its own, without you opening it.
Apple Health data exists only on the iPhone. There is no cloud API for it, and nothing on the internet can reach it. So the only way to get a standing export is an app on the phone itself, which is what this is.
What it exports
Everything HealthKit exposes to third-party apps. The list of types is generated from the iOS SDK's own headers rather than hand-picked, so it is the framework's full inventory:
| Category | What that covers |
|---|---|
| 121 quantity types | Steps, distance, active and basal energy, heart rate, HRV, resting and walking heart rate, VO₂ max, blood oxygen, respiratory rate, blood pressure, glucose, body measurements, running, cycling and walking metrics, audio exposure, and the full nutrition set |
| 72 category types | Sleep stages, stand hours, mindful sessions, heart-rate events, reproductive health, and the full symptom list |
| Workouts | Activity type, duration, events, and per-workout statistics |
| Activity summary | The three rings, with their goals |
| ECG | Classification, average heart rate, symptom status |
| State of Mind | Valence, labels, associations (iOS 18+) |
| Characteristics | Date of birth, biological sex, blood type, skin type, wheelchair use |
Every sample keeps its own identifier, start and end time, the app and device
that recorded it, and its metadata. Category values keep the raw number
and gain a readable label, so a sleep stage reads
asleepREM rather than 5.
What a day looks like
{
"schemaVersion": 1,
"day": "2026-09-19",
"timeZoneIdentifier": "America/Los_Angeles",
"summary": {
"HKQuantityTypeIdentifierStepCount": { "unit": "count", "sum": 2094 },
"HKQuantityTypeIdentifierHeartRate": { "unit": "count/min", "average": 82,
"minimum": 48, "maximum": 151 }
},
"activitySummary": { "activeEnergyBurnedKcal": 2032, "exerciseTimeMinutes": 276 },
"categorySamples": {
"HKCategoryTypeIdentifierSleepAnalysis": [
{ "start": "…", "end": "…", "value": 3, "label": "asleepCore" }
]
},
"workouts": [ … ],
"notes": [ ]
}
A few choices worth knowing if you intend to analyse this:
- Daily totals never double-count. The
summaryblock counts each sample in exactly one day — the day it started. - Raw samples include anything overlapping the day, so a sleep block or workout crossing midnight appears in both days it touches. Deduplicate on the sample identifier if you concatenate files.
- Heart rate is BPM. The SDK documents one heart-rate type
in
count/sand the rest incount/min; the app normalises them so a single file never carries the same quantity in two units. - Percent types are fractions, labelled
fraction. HealthKit stores 94% blood oxygen as0.94, and the app leaves the number exactly as HealthKit gave it. - Re-running a day replaces that day's file, so catching up never leaves duplicates behind.
- Anything skipped or truncated is recorded in
notes, so a gap is never silent.
Where it writes
| Destination | What it needs |
|---|---|
| A folder on this iPhone, iCloud Drive, or a network share | Nothing. Pick the folder once and it keeps writing there. |
| Google Drive | Signing in to Google. The app gets access to the files it creates and nothing else in your Drive. |
Google Drive cannot be chosen as a folder. When iOS restricts its file picker to folders, it greys out every cloud provider that has not adopted a newer file-provider API — Drive, OneDrive and others. Apple's documentation says otherwise, but it has behaved this way since iOS 13. Reaching Google Drive therefore means signing in, which is why both routes exist.
How it runs on its own
Two triggers, because neither is reliable alone. iOS launches the app when new Health data arrives, even if the app has been closed; and a scheduled background task in the small hours catches days when nothing new landed.
You choose how often it actually uploads — as data arrives, daily, or weekly. A weekly run writes the whole week's files in one go. If the phone was off, offline, or the run was late, the next one fills the gap; before deciding what to send, the app reads the destination folder to see what is already there.
What it does not do
- Raw ECG waveform is not exported — roughly 15,000 voltage samples per reading. The classification and summary are.
- Clinical records (documents from health providers) are not exported. They need a separate Apple entitlement and are documents rather than daily samples.
- Background timing is not guaranteed. iOS decides when to run background work. The catch-up behaviour means a late run loses nothing.
- It is not on the App Store. HealthSync is a personal tool, built and installed from source.
Privacy, briefly
There is no server, no account and no analytics. Your health data goes from your iPhone to the destination you picked, and nowhere else. The privacy policy says exactly what is read, where it can go, and what the Google sign-in can and cannot see.