Agent skill

Wahoo Cloud

by LeoYeAI in LeoYeAI/openclaw-master-skills

Wahoo Fitness Cloud API — fetch workouts, download FIT files, parse power/HR/cadence/GPS into local SQLite for analysis

MITAuto-check passedProductivity & Automation

Install Wahoo Cloud

skills CLI
$ npx skills add LeoYeAI/openclaw-master-skills --skill wahoo-cloud -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install LeoYeAI/openclaw-master-skills wahoo-cloud --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/wahoo-cloud .claude/skills/wahoo-cloud && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
wahoo-cloud
GitHub stars
2.2k
Token cost
~1.9k tokens
SKILL.md length
746 words
Files
14 (incl. scripts)
Skills in repo
972
Repo updated
First seen
Licence
MIT

At a glance

Wahoo Fitness Cloud API — fetch workouts, download FIT files, parse power/HR/cadence/GPS into local SQLite for analysis

  • Works in 4 steps: Register a Wahoo Developer App → Configure Credentials → Run OAuth2 Flow → …
  • Tasks that involve Health and fitness tracking
  • SKILL.md covers Agent quickstart (read this…, Setup, Usage and Common Data Fields, plus 3 more sections
  • Runs Python and Shell scripts from its folder; calls python3, curl and bash; reaches api.wahooligan.com; needs WAHOO_CLIENT_SECRET and WAHOO_ACCESS_TOKEN

What it does

Wahoo Cloud is an agent skill from LeoYeAI/openclaw-master-skills. Wahoo Fitness Cloud API — fetch workouts, download FIT files, parse power/HR/cadence/GPS into local SQLite for analysis

Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 17 other files, including scripts (for example `.clawhub/origin.json`, `LICENSE.md` and `README.md`).

It sits in Productivity & Automation, covering Health and fitness tracking. It works with SQLite and Python. The repository describes itself as: 🧠 Curated collection of 1209+ best OpenClaw skills — weekly updated by MyClaw.ai. The licence is MIT.

When your agent uses it

  • Tasks that involve Health and fitness tracking

Example prompts

  • “/wahoo-cloud”

Requirements

  • Python 3
  • A Bash shell
  • A credential in WAHOO_CLIENT_SECRET
  • A credential in WAHOO_ACCESS_TOKEN

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Register a Wahoo Developer App
  2. Configure Credentials
  3. Run OAuth2 Flow
  4. Fetch Workouts

What it can do on your machine

Read from SKILL.md and the folder at commit e5199b5. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 4 files in scripts/ (Python and Shell), which the agent can run.

    Shell commands in SKILL.md call:

    • python3
    • curl
    • bash

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • api.wahooligan.com

    Also links to:

    • developers.wahooligan.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • WAHOO_CLIENT_SECRET
    • WAHOO_ACCESS_TOKEN
    • WAHOO_REFRESH_TOKEN

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Wahoo Cloud loads about 1.9k tokens when it runs. Until then it costs about 33 tokens; SKILL.md has 746 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~33
When it runs · the whole SKILL.md, loaded when a task matches
~1.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from LeoYeAI/openclaw-master-skills at commit e5199b5, republished under its MIT licence (© LeoYeAI). 746 words, ~1,867 tokens.

Download SKILL.mdSave it as .claude/skills/wahoo-cloud/SKILL.md (or your agent's skills folder). This skill also uses 13 other files; get the full folder from GitHub.
name
wahoo-cloud
description
Wahoo Fitness Cloud API — fetch workouts, download FIT files, parse power/HR/cadence/GPS into local SQLite for analysis
homepage
https://cloud-api.wahooligan.com/

Wahoo Cloud API Skill

Programmatic access to the Wahoo Fitness Cloud API for ELEMNT BOLT/ROAM/ACE head units. Fetches workout metadata, downloads FIT files from Wahoo's CDN, and parses ride data (power, cadence, HR, GPS, elevation) into a local SQLite database.

API base: https://api.wahooligan.com. Workout endpoints live under /v1/workouts. OAuth2 with the offline_data scope yields a long-lived refresh token; access tokens expire after ~2 hours and the skill auto-refreshes on 401.

Agent quickstart (read this first)

If you're an agent invoking this skill on behalf of a user:

User asksRun this
"Sync my Wahoo workouts" / "Pull new rides"python3 {baseDir}/scripts/fetch_workouts.py
"Show recent rides" / "Last week's training"Query ~/.openclaw/workspace/training/wahoo.db (or $WAHOO_TRAINING_DIR/wahoo.db) — schema below
"Parse this FIT file"python3 {baseDir}/scripts/parse_fit.py PATH.fit [--summary-only]
"Set up Wahoo" / "Connect my Wahoo"Walk the user through Setup §1–3 below; then run python3 {baseDir}/scripts/oauth_setup.py
"Refresh my Wahoo token"bash {baseDir}/scripts/refresh_token.sh (only needed if auto-refresh fails)

The fetch script is idempotent — safe to run on a heartbeat. It skips workouts already fully synced (fit_parsed_at IS NOT NULL). Sandbox rate limits (25 req / 5 min) trigger automatic backoff, so a first sync of a long history may take many minutes.

The skill cannot ship credentials. Each user needs their own Wahoo developer app — no shortcut. Setup is a one-time browser handshake.

Credential auto-loading: if WAHOO_CLIENT_ID / WAHOO_CLIENT_SECRET aren't in the calling shell, wahoo_auth.py automatically reads them from ~/.openclaw/secrets/wahoo.env (override path with $WAHOO_ENV_FILE). This means an OpenClaw agent can invoke fetch_workouts.py without sourcing anything — token refresh just works.

Setup

1. Register a Wahoo Developer App
  1. Go to https://developers.wahooligan.com
  2. Create an application (Sandbox is automatic — no review)
  3. Set callback URL (e.g. https://localhost:8080/ — the manual-paste OAuth helper works with any registered callback)
  4. Request scopes: workouts_read offline_data user_read (add power_zones_read plans_read routes_read if you want zones/plans/routes)
  5. Note your Client ID and Client Secret
2. Configure Credentials

Add to ~/.clawdbot/clawdbot.json:

json
{
  "skills": {
    "entries": {
      "wahoo": {
        "enabled": true,
        "env": {
          "WAHOO_CLIENT_ID": "your-client-id",
          "WAHOO_CLIENT_SECRET": "your-client-secret",
          "WAHOO_REDIRECT_URI": "https://localhost:8080/"
        }
      }
    }
  }
}

Or as environment variables:

bash
export WAHOO_CLIENT_ID="..."
export WAHOO_CLIENT_SECRET="..."
export WAHOO_REDIRECT_URI="https://localhost:8080/"
3. Run OAuth2 Flow
bash
python3 {baseDir}/scripts/oauth_setup.py

The script prints an authorization URL. Open it in a browser, log in with your Wahoo account, approve. You'll be redirected to your callback URL with ?code=... in the query string (the page itself will fail to load — that's expected; just copy the URL or the code value). Paste it back into the script. It exchanges the code for tokens and writes them to ~/.openclaw/secrets/wahoo_tokens.json.

4. Fetch Workouts
bash
python3 ~/.openclaw/workspace/training/fetch_wahoo.py

This pulls the workout list, fetches detail (and FIT URL) for each new workout, downloads FIT files into ~/.openclaw/workspace/training/wahoo_fit/, parses them, and upserts records into ~/.openclaw/workspace/training/wahoo.db.

Usage

List Workouts (paginated)
bash
curl -s -H "Authorization: Bearer ${WAHOO_ACCESS_TOKEN}" \
  "https://api.wahooligan.com/v1/workouts?page=1&per_page=30"

Response shape: { workouts: [...], total, page, per_page, order, sort }. Note that workout_summary is null in the list response — fetch detail per workout to get summary + FIT URL.

Show full SKILL.md (304 more words)Show less
Get Workout Detail (with FIT URL)
bash
curl -s -H "Authorization: Bearer ${WAHOO_ACCESS_TOKEN}" \
  "https://api.wahooligan.com/v1/workouts/WORKOUT_ID"

The FIT file URL lives at workout_summary.file.url.

Download a FIT File
bash
curl -L -o ride.fit "$FIT_URL"

The CDN doesn't require auth and doesn't count against your API rate limit.

Get User Profile
bash
curl -s -H "Authorization: Bearer ${WAHOO_ACCESS_TOKEN}" \
  "https://api.wahooligan.com/v1/user"

Returns { id, height, weight, first, last, email, birth, gender, created_at, updated_at }. Height and weight are returned as decimal strings.

Refresh Access Token
bash
bash {baseDir}/scripts/refresh_token.sh

The Python OAuth helper auto-refreshes on 401 if a refresh_token is on file. The shell helper is for manual/cron use.

bash
curl -s -X POST https://api.wahooligan.com/oauth/token \
  -d client_id="${WAHOO_CLIENT_ID}" \
  -d client_secret="${WAHOO_CLIENT_SECRET}" \
  -d grant_type=refresh_token \
  -d refresh_token="${WAHOO_REFRESH_TOKEN}"

The new access token does not invalidate the old one until you successfully use it (Wahoo allows up to 10 unrevoked access tokens per user as of Jan 2026).

Common Data Fields

workout_summary includes:

  • ascent_accum — total elevation gain (m)
  • cadence_avg — average cadence (rpm)
  • calories_accum — kcal
  • distance_accum — distance (m)
  • duration_active_accum / duration_paused_accum / duration_total_accum — seconds
  • heart_rate_avg — bpm
  • power_avg — average power (W)
  • power_bike_np_last — normalized power
  • power_bike_tss_last — Training Stress Score
  • speed_avg — m/s
  • work_accum — total work (J)
  • time_zone — IANA tz
  • file.url — FIT file URL (CDN)

All decimal values are returned as strings — cast before math.

workout_type_id is an integer enum whose mapping isn't published. Empirically observed: cycling rides come back as 0. Treat as opaque and key off the FIT sport/sub_sport fields (parsed into workouts.fit_* columns) when you need to filter by activity type.

Rate Limits

Tierper 5 minper hourper day
Sandbox25100250
Production2001,0005,000

Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. The sync pipeline backs off automatically on 429.

Tips

  • Convert m → mi: divide by 1609.34
  • Convert m/s → mph: multiply by 2.237
  • Decimal strings: float(workout_summary["power_avg"]) before any math
  • The list endpoint omits workout_summary — always hit detail (/v1/workouts/:id) to get FIT URL

Error Handling

StatusMeaningAction
401Access token expired/invalidRun refresh_token.sh or let wahoo_auth.py auto-refresh
403Scope insufficientRe-authorize with the missing scope
429Rate limit hitWait until X-RateLimit-Reset
404Workout not found / not yoursConfirm ID + ownership

© LeoYeAI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 13 other files (scripts) in skills/wahoo-cloud of LeoYeAI/openclaw-master-skills.

  • SKILL.md
  • .clawhub/origin.json
  • LICENSE.md
  • README.md
  • _meta.json
  • config.example.json
  • lib/fit_parser.py
  • lib/wahoo_api.py
  • lib/wahoo_auth.py
  • schema/wahoo_db_schema.sql
  • scripts/fetch_workouts.py
  • scripts/oauth_setup.py
  • scripts/parse_fit.py
  • scripts/refresh_token.sh

Open the folder on GitHubat commit e5199b5

Compare with similar skills

Wahoo Cloud next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Wahoo Cloud compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Wahoo Cloud this skillLeoYeAI/openclaw-master-skills2.2k—~1.9kAutomated safety check: PassMIT
Coachfelixrieseberg/claude-coach1961 repos~4.9kAutomated safety check: PassMIT
Fitness NutritionTommy-yw/RunbookHermes5461 repos~2.5kAutomated safety check: PassMIT
Health Dataglebis/claude-skills389—~1.7kAutomated safety check: PassMIT
Pp Nutritionmvanhorn/printing-press-library2.1k—~3.9kAutomated safety check: NotesApache-2.0
Fitness Nutritioninfometa/workbuddyskills344—~892Automated safety check: PassMIT

Similar skills

  • Coach

    felixrieseberg/claude-coach

    Create personalized triathlon, marathon, and ultra-endurance training plans.

    196 GitHub starsUsed in 1 repo~4.9k tokens
    Productivity & AutomationAuto-check passed
  • Fitness Nutrition

    Tommy-yw/RunbookHermes

    Gym workout planner and nutrition tracker. An agent skill from Tommy-yw/RunbookHermes.

    546 GitHub starsUsed in 1 repo~2.5k tokens
    Productivity & AutomationAuto-check passed
  • Health Data

    glebis/claude-skills

    Query Apple Health SQLite database for vitals, activity, sleep, and workouts.

    389 GitHub stars~1.7k tokensUpdated 12 days ago
    Productivity & AutomationAuto-check passed
  • Pp Nutrition

    mvanhorn/printing-press-library

    One agent-native CLI over USDA FoodData Central and NutritionValue.org - with cross-source enrichment, protein-density comparison, nutrient ranking, and a local SQLite cache no other nutrition tool…

    2.1k GitHub stars~3.9k tokensUpdated yesterday
    Productivity & AutomationAuto-check: notes
  • Fitness Nutrition

    infometa/workbuddyskills

    健身动作库与营养查询。通过 wger API 搜索 690+ 动作(按肌群/器械/名称), 通过 USDA FoodData Central 查询 38万+ 食物营养数据。

    344 GitHub stars~892 tokensUpdated yesterday
    Productivity & AutomationAuto-check passed
  • MCP Server Builder

    shareAI-lab/learn-claude-code

    Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.

    78k GitHub starsUsed in 5 repos~1.2k tokens
    Agent WorkflowsAuto-check passed

More from LeoYeAI/openclaw-master-skills

All 972 skills in this repo
  • DevOps Pipeline Management

    LeoYeAI/openclaw-master-skills

    Manages pipelines on a DevOps quality and efficiency platform through its OpenAPI: list workspaces and templates, create, update, run and cancel pipelines, and read run records.

    2.2k GitHub stars~4.2k tokensUpdated 2 mo ago
    Auto-check: notes
  • Feishu Document Collaboration

    LeoYeAI/openclaw-master-skills

    Patches OpenClaw's Feishu extension so an edited document triggers an isolated agent session that reads the doc and replies inline, turning it into a live chat space.

    2.2k GitHub stars~2k tokensUpdated 2 mo ago
    Auto-check passed
  • Files Memory System

    LeoYeAI/openclaw-master-skills

    Multi-context memory management system for OpenClaw agents with group-isolated storage, global shared memory, workspace organization, and group-specific skills isolation.

    2.2k GitHub stars~3.8k tokensUpdated 2 mo ago
    Auto-check passed
  • GEO-Claw AI Visibility Agent

    LeoYeAI/openclaw-master-skills

    Runs a brand's AI-search visibility work end to end: diagnosing how AI platforms represent it, repositioning it, producing AI-optimized content and monitoring ongoing mentions.

    2.2k GitHub stars~4.7k tokensUpdated 2 mo ago
    Auto-check passed
  • Google Workspace CLI

    LeoYeAI/openclaw-master-skills

    Installs and authenticates the gws CLI, then automates Gmail, Drive, Sheets, Calendar, Docs, Chat and Tasks with ready-made recipes, persona bundles and security audits.

    2.2k GitHub stars~2.6k tokensUpdated 2 mo ago
    Auto-check: notes
  • HealthFit Health Advisors

    LeoYeAI/openclaw-master-skills

    Runs four advisor roles, a fitness coach, nutritionist, data analyst and TCM practitioner, to build a health profile and track workouts, diet and wellness over time.

    2.2k GitHub stars~4.4k tokensUpdated 2 mo ago
    Auto-check passed

Works with

Questions about Wahoo Cloud

What does Wahoo Cloud do?

Wahoo Fitness Cloud API — fetch workouts, download FIT files, parse power/HR/cadence/GPS into local SQLite for analysis. Wahoo Cloud is an agent skill from LeoYeAI/openclaw-master-skills.

When should I use Wahoo Cloud?

Wahoo Cloud fits situations like: tasks that involve Health and fitness tracking.

How do I install Wahoo Cloud in Claude Code?

Run `npx skills add LeoYeAI/openclaw-master-skills --skill wahoo-cloud -a claude-code`. Or copy the skill folder (skills/wahoo-cloud in LeoYeAI/openclaw-master-skills) into .claude/skills/wahoo-cloud in your project. Claude Code loads it when a task matches its description.

How do I install Wahoo Cloud in Codex?

Run `npx skills add LeoYeAI/openclaw-master-skills --skill wahoo-cloud -a codex`. Or copy the skill folder (skills/wahoo-cloud in LeoYeAI/openclaw-master-skills) into .agents/skills/wahoo-cloud in your project. Codex loads it when a task matches its description.

Can I use Wahoo Cloud in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add LeoYeAI/openclaw-master-skills --skill wahoo-cloud -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/wahoo-cloud, .gemini/skills/wahoo-cloud, .github/skills/wahoo-cloud and .opencode/skills/wahoo-cloud in your project.

What does Wahoo Cloud need to run?

Going by SKILL.md and its folder, Wahoo Cloud needs Python and a shell for the scripts in its folder, the command-line tools its instructions call (python3, curl and bash) and credentials named WAHOO_CLIENT_SECRET, WAHOO_ACCESS_TOKEN and WAHOO_REFRESH_TOKEN. Our summary lists: Python 3; A Bash shell; A credential in WAHOO_CLIENT_SECRET; A credential in WAHOO_ACCESS_TOKEN.

Does Wahoo Cloud access the network?

SKILL.md names 2 domains. In commands or code: api.wahooligan.com; the agent is likely to contact it when it follows the instructions. As links in the text: developers.wahooligan.com. This is read from the text; nothing was executed.

Is Wahoo Cloud safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Wahoo Cloud use?

Wahoo Cloud is published under the MIT licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Wahoo Cloud use?

About 1.9k tokens (SKILL.md is roughly 7.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Wahoo Cloud?

Skills that share tags, products or a category with Wahoo Cloud: Coach (felixrieseberg/claude-coach, 196 stars), Fitness Nutrition (Tommy-yw/RunbookHermes, 546 stars), Health Data (glebis/claude-skills, 389 stars) and Pp Nutrition (mvanhorn/printing-press-library, 2.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Wahoo Cloud?

LeoYeAI (a GitHub user) maintains it in LeoYeAI/openclaw-master-skills, which has 2,159 GitHub stars. The repository holds 972 skills in this directory. The repository was last updated on July 20, 2026.

Source: LeoYeAI/openclaw-master-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.