Wahoo Skill

PassAudited by ClawScan on May 13, 2026.

Overview

The skill appears purpose-aligned for syncing Wahoo workouts, but it grants ongoing Wahoo OAuth access and stores sensitive GPS and health workout data locally.

Install this if you are comfortable giving a local agent ongoing read access to your Wahoo data. Use minimum OAuth scopes, protect ~/.openclaw/secrets and the training workspace with restrictive permissions, avoid sharing token/setup output or the generated DB/FIT files, and revoke/delete tokens when you stop using it.

Findings (4)

Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.

What this means

When asked to sync, the agent can contact Wahoo, download FIT files, and update the local training database.

Why it was flagged

The skill gives agents a direct command to run a network sync that downloads workouts and updates a local SQLite database. This is central to the stated purpose, but users should notice that invoking it mutates local files and may run for a long time on first sync.

Skill content
"Sync my Wahoo workouts" / "Pull new rides" | `python3 {baseDir}/scripts/fetch_workouts.py` ... The fetch script is **idempotent** — safe to run on a heartbeat.
Recommendation

Invoke syncing deliberately, keep the training directory private, and avoid scheduling repeated syncs unless you want ongoing local updates.

What this means

A configured agent can continue reading Wahoo workout/profile data using the stored refresh token; exposure of the token or secrets file could expose account data.

Why it was flagged

The skill uses delegated Wahoo account access, stores/loads local credentials, and can refresh access without another browser approval. This is expected for Wahoo syncing but grants continuing read access until revoked.

Skill content
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. ... `wahoo_auth.py` automatically reads them from `~/.openclaw/secrets/wahoo.env`
Recommendation

Use the minimum Wahoo scopes, store secrets only in local protected files, restrict access to ~/.openclaw/secrets, and revoke the Wahoo app/token if you stop using the skill.

What this means

Installing the dependency trusts the PyPI package and the version selected by pip.

Why it was flagged

The skill depends on a third-party PyPI package installed manually with a version range and no lockfile or hash pinning. This is purpose-aligned for FIT parsing but is a supply-chain point users should recognize.

Skill content
pip install --user 'fitparse>=1.2,<2' ... (`fitparse` is the only Python dependency. `curl` is needed for the shell refresh helper.)
Recommendation

Install dependencies from a trusted environment, consider pinning an exact reviewed fitparse version, and keep package sources under normal supply-chain hygiene.

What this means

Your ride locations, heart-rate, power, device information, and workout history may remain available on disk for future queries.

Why it was flagged

The skill intentionally creates persistent local data stores containing sensitive location and health/training telemetry. This is core to the product, but future agents or local users with file access could read it.

Skill content
The local `wahoo.db` and `wahoo_fit/` directory contain GPS, heart-rate, and power history. They inherit your training-dir permissions ... Tighten with `chmod 700 ~/.openclaw/workspace/training`
Recommendation

Use a private training directory, apply restrictive permissions such as chmod 700, and avoid sharing the SQLite database or FIT files unless intended.