{"skill":{"slug":"garmin-connect-pro","displayName":"Garmin Connect Pro","summary":"Want to be fit like @steipete? Well, now you can track every step of your journey—literally. This skill pulls your complete Garmin Connect data into OpenClaw...","description":"---\nname: garmin-connect-pro\nversion: 1.4.0\ndescription: |\n  Want to be fit like @steipete? Well, now you can track every step of your journey—literally. This skill pulls your complete Garmin Connect data into OpenClaw: activities, sleep, heart rate, stress, body battery, training readiness, VO2 max, and those race predictions you keep ignoring. Works with Fenix, Forerunner, Index scales, and anything else Garmin throws at you. Includes natural language queries (\"how did I sleep?\"), ASCII charts, week-over-week comparisons, and FIT/GPX downloads.\nmetadata:\n  openclaw:\n    emoji: \"⌚\"\n    requires:\n      bins: [python3]\n      pips: [garminconnect>=0.2.38]\n    config:\n      environment:\n        GARMIN_EMAIL:\n          description: Garmin Connect email (RECOMMENDED - more secure than file)\n          required: false\n          secret: true\n        GARMIN_PASSWORD:\n          description: Garmin Connect password (RECOMMENDED - more secure than file)\n          required: false\n          secret: true\n      files:\n        - path: ~/.config/garmin-connect/credentials.json\n          description: \"Fallback: Credentials file if env vars not set. WARNING: Plaintext - use env vars instead.\"\n          required: false\n          permissions: \"600\"\n          containsSecrets: true\n        - path: ~/.config/garmin-connect/tokens/\n          description: OAuth tokens (auto-generated after login, 600 permissions)\n          required: false\n          containsSecrets: true\n    security:\n      - \"CREDENTIAL PRIORITY: Environment variables > Credentials file > macOS Keychain (if configured)\"\n      - \"RECOMMENDED: Use GARMIN_EMAIL/GARMIN_PASSWORD env vars - not stored on disk, survives reboots with launchd/keychain\"\n      - \"FALLBACK: Credentials file at ~/.config/garmin-connect/credentials.json (plaintext, 600 permissions)\"\n      - \"OAuth tokens are cached locally after first login - subsequent logins use tokens, not password\"\n      - \"Third-party library: garminconnect (https://github.com/cyberjunkie/garminconnect) - open source, auditable\"\n      - \"NO data transmission except to Garmin API servers via official garminconnect library\"\n      - \"For cron jobs: Pass env vars in crontab or use launchd with EnvironmentVariables key\"\n---\n\n# Garmin Connect Pro\n\nThe most comprehensive Garmin Connect skill for OpenClaw. Retrieve activities, health data, sleep analysis, heart rate, stress, body battery, training readiness, VO2 max, and more from your Fenix, Forerunner, Index scales, or other Garmin devices.\n\n## Security & Privacy\n\n⚠️ **Important Security Information:**\n\n### Credential Options\n\n**Option 1: Environment Variables (Recommended for cron jobs)**\n```bash\nexport GARMIN_EMAIL=\"your-email@example.com\"\nexport GARMIN_PASSWORD=\"your-password\"\n```\n- More secure for automated/scheduled usage\n- Not stored on disk\n- Works with cron jobs without leaving plaintext files\n\n**Option 2: Credentials File**\n```bash\nmkdir -p ~/.config/garmin-connect\necho '{\"email\": \"your-email@example.com\", \"password\": \"your-password\"}' > ~/.config/garmin-connect/credentials.json\nchmod 600 ~/.config/garmin-connect/credentials.json\n```\n- Stored in plaintext (any process with file access can read it)\n- File permissions set to 600 (owner read/write only)\n- Consider excluding from backups\n\n### Third-Party Library\n\nThis skill uses the `garminconnect` Python library for all Garmin API communication. \n- **Source code:** https://github.com/cyberjunkie/garminconnect\n- **Trust boundary:** All API calls go through this library\n- **Recommendation:** Audit the library if you have strict security requirements\n\n### Data Flow\n\n```\nYour Credentials → garminconnect library → Garmin API servers\n                     ↓\n              OAuth tokens cached locally\n```\n\nNo data is transmitted to any third parties other than Garmin via the official garminconnect library.\n\n## Setup\n\n### First-time Login\n\n```bash\n# Install dependency\npip3 install garminconnect\n\n# Option A: Use environment variables (recommended)\nexport GARMIN_EMAIL=\"your-email@example.com\"\nexport GARMIN_PASSWORD=\"your-password\"\n\n# Option B: Use credentials file\nmkdir -p ~/.config/garmin-connect\necho '{\"email\": \"your-email@example.com\", \"password\": \"your-password\"}' > ~/.config/garmin-connect/credentials.json\nchmod 600 ~/.config/garmin-connect/credentials.json\n\n# Login (generates OAuth tokens)\npython3 ~/.agents/skills/garmin-connect-pro/scripts/garmin.py login\n```\n\n## Features\n\n| Feature | Description |\n|---------|-------------|\n| **Natural Language Queries** | \"how did I sleep?\", \"what's my body battery?\", \"should I train today?\" |\n| **ASCII Charts** | Visual trends for steps, HR, stress, battery |\n| **Week-over-Week Comparison** | Track progress vs last week |\n| **Race Predictions** | 5K, 10K, half marathon, marathon |\n| **Body Composition** | Weight, muscle mass, fat percentage |\n| **VO2 Max Tracking** | Cardio fitness from activities |\n| **FIT/GPX Downloads** | Export activity files |\n| **Training Effect** | Aerobic + anaerobic impact |\n| **HR Zones per Activity** | Time in each zone |\n| **Emoji-Powered Output** | Quick visual scanning |\n\n## Quick Start\n\n```bash\n# Ask questions naturally\npython3 scripts/garmin.py ask \"how did I sleep?\"\npython3 scripts/garmin.py ask \"what's my training readiness?\"\n\n# Daily summary\npython3 scripts/garmin.py summary\n\n# Trends with charts\npython3 scripts/garmin.py trends --days 7\npython3 scripts/garmin.py chart steps --days 14\n\n# Compare weeks\npython3 scripts/garmin.py compare\n\n# Download activities\npython3 scripts/garmin.py download --id 123456 --format fit\n```\n\n## Commands\n\n### Natural Language\n```bash\npython3 scripts/garmin.py ask \"how did I sleep?\"\npython3 scripts/garmin.py ask \"am I stressed?\"\npython3 scripts/garmin.py ask \"how many steps today?\"\n```\n\n### Daily Metrics\n```bash\npython3 scripts/garmin.py summary              # Full daily summary\npython3 scripts/garmin.py stats --today        # Steps, HR, calories\npython3 scripts/garmin.py sleep --today        # Sleep stages\npython3 scripts/garmin.py hr --today           # Heart rate data\npython3 scripts/garmin.py hrv --today          # HRV\npython3 scripts/garmin.py stress --today       # Stress levels\npython3 scripts/garmin.py body-battery --today # Energy level\n```\n\n### Activities\n```bash\npython3 scripts/garmin.py activities --limit 5\npython3 scripts/garmin.py activity --id 123456 --full\npython3 scripts/garmin.py download --id 123456 --format fit\n```\n\n### Training & Performance\n```bash\npython3 scripts/garmin.py training --today     # Readiness + intensity\npython3 scripts/garmin.py vo2max              # VO2 max + predictions\npython3 scripts/garmin.py body                 # Body composition\npython3 scripts/garmin.py race                 # Race predictions\n```\n\n### Trends\n```bash\npython3 scripts/garmin.py week --days 7\npython3 scripts/garmin.py trends --days 14\npython3 scripts/garmin.py compare              # Week vs week\npython3 scripts/garmin.py chart steps --days 30\n```\n\n## Example Output\n\n### Natural Language Response\n```\n🔋 Body Battery:\n   Current: 45%\n   ⚠️ Moderate - lighter activity recommended\n```\n\n### Weekly Comparison\n```\n📊 WEEK VS WEEK\n─────────────────────────────────────────────────\nMetric          This Week   Last Week   Change\n─────────────────────────────────────────────────\nSteps              42,500      38,200    ↑ 11.3%\nDistance (km)         35.2        28.9   ↑ 21.8%\nCalories            18,500      17,200     ↑ 7.6%\nResting HR            56.0        57.5     ↓ 2.6%\n```\n\n### ASCII Chart\n```\n📈 STEPS - Last 7 Days\n──────────────────────────────────────────────\n10000 │       █           █\n 8000 │   █   █   █       █\n 6000 │   █   █   █   █   █\n 4000 │   █   █   █   █   █   █\n 2000 │   █   █   █   █   █   █   █\n    0 └────────────────────────────────\n      Mon  Tue  Wed  Thu  Fri  Sat  Sun\n```\n\n## Cron Job Setup\n\n⚠️ **Security Note:** Using environment variables is more secure than storing credentials on disk.\n\n### Option A: Environment Variables (Recommended)\n\n```bash\n# In your crontab or OpenClaw cron config:\nGARMIN_EMAIL=\"your-email@example.com\" GARMIN_PASSWORD=\"your-password\" python3 ~/.agents/skills/garmin-connect-pro/scripts/garmin.py summary\n```\n\n### Option B: Credentials File\n\n```bash\n# Morning briefing at 6:30\nopenclaw cron add --name \"Morning Fitness\" --cron \"30 6 * * *\" \\\n  --message \"python3 ~/.agents/skills/garmin-connect-pro/scripts/garmin.py summary\"\n\n# Midday check at 12:00\nopenclaw cron add --name \"Midday Check\" --cron \"0 12 * * *\" \\\n  --message \"python3 ~/.agents/skills/garmin-connect-pro/scripts/garmin.py ask 'body battery'\"\n\n# Evening summary at 20:00\nopenclaw cron add --name \"Evening Summary\" --cron \"0 20 * * *\" \\\n  --message \"python3 ~/.agents/skills/garmin-connect-pro/scripts/garmin.py week --days 1\"\n```\n\n**Note:** Cron jobs that run scripts with access to stored credentials increase the attack surface. Consider:\n- Using a dedicated Garmin account with limited permissions\n- Using environment variables instead of credential files\n- Running on a secure, isolated system\n\n## Data Available\n\n| Category | Metrics |\n|----------|---------|\n| **Activities** | Name, type, duration, distance, calories, HR zones, training effect, elevation, splits, steps |\n| **Daily Stats** | Steps, distance, floors, calories (total/active/BMR), HR (resting/min/max), stress, body battery |\n| **Sleep** | Total, deep, light, REM, awake, sleep score |\n| **Heart** | Resting HR, min/max HR, HR zones, HRV (heart rate variability) |\n| **Training** | Readiness score, intensity minutes (moderate/vigorous), aerobic/anaerobic effect |\n| **Body** | Weight, muscle mass, fat percentage, BMI (with Index scale) |\n| **Performance** | VO2 max, race predictions (5K-marathon), FTP (cycling) |\n| **Health** | SpO2, respiration rate, hydration, stress timeline |\n| **Devices** | Fenix, Forerunner, Index scales, firmware, battery level |\n\n## JSON Output\n\nAdd `--json` to any command for scripting:\n\n```bash\npython3 scripts/garmin.py summary --json | jq '.totalSteps'\npython3 scripts/garmin.py activities --json | jq '.[0].averageHR'\npython3 scripts/garmin.py export --days 30 --json > monthly_export.json\n```\n\n## Requirements\n\n- Python 3.7+\n- `garminconnect` library (`pip install garminconnect`)\n- Garmin Connect account with devices synced\n\n## Troubleshooting\n\n### \"Authentication failed\"\n- Verify email and password in credentials file or environment variables\n- Delete tokens: `rm -rf ~/.config/garmin-connect/tokens/`\n- Re-run login\n\n### \"No data for date\"\n- Device may not have synced yet\n- Sleep data appears after morning sync\n- Some metrics (HRV, training readiness) require overnight processing\n\n### Rate Limits\n- Garmin may rate-limit excessive API calls\n- Add delays between bulk requests\n\n## The Honest Truth\n\nThis won't make you fitter. But it will make it harder to ignore the data. Your Garmin already knows you skipped leg day—now OpenClaw can remind you too.\n\n---\n\n*Want to be fit like @steipete? Well, now you can track every step of your journey—literally.*","tags":{"latest":"1.4.1"},"stats":{"comments":0,"downloads":761,"installsAllTime":0,"installsCurrent":0,"stars":1,"versions":5},"createdAt":1772571376377,"updatedAt":1778491707669},"latestVersion":{"version":"1.4.1","createdAt":1773766425242,"changelog":"Fixed missing cmd_summary and cmd_activities functions","license":"MIT-0"},"metadata":{"setup":[],"os":null,"systems":null},"owner":{"handle":"drpeterkalmar","userId":"s1771mt4tag3pxw8srvqeemxrh884chk","displayName":"drpeterkalmar","image":"https://avatars.githubusercontent.com/u/243632958?v=4"},"moderation":null}