Loading repository data…
Loading repository data…
Wewoc / repository
Secure, local-first archive for Garmin Connect health data (HRV, sleep, Body Battery, activities). Private & offline. Windows desktop app, no setup needed. Structured for local analysis (Excel, HTML dashboards, JSON for Ollama/Open WebUI). Save your data from decay.
↓ Why this exists — the data loss problem that started this
↓ Download — standalone EXE, no setup needed, Windows only
↓ Dashboards — HRV, sleep, Body Battery, stress, intraday timeseries
↓ Bulk Import — recover your full Garmin history from a GDPR export
↓ Local AI setup — data ready for Ollama and Open WebUI
↓ Architecture — pipeline overview, all modules
Platform: Windows · No cloud · No subscription · No Python needed · Standalone EXE
Archive and analyze your Garmin Connect data locally on your machine — create your own backup and save your data from decay — no cloud, no third parties, no subscriptions. Everything runs locally under your control.
Privacy first — inspired by European principles.
I wanted to ask an AI questions about my health data without sending that data to another cloud service. So I built a local alternative instead.
There's a second reason that matters more over time: Garmin silently degrades intraday data resolution. Empirical analysis of archive data (April 2026) shows the threshold at approximately 135 days. Once full resolution is lost, it's gone permanently. This tool exists to capture it while it's still available.
What "intraday resolution" actually means in practice:
| Metric | API resolution | Data points / day |
|---|---|---|
| Heart Rate | ~1 minute | up to 1,440 |
| Stress | ~3 minutes | up to 480 |
| Body Battery | ~15 minutes | up to 96 |
| SpO2 | ~1 hour | up to 24 |
| Respiration | variable | variable |
After ~135 days, Garmin stops serving this data entirely. The daily summary (resting HR, average stress, etc.) remains — but the curves, the detail, the full timeline: gone. GLA captures it while it's still there.
→ For the full story, see MINDSET.md.
This project is as much a statement as it is a tool.
This is not a data export script — it maintains a complete, consistent local copy of your Garmin data over time. Your data stays in open formats, readable and analyzable with any tool you choose. Local AI, cloud AI, or no AI at all. Your data, your call.
| Feature | Garmin Connect | Cloud-AI Bridges | Garmin Local Archive |
|---|---|---|---|
| Data storage | Garmin servers (USA) | US AI servers | Your machine |
| Privacy risk | Medium | High (training data risk) | Minimal |
| Access | Online only | Requires subscription | 100% offline |
| History | Erodes over time | Depends on source | Permanent local copy |
| Version | Description | Requires |
|---|---|---|
| Garmin_Local_Archive_Standalone.zip | Recommended — no setup needed | Nothing |
| Garmin_Local_Archive.zip | Standard version | Python 3.10+ |
No install, no terminal. Download, unzip, run.
Standard version: install dependencies first — pip install -r requirements.txt.
What this is not: Garmin Connect is still required — the app pulls data from there via API.
A note on cloud folders: the archive itself is stored as plaintext on disk — if garmin_data/ lives inside a cloud-synced folder, that data gets uploaded automatically. See SECURITY.md for details and the encrypted Mirror alternative. This tool does not replace Connect, the Garmin app, or your device sync. It has no cloud component, no remote access, and no sharing features. The GUI and EXE are Windows-only.
The app works in two modes: live sync pulls recent data directly from Garmin Connect via API; Bulk Import loads your complete history from a Garmin GDPR export ZIP — this is the primary path for recovering years of data that the API no longer serves.
Everything is stored locally in structured formats (JSON, Excel, HTML dashboards). Once downloaded, nothing is transmitted anywhere.
The built-in dashboards cover roughly 90% of what most users are looking for — without any AI at all. For deeper analysis, your data is prepared in a format any local AI can work with directly.
| Dashboard | What it shows | Output |
|---|---|---|
| Health Analysis | HRV, Resting HR, SpO2, Sleep, Body Battery, Stress — daily values vs 90-day personal baseline vs age/fitness-adjusted reference ranges. Flags days outside range. | HTML, Mobile HTML, JSON + AI prompt |
| Timeseries | Intraday heart rate, stress, SpO2, body battery and respiration as zoomable charts across any date range. | HTML, Excel |
| Heatmap | Six intraday metrics (Heart Rate, Steps, Stress, Body Battery, SpO2, Respiration) as time-of-day × date grids — spot daily rhythms and irregularities at a glance. | HTML |
| Daily Overview | All summary fields in one flat table, one row per day. | Excel |
| Health + Context | Garmin health metrics alongside local weather and pollen data. | HTML, Excel |
| Sleep Dashboard | One row per night — segmented phase bar (Deep / Light / REM / Awake), sleep duration, score, quality badge, feedback label, HRV, Body Battery, and 7-day HRV moving average (computed from archive, no extra API call). Color-coded numbers via continuous gradient against personal reference ranges. Inspired by Garmin's own HRV pattern guide. | HTML, Excel |
| Sleep & Recovery | HRV, Body Battery, Sleep duration and phase breakdown (Deep / Light / REM / Awake) alongside weather and pollen context. Intraday detail per day. | HTML |
| Explorer | Free metric exploration — choose up to 4 metrics from all Garmin daily fields plus weather, pollen, and air quality on a shared time axis. Sleep phase breakdown and sleep quality log included. Built-in field descriptions and air quality interpretation guide. | HTML |
| Custom Dashboard | Pick any combination of Garmin daily fields and Context fields, set a date range, and build a one-off dashboard — no fixed field list, no specialist file written to disk. Field selections can be saved as named presets for reuse. Optional AES-256 encryption for the HTML output. | HTML, Excel |
Live Tracking (v1.6.5) — a separate, always-current view: today's progression (Body Battery, Heart Rate, Steps, Stress) plus last night's sleep summary, refreshed automatically after every sync and on demand via an "Update Live" button in the Home tab. Not part of the Create Reports selection above — it has its own trigger, by design.
The AI itself is not included. How to set one up — including a ready-to-use system prompt for health data analysis — is explained in the local AI guide below.
I can't write Python. The architecture, module boundaries, and decisions are mine. Every line of code is Claude's.
→ How this collaboration actually worked — who had which idea, where Claude was wrong — is documented in MINDSET.md.
GNU General Public License v3.0 — provided as-is.
The GDPR export from Garmin contains your complete daily history — but in our testing, no intraday data was found (no heart rate curves, no stress timelines, no body battery graphs). That resolution appears to be available only through the API, and only for recent days (see above).
The Bulk Import feature fills in the rest: request your full data export from Garmin (typically ready in 20–30 minutes), point the app at the ZIP, and your complete daily history lands in the local archive — in the same format as live API data. Days already present with good quality are skipped automatically.
Local-first, personal use, no enterprise ambitions.
This project is built for my own use. If it happens to be useful to others, feel free to use it — but evaluate it like any other unverified open-source tool.
Garmi