Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Queries Apple Health data stored in a local SQLite database. Use this skill to read heart rate, steps, SpO2, VO2 Max, sleep, workouts, resting heart rate, HR...
Queries Apple Health data stored in a local SQLite database. Use this skill to read heart rate, steps, SpO2, VO2 Max, sleep, workouts, resting heart rate, HR...
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
# macOS and Linux (recommended) curl -fsSL https://healthsync.sidv.dev/install | bash # Or via Go go install github.com/BRO3886/healthsync@latest After installing the binary, parse your Apple Health export: # Export from Health app → profile picture → Export All Health Data healthsync parse ~/Downloads/export.zip Install this skill into your agent: # Claude Code or Codex healthsync skills install # OpenClaw healthsync skills install --agent openclaw Query Apple Health export data stored in a local SQLite database. This skill is read-only — never INSERT, UPDATE, DELETE, or DROP anything.
READ ONLY — You must NEVER write to the database. No INSERT, UPDATE, DELETE, DROP, ALTER, or any write operations. Two query methods: CLI (healthsync query) or direct SQLite (sqlite3 ~/.healthsync/healthsync.db) Prefer CLI for simple queries. Use direct SQLite for complex aggregations, joins, or custom SQL.
Default: ~/.healthsync/healthsync.db
# Recent heart rate readings healthsync query heart-rate --limit 10 # Steps in a date range healthsync query steps --from 2024-01-01 --to 2024-06-30 --limit 100 # Deduplicated daily step totals healthsync query steps --total --from 2024-01-01 # Deduplicated daily active energy totals healthsync query active-energy --total --from 2024-01-01 # Workouts as JSON healthsync query workouts --format json --limit 20 # Sleep data as CSV healthsync query sleep --format csv --limit 50 # Resting heart rate trend healthsync query resting-heart-rate --limit 30 # HRV readings healthsync query hrv --limit 30 # Blood pressure healthsync query blood-pressure --limit 20 # Body weight trend healthsync query body-mass --limit 30 # Direct SQLite for aggregations sqlite3 ~/.healthsync/healthsync.db "SELECT date(start_date) as day, SUM(value) as total_steps FROM steps GROUP BY day ORDER BY day DESC LIMIT 7" # Average resting heart rate per week sqlite3 ~/.healthsync/healthsync.db "SELECT strftime('%Y-W%W', start_date) as week, ROUND(AVG(value),1) as avg_rhr FROM resting_heart_rate GROUP BY week ORDER BY week DESC LIMIT 12"
FlagDescriptionDefault--fromFilter records from this date (inclusive)—--toFilter records to this date (inclusive)—--limitMaximum records to return50--formatOutput format: table, json, csvtable--totalDeduplicated daily totals (steps, active-energy, basal-energy only)false--dbOverride database path~/.healthsync/healthsync.db
Cardiac CLI NameDB TableNotesheart-rateheart_rateBPM; high-frequencyresting-heart-rateresting_heart_rateDaily RHRhrvhrvHRV SDNN (ms); nightlyheart-rate-recoveryheart_rate_recoveryPost-exercise HR recoveryrespiratory-raterespiratory_rateBreaths/minblood-pressureblood_pressurePaired systolic + diastolic (mmHg) Activity / Energy CLI NameDB TableNotesstepsstepsSupports --totalactive-energyactive_energykcal; supports --totalbasal-energybasal_energykcal; supports --totalexercise-timeexercise_timeMinutesstand-timestand_timeMinutesflights-climbedflights_climbedCountdistance-walking-runningdistance_walking_runningkm/midistance-cyclingdistance_cyclingkm/mi Body CLI NameDB TableNotesbody-massbody_masskg/lbbmibody_mass_indexheightheightm/ft Mobility / Walking CLI NameDB TableNoteswalking-speedwalking_speedm/swalking-step-lengthwalking_step_lengthmwalking-asymmetrywalking_asymmetry%walking-double-supportwalking_double_support%walking-steadinesswalking_steadinessScorestair-ascent-speedstair_ascent_speedft/sstair-descent-speedstair_descent_speedft/ssix-minute-walksix_minute_walkm Running CLI NameDB TableNotesrunning-speedrunning_speedm/srunning-powerrunning_powerWrunning-stride-lengthrunning_stride_lengthmrunning-ground-contact-timerunning_ground_contact_timemsrunning-vertical-oscillationrunning_vertical_oscillationcm Other CLI NameDB TableNotesspo2spo20-1 fraction (0.98 = 98%)vo2maxvo2_maxmL/min·kgsleepsleepSleep stages (category, no unit)workoutsworkoutsduration, distance, energywrist-temperaturewrist_temperature°C deviationtime-in-daylighttime_in_daylightMinutesdietary-waterdietary_watermL/Lphysical-effortphysical_effortMET scorewalking-heart-ratewalking_heart_rateBPM while walkingmindful-sessionsmindful_sessionsCategory; no unit columnstand-hoursstand_hoursCategory; no unit column
Parse an Apple Health export into the database. (Informational — do not run unless the user asks.) FlagDescriptionDefault-vVerbose logging with progress ratefalse--dbOverride database path~/.healthsync/healthsync.db
Start HTTP server for receiving uploads. (Informational — do not start unless the user asks.) Endpoints: POST /api/upload — Upload .zip or .xml (multipart form, field: file). Returns 202, parses async. GET /api/upload/status — Poll parse progress. GET /api/health/{table}?from=&to=&limit= — Query data as JSON.
Schema: id, source_name, start_date, end_date, value REAL, unit TEXT, created_at Applies to all tables except blood_pressure, sleep, mindful_sessions, stand_hours, and workouts. CREATE TABLE resting_heart_rate ( id INTEGER PRIMARY KEY AUTOINCREMENT, source_name TEXT NOT NULL, start_date TEXT NOT NULL, end_date TEXT NOT NULL, value REAL NOT NULL, unit TEXT NOT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, UNIQUE(source_name, start_date, end_date, value) );
CREATE TABLE blood_pressure ( id INTEGER PRIMARY KEY AUTOINCREMENT, source_name TEXT NOT NULL, start_date TEXT NOT NULL, end_date TEXT NOT NULL, systolic REAL NOT NULL, -- mmHg diastolic REAL NOT NULL, -- mmHg unit TEXT NOT NULL, -- "mmHg" created_at TEXT DEFAULT CURRENT_TIMESTAMP, UNIQUE(source_name, start_date, end_date, systolic, diastolic) );
Applies to: sleep, mindful_sessions, stand_hours CREATE TABLE sleep ( id INTEGER PRIMARY KEY AUTOINCREMENT, source_name TEXT NOT NULL, start_date TEXT NOT NULL, end_date TEXT NOT NULL, value TEXT NOT NULL, -- e.g. HKCategoryValueSleepAnalysisAsleepCore created_at TEXT DEFAULT CURRENT_TIMESTAMP, UNIQUE(source_name, start_date, end_date, value) );
CREATE TABLE workouts ( id INTEGER PRIMARY KEY AUTOINCREMENT, activity_type TEXT NOT NULL, source_name TEXT NOT NULL, start_date TEXT NOT NULL, end_date TEXT NOT NULL, duration REAL, duration_unit TEXT, total_distance REAL, total_distance_unit TEXT, total_energy_burned REAL, total_energy_burned_unit TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP, UNIQUE(activity_type, start_date, end_date, source_name) );
All dates stored as text: 2024-01-15 08:30:00 +0530. Filter with date prefix — 2024-01-01 works via SQLite string comparison.
ValueMeaningHKCategoryValueSleepAnalysisInBedIn bedHKCategoryValueSleepAnalysisAsleepCoreCore sleepHKCategoryValueSleepAnalysisAsleepDeepDeep sleepHKCategoryValueSleepAnalysisAsleepREMREM sleepHKCategoryValueSleepAnalysisAwakeAwakeHKCategoryValueSleepAnalysisAsleepUnspecifiedUnspecified
healthsync query steps --total --from 2024-01-01
healthsync query active-energy --total --from 2024-01-01
SELECT strftime('%Y-W%W', start_date) as week, ROUND(AVG(value), 1) as avg_rhr FROM resting_heart_rate GROUP BY week ORDER BY week DESC LIMIT 12;
SELECT date(start_date) as day, ROUND(AVG(value), 1) as hrv_ms FROM hrv GROUP BY day ORDER BY day DESC LIMIT 30;
SELECT date(start_date) as day, ROUND(AVG(systolic), 1) as avg_sys, ROUND(AVG(diastolic), 1) as avg_dia FROM blood_pressure GROUP BY day ORDER BY day DESC LIMIT 30;
SELECT date(start_date) as day, value as kg FROM body_mass ORDER BY day DESC LIMIT 30;
SELECT date(start_date) as night, ROUND(SUM((julianday(end_date) - julianday(start_date)) * 24), 1) as hours FROM sleep WHERE value LIKE '%Asleep%' GROUP BY night ORDER BY night DESC LIMIT 14;
SELECT date(start_date) as day, ROUND(AVG(value), 1) as avg_hr, MIN(value) as min_hr, MAX(value) as max_hr FROM heart_rate GROUP BY day ORDER BY day DESC LIMIT 30;
SELECT activity_type, COUNT(*) as count, ROUND(AVG(duration), 1) as avg_min, ROUND(SUM(total_energy_burned)) as total_kcal FROM workouts GROUP BY activity_type ORDER BY count DESC;
SELECT strftime('%Y-W%W', start_date) as week, ROUND(AVG(value), 2) as avg_vo2 FROM vo2_max GROUP BY week ORDER BY week DESC LIMIT 12;
SELECT strftime('%Y-W%W', start_date) as week, ROUND(SUM((julianday(end_date) - julianday(start_date)) * 1440), 0) as minutes FROM mindful_sessions GROUP BY week ORDER BY week DESC LIMIT 12;
Read-only — This skill must never write to the database No real-time data — Data is only as fresh as the last healthsync parse run Date filtering is string-based — Timezone offsets are part of the stored date string SpO2 values are fractions — 0.98 means 98%, not 98 Blood pressure is paired — systolic and diastolic are stored together in one row per measurement Category tables have no unit column — sleep, mindful_sessions, stand_hours store text values, not numeric
Data access, storage, extraction, analysis, reporting, and insight generation.
Largest current source with strong distribution and engagement signals.