.gemini/skills/bluetooth-trainer-expert/SKILL.md
Expert guidance on reverse-engineering, testing, and integrating Bluetooth Smart Trainers (Wahoo/FTMS) for fitness applications. Use when building or debugging cycling apps.
npx skillsauth add jasonrowe/wahoo-kickr-randomizer bluetooth-trainer-expertInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill provides a proven workflow for developing biking fitness applications that interact with Smart Trainers (e.g., Wahoo KICKR, FTMS devices). It emphasizes a "Console First" approach to isolate connection and protocol logic before attempting UI integration.
BikeFitnessConsole) before touching the main UI (WPF/MAUI).0x1826) and legacy Wahoo (0xA026...) protocols.Create a lightweight console app to handle scanning, connection, and raw command testing.
Key Features to Implement:
0x1826 (FTMS), 0xA026 (Wahoo), and 0x1818 (Power).Indicate on the Control Point characteristic before sending any write commands. Failure to do so often results in silent failures or "Attribute Not Found" errors on writes.Bluetooth LE GATT characteristics standardly use Little Endian byte order.
0xE8 0x03 -> 0x03E8 -> 1000.UInt16/Int16 values to Little Endian.0x40-0x45) follow Little Endian, always verify proprietary manufacturer-specific characteristics if behavior is unexpected.Identify the correct Control Point (CP) for the device.
00001826-0000-1000-8000-00805f9b34fb00002ad9-0000-1000-8000-00805f9b34fb (Fitness Machine Control Point)0x00 (Request Control).0x07 (Start/Resume).a026ee01-0a7d-4ab3-97fa-f1500f9feb8ba026e005-0a7d-4ab3-97fa-f1500f9feb8b (Often hidden inside the Power Service 0x1818 on some firmware).0x00 (Init/Unlock).Different devices support different modes. Use the Console App to "Scan" OpCodes 0x40 through 0x45 by sending [OpCode, 0x00] and observing the Indication response.
01-OpCode-Result (Where Result 01 = Success, 04 = Not Supported, 40 = Fail).0x40 Level Mode: 0-9 discrete levels. Basic.0x41 Resistance Mode: 0-100% brake force. Most reliable.0x42 Sim Mode Enable: Activates physics engine (Grade/Wind/Weight). Warning: Many older or lower-end devices (e.g., KICKR SNAP) return "Success" for params but FAIL (0x40) when trying to Enable this mode.0x43 Sim Parameters: Sets Grade, Weight, Crr, Cw.If the device fails to support Native Sim Mode (0x42), you must implement Grade-to-Resistance Mapping in software to support "Hilly" or "Mountain" workouts.
Recommended Mapping (User Calibrated):
Map the visual "Grade %" to the device's "Resistance %" (OpCode 0x41).
| Grade Input | Resistance Output | Feel | | :--- | :--- | :--- | | -10% | 0.0% | Coasting / Free spin. | | 0% | 1.0% | Flat road friction (light). | | 20% | 40.0% | Steep climb. (Cap at 40% to avoid "brick wall"). |
Logic: Use a piecewise linear function:
0x2A63 (Cycling Power Measurement).flags & 0x10).
Distance = WheelRevs * TireCircumferenceSpeed = DeltaDistance / DeltaTime0x1816 (Speed & Cadence) or Crank Data in Power (0x1818).01 (Success)?0x41 0x32 (50% res) make it hard to pedal?development
Expert guidance on building modern Windows apps with WinUI 3, WPF, and the MVVM pattern.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------