Skills whoop
Sync WHOOP health data (recovery, sleep, strain, workouts) to markdown files for AI-powered health insights. Use when user asks about WHOOP data, health metrics, recovery scores, sleep analysis, HRV, strain tracking, or wants daily health reports. Triggers on "WHOOP", "recovery score", "HRV", "sleep debt", "strain", "health sync", "健康数据", "恢复分数", "睡眠", "心率变异性".
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/aikong-cmd/whoop-health-sync" ~/.claude/skills/clawdbot-skills-whoop-9947b0 && rm -rf "$T"
manifest:
skills/aikong-cmd/whoop-health-sync/SKILL.mdsource content
WHOOP Health Data Sync
Sync WHOOP wearable data to
health/whoop-YYYY-MM-DD.md files. Pure Python, zero dependencies.
Data Coverage
Recovery (score/HRV/RHR/SpO2/skin temp), Sleep (performance/efficiency/stages/respiratory rate/sleep need/balance), Day Strain (strain/calories/HR), Workouts (sport/duration/strain/HR/zones/distance), Weekly summaries.
Setup
1. Create WHOOP Developer App
- Go to https://developer-dashboard.whoop.com/
- Create Application → Redirect URI:
→ select allhttp://localhost:9527/callback
+read:*
scopesoffline - Note Client ID and Client Secret
2. Store Credentials
Env vars:
export WHOOP_CLIENT_ID="your-id" export WHOOP_CLIENT_SECRET="your-secret"
Or 1Password: Create Login item named
whoop (username=Client ID, password=Client Secret).
3. Authorize (one-time)
Local (browser on same machine):
python3 scripts/auth.py
Remote server (headless):
python3 scripts/auth.py --print-url # User opens URL in browser, authorizes, copies callback URL back python3 scripts/auth.py --callback-url "http://localhost:9527/callback?code=xxx&state=yyy"
Tokens auto-refresh via
offline scope. Authorize once, runs forever.
Usage
python3 scripts/sync.py # Sync today python3 scripts/sync.py --days 7 # Last 7 days python3 scripts/sync.py --weekly # Weekly summary python3 scripts/sync.py --date 2026-03-07 # Specific date
Output:
~/.openclaw/workspace/health/whoop-YYYY-MM-DD.md
Cron (daily auto-sync)
openclaw cron add \ --name whoop-daily \ --schedule "0 10 * * *" \ --timezone Asia/Shanghai \ --task "Run: python3 ~/.openclaw/workspace/skills/whoop/scripts/sync.py --days 2. Then read the generated markdown files and send me the latest day's report."
Troubleshooting
| Problem | Fix |
|---|---|
| Run first |
| Re-run to re-authorize |
| Cloudflare block — uses curl to avoid. Check network |
| WHOOP finalizes sleep after waking; try later |
Agent Notes
- When user asks to re-authorize: run
, send URL, wait for callback URLauth.py --print-url - After authorization: verify with
sync.py --days 1 - Token exchange uses
to bypass Cloudflare blocking Python urllibcurl