Skip to content

Releases: nrvim/garmin-givemydata

v0.1.9

06 Apr 12:27
8c27382

Choose a tag to compare

Browser Engine: Camoufox → SeleniumBase UC Chrome

The browser engine has been completely replaced. Camoufox (Firefox) and Playwright are gone — replaced with SeleniumBase UC mode (undetected Chrome).

Why: Camoufox caused three separate issues:

  • Session rot over SSH (#11) — Firefox doesn't emit Sec-CH-UA-* client hints, making sessions look suspicious to Garmin's device tracker. Chrome emits these natively.
  • FIT downloads returning 0 files (#18) — Camoufox's fetch() couldn't complete binary downloads. Users confirmed --chrome fixed it.
  • Windows required --chrome flag (#15) — Camoufox didn't work on Windows at all.

What's new

  • Single engine: Chrome via SeleniumBase UC mode — Cloudflare bypass, stable sessions, FIT downloads work
  • Process lifecycle signal handlers — SSH disconnect (SIGHUP) now triggers clean browser shutdown instead of crashing mid-write, preventing profile corruption
  • CSRF token refresh — 30-minute TTL instead of caching forever (stale CSRF caused silent 403s)
  • Clean-exit sentinel — detects unclean shutdown on next launch, auto-recovers
  • Xvfb at 1920x1080 for headless Linux (was 1280x1024)
  • f-string JS injection fix — FIT download URLs are now passed as safe parameters instead of interpolated into JavaScript

Breaking Changes

  • --chrome flag removed (Chrome is now the only engine — flag silently ignored for backwards compat)
  • Dependency changed: playwright + camoufoxseleniumbase
  • No more playwright install chromium step — SeleniumBase auto-downloads chromedriver
  • Google Chrome must be installed on the system

Migration

Delete old browser profile and re-login (one time):

# Git clone
pip install -e .
rm -rf browser_profile/ garmin_session.json

# pip
pip install --upgrade garmin-givemydata
rm -rf ~/.garmin-givemydata/browser_profile ~/.garmin-givemydata/garmin_session.json

# Homebrew
brew upgrade garmin-givemydata
rm -rf ~/.garmin-givemydata/browser_profile ~/.garmin-givemydata/garmin_session.json

v0.1.8

01 Apr 11:33
6da2ee6

Choose a tag to compare

What's New

MCP Server: 6 → 44 tools

  • Training & Performance: CTL/ATL/TSB training load, post-workout recovery signatures, side-by-side period comparison — metrics no other Garmin MCP offers
  • Health Metrics: Dedicated tools for HR, HRV, sleep, stress, body battery, SpO2, steps, floors, calories, respiration, intensity minutes, hydration, blood pressure — each enriched with trend analysis, anomaly detection, and clinical threshold flags
  • Daily Overview: Today's snapshot, weekly summary with goal tracking
  • Profile & Devices: User profile, devices, gear, badges, workouts, goals, challenges, health snapshots, HR zones, activity types
  • Sync: garmin_sync now shows last sync time before syncing, with refresh=False for status-only checks

Security Hardening

  • garmin_query uses SQLite read-only mode (?mode=ro) — writes, ATTACH, and schema changes are impossible at the engine level
  • Query result limit clamped (1–10,000 rows) to prevent memory exhaustion
  • Table identifiers quoted in garmin_schema to prevent injection
  • Sync lock prevents concurrent browser instances
  • Sync timeout enforced with proper executor shutdown
  • Sanitized error messages (no internal paths leaked)

Bug Fixes

  • Fix weight date storage (#13): Weight entries from Garmin Index Scale were stored with raw Unix timestamps instead of proper dates. Fixed timestamp conversion to handle both milliseconds and seconds formats. Users with existing data should delete garmin.db and re-sync.
  • Headless sync: garmin_sync via MCP now runs Camoufox headlessly — no browser window, no Playwright async conflicts

README Reorganized

  • Quick Start is now the first section
  • MCP tools organized by category with collapsible sections
  • Accurate MCP config instructions for pip, brew, and git clone installs

v0.1.7

31 Mar 13:15

Choose a tag to compare

What's new

  • Camoufox browser engine — Default browser engine is now Camoufox (anti-detect Firefox). Bypasses Cloudflare bot detection headlessly. No more --visible needed for login.
  • JSON session cookies — Session cookies saved as portable JSON with ~1 year lifetime. No more constant re-login.
  • Chrome fallback — Use --chrome flag if you prefer Chrome or have issues with Camoufox.
  • Stale session detection — Automatically detects expired sessions and re-authenticates instead of failing silently.
  • Consistent naming — Renamed browser_profile_stealth to browser_profile everywhere.

Upgrading

# pip
pip install --upgrade garmin-givemydata

# Homebrew
brew upgrade garmin-givemydata

# git clone
git pull && pip install -r requirements.txt

After upgrading, delete the old browser profile to start fresh:

rm -rf browser_profile
rm -rf ~/.garmin-givemydata/browser_profile

Fixes

  • Fixes #11 (constantly having to login)

v0.1.6

30 Mar 20:00
cad6f59

Choose a tag to compare

  • Collect saved workouts (100+ workout definitions) and fix scheduled workout capture
  • Auto-check 'Remember Me' on login and 'Remember this browser' on MFA page
  • 48 tables total

v0.1.5

30 Mar 19:06
db88c43

Choose a tag to compare

New feature: --fit-only mode for downloading FIT files without full data sync

garmin-givemydata --fit-only --latest        # download latest FIT file
garmin-givemydata --fit-only --date 2026-03-30  # specific date
garmin-givemydata --fit-only --days 7        # last 7 days

Requested by @dylix in #4.

v0.1.4

30 Mar 14:39

Choose a tag to compare

Public release with security hardening and automated Homebrew updates.