{"skill":{"slug":"garmin-pulse","displayName":"Garminskill","summary":"Syncs daily health and fitness data from Garmin Connect into markdown files. Provides sleep, activity, heart rate, stress, body battery, HRV, SpO2, and weight data.","description":"---\nname: garmin-pulse\nversion: 1.3.1\ndescription: Syncs daily health and fitness data from Garmin Connect into markdown files. Provides sleep, activity, heart rate, stress, body battery, HRV, SpO2, and weight data.\nhomepage: https://github.com/freakyflow/garminskill\ndisable-model-invocation: true\nmetadata: {\"openclaw\":{\"emoji\":\"💪\",\"requires\":{\"bins\":[\"uv\"]},\"install\":[{\"id\":\"uv\",\"kind\":\"brew\",\"formula\":\"uv\",\"bins\":[\"uv\"],\"label\":\"Install uv via Homebrew\"}]}}\n---\n\n# Garmin Connect\n\nThis skill syncs your daily health data from Garmin Connect into readable markdown files.\n\n## Setup\n\nAuthentication is required before the first sync. This only needs to happen once — tokens are cached for approximately one year.\n\nIf the sync command fails with \"No cached tokens found\", tell the user to run the setup command in their terminal:\n\n```bash\nuv run {baseDir}/scripts/sync_garmin.py --setup --email you@example.com\n```\n\nThe password is prompted interactively via `getpass` — it is never echoed to screen, stored in shell history, or passed as a command argument. On success the user will see `Success! Tokens cached in ~/.garminconnect`. After that, all syncs use cached tokens only — no credentials are needed.\n\nDo not ask the user for their password in chat and do not pass passwords as command-line arguments or via stdin piping, as these methods can expose credentials in process listings or conversation history.\n\n## Syncing Data\n\nSync today's data:\n\n```bash\nuv run {baseDir}/scripts/sync_garmin.py\n```\n\nSync a specific date:\n\n```bash\nuv run {baseDir}/scripts/sync_garmin.py --date 2026-02-07\n```\n\nSync the last N days:\n\n```bash\nuv run {baseDir}/scripts/sync_garmin.py --days 7\n```\n\n## Reading Health Data\n\nHealth files are stored at `{baseDir}/health/YYYY-MM-DD.md` — one file per day.\n\nTo answer health or fitness questions, read the relevant date's file from the `{baseDir}/health/` directory. If the file doesn't exist for the requested date, run the sync command for that date first.\n\n## Dependencies\n\nThis skill uses [uv](https://docs.astral.sh/uv/) to run the sync script. `uv` is a fast Python package manager by Astral that reads inline script metadata (PEP 723) and automatically installs dependencies (`garminconnect`, `cloudscraper`) in an isolated environment — no manual `pip install` needed.\n\n## Credentials & Stored Data\n\nGarmin Connect does not offer a public OAuth API, so a one-time email/password login is required. During setup, the password is used once to obtain OAuth tokens, then discarded. The tokens are cached locally in `~/.garminconnect/` for approximately one year. At runtime, only the cached tokens are used — no email or password is needed. If tokens expire, re-run the setup command.\n\n**Paths written by this skill:**\n\n- `~/.garminconnect/` — cached OAuth tokens (sensitive; grants access to the user's Garmin account)\n- `{baseDir}/health/` — daily health markdown files (contains personal health data)\n\n## Cron Setup\n\nSchedule the sync script to run every morning using OpenClaw's `cron` tool so your health data stays up to date automatically. No environment variables or credentials are needed — the sync uses cached tokens from the one-time setup.\n","topics":["Fitness","Health"],"tags":{"latest":"1.3.1","fitness":"1.0.0","garmin":"1.0.0","health":"1.0.0","wearable":"1.0.0"},"stats":{"comments":0,"downloads":2357,"installsAllTime":89,"installsCurrent":3,"stars":3,"versions":8},"createdAt":1770600931767,"updatedAt":1779076789795},"latestVersion":{"version":"1.3.1","createdAt":1770768194129,"changelog":"Address security scan: add disable-model-invocation to prevent autonomous agent syncs. Document stored paths (token cache, health data). Update metadata namespace.","license":null},"metadata":{"setup":[],"os":null,"systems":null},"owner":{"handle":"freakyflow","userId":"s177ry6e10a6ptba07s8ghmmyn884kmm","displayName":"freakyflow","image":"https://avatars.githubusercontent.com/u/95600411?v=4"},"moderation":{"isSuspicious":false,"isMalwareBlocked":false,"verdict":"clean","reasonCodes":["review.llm_review"],"summary":"Review: review.llm_review","engineVersion":"v2.4.24","updatedAt":1779961476960}}