fcandi1k downloadsSync Garmin Connect health data into your Daily Notes as frontmatter properties.
English · Deutsch · 中文 · 日本語 · Español · Français
Sync steps, sleep, heart rate, stress, activities and more from Garmin Connect into Obsidian Daily Notes — as frontmatter properties you can query with Dataview.
Desktop only. This plugin uses Electron's BrowserWindow for Garmin Connect authentication and does not work on mobile.
Note: This plugin uses Garmin Connect's internal web API through an Electron browser session — there is no official third-party API available.
Journal/2024-07/), and creates date-based subfolders when the filename format contains / (e.g. YYYY/YYYY-MM-DD → Journal/2026/2026-08-04.md)trainings field for advanced Dataview queriesohs_ prefix to all frontmatter properties to avoid naming conflicts with other plugins---
steps: 15185
resting_hr: 69
sleep_score: 81
sleep_duration: 7h 43min
hrv: 39
stress: 30
vo2_max: 48
workout_location: Bad Honnef, Germany
---
Body battery: body_battery is Garmin's charged value, the sum of all body battery gains over the day (mostly the overnight recharge), not the current level. Enable body_battery_min and body_battery_max for the lowest and highest level of the day, which is what the Garmin app shows in its history.
Each workout is written as a frontmatter key with a summary string:
---
hiking: 8.2 km · 157min · Ø105 bpm · 696 kcal
e_bike: 22.1 km · 65min · Ø112 bpm · 420 kcal
---
Only days with actual workouts get activity keys. The plugin never touches your note content — it only adds or updates frontmatter properties.
Enable "Machine-readable trainings" in settings to add a structured trainings field for Dataview queries:
---
trainings:
- type: hiking
category: outdoor
distance_km: 8.2
duration_min: 157
avg_hr: 105
calories: 696
- type: e_bike
category: cycling
distance_km: 22.1
duration_min: 65
avg_hr: 112
calories: 420
---
main.js and manifest.json from the latest release.obsidian/plugins/garmin-health-sync/ in your vaultThe daily notes path is the folder, the daily note format is the filename in moment.js syntax — the same convention as the core Daily Notes plugin. The format itself may contain / to nest notes into date-based subfolders, and square brackets keep text literal:
| Path | Format | Result |
|---|---|---|
Journal |
YYYY-MM-DD |
Journal/2026-08-04.md |
Journal |
YYYY/YYYY-MM-DD |
Journal/2026/2026-08-04.md |
Journal |
YYYY/YYYY-MM/YYYY-MM-DD |
Journal/2026/2026-08/2026-08-04.md |
Journal |
YYYY-MM-DD [Workout] |
Journal/2026-08-04 Workout.md |
Missing subfolders are created automatically.
On every Obsidian startup, the plugin checks the last 7 days and fills in any missing health data automatically. No action needed. By default it creates a daily note when one is missing.
If another tool owns your daily notes (Templater, the Calendar plugin, an external sync), turn off Create daily note when missing in the settings. Auto-sync then waits until a real (non-empty) daily note exists and syncs the moment it appears — empty 0-byte placeholders are ignored. Manual sync and backfill always create missing notes regardless of this setting.
Open a Daily Note and run Garmin Health Sync: Sync current note from the Command Palette (Cmd/Ctrl+P).
Have years of Garmin data? You can bulk-sync any date range:
Garmin's typeKey values are normalized to cleaner canonical keys:
| Provider Key | Canonical Key | Category |
|---|---|---|
e_bike_fitness |
e_bike |
cycling |
e_bike_mountain |
e_mtb |
cycling |
resort_skiing_snowboarding |
skiing |
winter |
backcountry_skiing_snowboarding |
backcountry_skiing |
winter |
stand_up_paddleboarding |
sup |
water |
fitness_equipment |
gym_equipment |
gym |
All other Garmin keys pass through unchanged (e.g. hiking, running, cycling, swimming, strength_training, yoga, ...).
Each activity is assigned a category:
| Category | Examples |
|---|---|
cycling |
cycling, e_bike, e_mtb, mountain_biking, indoor_cycling, road_biking |
running |
running, trail_running, treadmill, ultra_run |
walking |
walking, indoor_walking |
outdoor |
hiking, mountaineering, rock_climbing, bouldering |
swimming |
swimming, pool_swimming, open_water_swimming |
winter |
skiing, backcountry_skiing, cross_country_skiing, snowboarding |
water |
sup, rowing, kayaking, surfing, sailing |
gym |
strength_training, gym_equipment, elliptical, yoga, pilates, hiit |
racket |
tennis, badminton, squash, table_tennis, pickleball |
team |
soccer, basketball, volleyball, rugby |
other |
golf, meditation, multi_sport |
This plugin makes network requests to two external services:
nominatim.openstreetmap.org for reverse geocoding. You can disable this in settings under Workout location.No data is sent to any other server.
Clipboard: The Sign in via browser login reads the clipboard once — and only when you click Sign in from clipboard — to pick up the one-time login ticket you copied from your browser. It writes to the clipboard only when you click to copy the sign-in link. The clipboard is never accessed in the background.
npm install
npm run dev # watch mode
npm run build # production build