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.md
source 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

  1. Go to https://developer-dashboard.whoop.com/
  2. Create Application → Redirect URI:
    http://localhost:9527/callback
    → select all
    read:*
    +
    offline
    scopes
  3. 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

ProblemFix
No tokens found
Run
auth.py
first
Token refresh failed (403)
Re-run
auth.py
to re-authorize
error code: 1010
Cloudflare block — uses curl to avoid. Check network
No data for date
WHOOP finalizes sleep after waking; try later

Agent Notes

  • When user asks to re-authorize: run
    auth.py --print-url
    , send URL, wait for callback URL
  • After authorization: verify with
    sync.py --days 1
  • Token exchange uses
    curl
    to bypass Cloudflare blocking Python urllib