MetricPull
A simple, free Apple Health export utility
- Privacy: All processing on-device. Read-only HealthKit access. No accounts, no analytics, no tracking.
the problem
Apple Health collects a wealth of data, but getting it out in a usable format is painful. The native export dumps everything into a massive XML file. Third-party apps either overwhelm you with features you don't need, or produce messy output that requires cleanup before you can actually use it.
the solution
A simple, free utility that lets you build exactly the export you want. Pick your metrics, pick your date format, get a clean CSV. No subscriptions, no premium tiers, no features you'll never use.
You tell the app what you want. It gives you exactly that.
how it works
The app has two main screens accessible via a segmented toggle at the bottom:
- Export — build and export CSV files from Health data
- Quick Metrics — at-a-glance dashboard with charts and stat cards for any health metric
export
built-in presets
Six ready-to-use export templates:
| Preset | Columns Included |
|---|---|
| Weight Tracker | date, weight |
| Daily Activity | date, steps, active_calories, distance |
| Heart Health | date, resting_hr, hrv, walking_hr_avg |
| Sleep Analysis | date, sleep_hours, time_in_bed, rem_sleep, deep_sleep, core_sleep |
| Full Dashboard | date, weight, steps, resting_hr, sleep_hours, active_calories |
| AI Weight Coach Export | date, weight, active_calories, steps, sleep_hours |
Each preset opens the export configuration screen where users can adjust settings before exporting.
custom export builder
Build a completely custom export by selecting any combination of the 25 supported health metrics:
- Metric selection — metrics organized by category (Body, Activity, Heart, Sleep, Vitals) with collapsible sections and selection count badges
- Column ordering — drag-to-reorder when 2+ metrics are selected
- Save as preset — save any custom configuration for one-tap reuse, with a confirmation overlay on save
configuration options
All exports (preset or custom) support the following:
- Last 7 Days
- Last 14 Days
- Last 30 Days
- Last 60 Days
- Last 90 Days
- Year to Date
- All Time (starts from earliest available data; empty rows are suppressed)
- Custom (manual start/end date pickers)
The selected date range is saved with user presets so it persists correctly on reload.
- MM/DD/YYYY
- YYYY-MM-DD
- DD/MM/YYYY
- DD-MM-YYYY
- Imperial (lbs, miles, °F)
- Metric (kg, km, °C)
- Daily — one row per day (default)
- Weekly — one row per calendar week
- Monthly — one row per calendar month
When aggregation is weekly or monthly, a footer explains: “Values like weight and heart rate are averaged per week/month. Values like steps and calories are summed.”
Weekly options:
- Start date
- Date range (e.g., “01/06 – 01/12/2026”)
- Week number (e.g., “Week 2, 2026”)
Monthly options:
- Start date
- Month name (e.g., “Jan 2026”)
- Year-month (e.g., “2026-01”)
preview before export
Load a preview showing the CSV header plus 5 data rows before exporting. The preview auto-clears whenever any configuration setting changes, so you always see current output.
export and share
One tap to generate. The iOS share sheet lets you save to Files, AirDrop, email, save to iCloud Drive, or share to any app that accepts files. Everything happens on-device — your health data never leaves your phone.
saved presets
- User presets appear in a “My Presets” section at the top of the Export screen
- Swipe-to-delete on saved presets
- Presets store the full configuration: metrics, date range, date format, units, aggregation, date label style, and column order
empty row handling
CSV export skips rows where every metric value is empty. This prevents exports from containing thousands of blank rows when “All Time” is selected but data only exists for recent periods. Rows with partial data (e.g., weight recorded but not steps) are still included — only fully empty rows are skipped.
example output
| date | weight |
|---|---|
| 01/01/2026 | 173.5 |
| 01/02/2026 | 172.4 |
| 01/03/2026 | 172.9 |
| 01/04/2026 | 171.8 |
| 01/05/2026 | 171.4 |
Clean output: one row per day, proper formatting, empty cells for missing data—imports directly into Excel, Numbers, Google Sheets, Python, or R. Designed to paste directly into AI conversations for health analysis.
quick metrics
A dedicated dashboard for viewing at-a-glance insights about any health metric.
- Horizontally scrollable category pills at the top: Body, Activity, Heart, Sleep, Vitals
- Tapping a category expands a list of metrics in that category
- Tapping a metric selects it and loads its stats; selected metric shows a checkmark
Segmented picker (lbs/kg) in the top-right toolbar. Toggles between Imperial and Metric for all values on screen.
- Line chart built with Swift Charts
- Blue line with circle markers showing daily values
- Gray line showing 7-day rolling average overlay
- Toggle between 7-day and 30-day chart views
- Displayed in a rounded card
- This Week vs Last Week — rolling 7-day windows (not calendar weeks). “Last week” = 8–14 days ago, “this week” = last 7 days. Shows both averages with date ranges and a delta arrow (green if favorable, red if unfavorable, direction per-metric). Last week on left, this week on right.
- 7-Day Average — rolling average of the last 7 days
- 30-Day Average — rolling average of the last 30 days
- Min / Max (Last 7 Days) — minimum and maximum values with the dates they occurred
- Trend — compares 7-day average to 30-day average using absolute per-metric thresholds. Shows “Trending down over 30 days”, “Trending up over 30 days”, or “Stable over 30 days” with a colored arrow.
For sum-based metrics (steps, active calories, resting calories, distance, flights climbed, exercise minutes, stand hours), today’s incomplete data is excluded from all calculations — date windows shift back by one day so only complete days are used. Average-based metrics (weight, heart rate, etc.) include today since a single reading is still valid.
supported health metrics (25 total)
Body
| Metric | CSV Column | Aggregation |
|---|---|---|
| Weight | weight |
Average |
| Body Fat % | body_fat_pct |
Average |
| BMI | bmi |
Average |
| Lean Body Mass | lean_body_mass |
Average |
Activity
| Metric | CSV Column | Aggregation |
|---|---|---|
| Steps | steps |
Sum |
| Distance (Walk/Run) | distance |
Sum |
| Flights Climbed | flights_climbed |
Sum |
| Active Calories | active_calories |
Sum |
| Resting Calories | resting_calories |
Sum |
| Exercise Minutes | exercise_minutes |
Sum |
| Stand Hours | stand_hours |
Sum |
Heart
| Metric | CSV Column | Aggregation |
|---|---|---|
| Resting Heart Rate | resting_hr |
Average |
| Walking HR Average | walking_hr_avg |
Average |
| Heart Rate Variability (HRV) | hrv |
Average |
| Cardio Fitness (VO2 Max) | vo2_max |
Average |
Sleep
| Metric | CSV Column | Aggregation |
|---|---|---|
| Time Asleep | sleep_hours |
Total |
| Time in Bed | time_in_bed |
Total |
| REM Sleep | rem_sleep |
Total |
| Deep Sleep | deep_sleep |
Total |
| Core Sleep | core_sleep |
Total |
Sleep metrics use HKCategoryType. Overnight sessions are attributed to the correct calendar date — sessions starting after 6 PM are attributed to the following day.
Vitals
| Metric | CSV Column | Aggregation |
|---|---|---|
| Blood Pressure (Systolic) | bp_systolic |
Average |
| Blood Pressure (Diastolic) | bp_diastolic |
Average |
| Blood Oxygen | blood_oxygen |
Average |
| Respiratory Rate | respiratory_rate |
Average |
| Body Temperature | body_temperature |
Average |
unit conversions
| Metric | HealthKit Unit | Imperial | Metric |
|---|---|---|---|
| Weight, Lean Body Mass | kg | lbs (×2.20462) | kg |
| Distance | meters | miles (÷1609.344) | km (÷1000) |
| Body Temperature | °C | °F (×9/5 + 32) | °C |
| Stand Hours | minutes | hours (÷60) | hours (÷60) |
All other metrics display in their native HealthKit units regardless of unit preference.