Documentation
walkingpad CLI
walkingpad-pp-cli
Install
npx -y @mvanhorn/printing-press-library install walkingpadInstalls the CLI binary and the agent skill for Claude Code, Codex, Cursor, Gemini CLI, Copilot, and more. Add --cli-only or --skill-only for one half. Requires Node.
Documentation
The standalone CLI for WalkingPad treadmills — drive the belt from your laptop over Bluetooth LE, and keep a permanent local history of every walk the belt itself forgets on power-cut.
Every other way to script a WalkingPad lives inside a phone app or a Home Assistant integration. This is a general-purpose CLI: it speaks the reverse-engineered WalkingPad BLE protocol (the ph4r05 lineage), holds a single connection open to actually keep the belt running (a one-shot write can't sustain it), and records each walk to a local history store so streaks, trends, and calorie estimates survive the belt's memory loss.
It is device-native: commands map to BLE device capabilities, not HTTP endpoints. By default it runs replay-backed and never opens a connection, so reading, history, and analytics commands work anywhere and verification never actuates real hardware. Controlling a physical belt requires a binary built with -tags ble_live plus the --live flag — see Live device control.
Created by @tmchow (Trevin Chow).
Live device control (BLE)
By default this CLI is replay-backed and never opens a connection. To control a real device:
- Build with the BLE backend:
go build -tags ble_live ./...(CGO/CoreBluetooth on macOS; pure-Go D-Bus on Linux; WinRT on Windows). The default build links no BLE stack, soscanand any--liveoperation are no-ops without this tag. - Pass
--liveto actuate, with optional--address(skip auto-discovery) and--timeout. Physical-effect and configuration-risk commands also require--confirm-physical-effect(or--dry-runto preview the write first). walkingpad-pp-cli doctorreports whether the live backend is compiled in, the device's service UUIDs, the protocol's operating quirks and proven workflows, and — with--live— whether the device is reachable.walkingpad-pp-cli scan --livelists nearby devices by service UUID.- Your terminal needs OS Bluetooth permission, and most BLE devices accept only one client at a time — close the official WalkingPad app first or the laptop connection will fail.
Safety classes. Each command that touches the belt carries a safety class. physical-effect commands (run, stop, start, wake, set-speed) move the belt; configuration-risk commands (set-mode, every prefs write) change persistent device settings. Both require --confirm-physical-effect to actuate, and both refuse to run under verification. Inspect the full callable/withheld surface with walkingpad-pp-cli capabilities --json.
Why run, not start. A one-shot start write does not keep the belt going — the firmware needs a sustained connection with the right handshake, mode switch, and pacing. run holds that connection for the whole walk (start → hold at speed → record → stop). Use run to actually walk; start/wake/set-speed are low-level single writes for advanced use.
MCP server
walkingpad-pp-mcp is a stdio MCP server that mirrors this CLI's read surface as agent tools. It execs walkingpad-pp-cli (it has no BLE dependency of its own, so it builds and runs anywhere), walks the Cobra command tree, and exposes each command according to its annotations: read commands (status, capabilities, doctor, today, sessions, trends, streak, calories, last-record, profile show, …) are surfaced with readOnlyHint. Commands that move the belt or hold a long-lived BLE connection (run, stop, monitor, record, prefs, set-speed, scan, …) are hidden via the mcp:hidden annotation — a held-connection belt cannot be driven reliably by a one-shot tool call, so the human CLI keeps those and the agent path gets reads plus history/analytics.
Register the server with an MCP host (no JSON config required for hosts that support claude mcp add):
claude mcp add walkingpad-pp-mcp -- walkingpad-pp-mcp
Add to your MCP host's config (e.g. Claude Desktop's ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"walkingpad": {
"command": "walkingpad-pp-mcp"
}
}
}
Quick Start
# Check BLE readiness, build state, service UUIDs, and operating quirks
walkingpad-pp-cli doctor
# Inspect the callable and withheld BLE capabilities with safety metadata
walkingpad-pp-cli capabilities --json
# Today's recorded walking totals (distance, steps, active minutes)
walkingpad-pp-cli today
# Your current consecutive-day walking streak
walkingpad-pp-cli streak
# Per-day distance/steps/minutes over the last two weeks
walkingpad-pp-cli trends --days 14
# Drive a real belt for 30 minutes at 2 km/h and record the walk
# (needs a -tags ble_live build)
walkingpad-pp-cli run --speed 2.0 --duration 30m --live --confirm-physical-effect
Unique Features
These capabilities aren't available in any other tool for this device.
Local history & analytics
The belt loses its run memory on power-cut. This CLI persists every recorded walk to a local store so the long view survives.
-
today— Today's recorded totals: distance, steps, active minutes, session count.walkingpad-pp-cli today --json -
streak— Your current consecutive-day walking streak.walkingpad-pp-cli streak --json -
trends— Per-day distance, steps, and active minutes over a window (including zero-activity days).walkingpad-pp-cli trends --days 30 --json -
calories— Estimate calories burned from your body weight (the number the belt refuses to report). Set your weight first withprofile set --weight <kg>.walkingpad-pp-cli profile set --weight 80 walkingpad-pp-cli calories --days 7 --json -
export— Writedaily.json(last 60 days) andyesterday.jsonso an iPhone Shortcut can log Walking workouts into Apple Health.walkingpad-pp-cli export --json
Reliable live control
-
run— Hold one BLE connection for the whole walk: switch to manual, start the belt at--speed, stream live status, record the walk, and stop with the firmware's ceremony when--durationelapses or on Ctrl-C. The only reliable way to actually walk.walkingpad-pp-cli run --speed 2.0 --duration 30m --live --confirm-physical-effect -
stop— Idle a running belt with the firmware's stop ceremony (speed-0 → settle → standby). A one-shot speed-0 write leaves a walked belt running under weight; the standby switch is what idles it.walkingpad-pp-cli stop --live --confirm-physical-effect -
monitor— Stream live belt telemetry (speed, distance, steps, time) until interrupted.walkingpad-pp-cli monitor --live --duration 30s --json
Device discovery
-
scan— Find any compatible WalkingPad by its BLE service UUID rather than its name, so renamed or family-variant belts are still discovered.walkingpad-pp-cli scan --live
Usage
Run walkingpad-pp-cli --help for the full command reference and flag list, and walkingpad-pp-cli <command> --help for any command's flags and examples.
Commands
Live device control
walkingpad-pp-cli run— Start a guided walk: run the belt over a held connection and record itwalkingpad-pp-cli stop— Stop the belt (speed-0, settle, then switch to standby)walkingpad-pp-cli start— Low-level single start write (does not sustain the belt; preferrun)walkingpad-pp-cli wake— Wake the belt from standbywalkingpad-pp-cli set-speed <kmh>— Single set-speed writewalkingpad-pp-cli set-mode <mode>— Switch belt mode (configuration-risk)walkingpad-pp-cli prefs— Configure belt preferences:max-speed,start-speed,child-lock,auto-start,sensitivity,units(each configuration-risk)
Live telemetry
walkingpad-pp-cli status— Read device status (replay-backed by default; live with--live)walkingpad-pp-cli monitor— Stream live belt telemetry until stoppedwalkingpad-pp-cli last-record— Read the belt's last stored run (time, distance, steps)walkingpad-pp-cli record— Record a live walk into the local history store
Local history & analytics
walkingpad-pp-cli today— Show today's recorded walking totalswalkingpad-pp-cli sessions— List recorded sessions for a date (default today)walkingpad-pp-cli trends— Show per-day walking totals over a windowwalkingpad-pp-cli streak— Show the current consecutive-day walking streakwalkingpad-pp-cli calories— Estimate calories burned (the belt never reports them)walkingpad-pp-cli export— Export daily totals as JSON (e.g. for an Apple Health Shortcut)
Profile
walkingpad-pp-cli profile set— Set your body weight (kg) for calorie estimateswalkingpad-pp-cli profile show— Show your saved body profile
Diagnostics & discovery
walkingpad-pp-cli doctor— Check BLE readiness, build, and (with--live) device reachabilitywalkingpad-pp-cli capabilities— Show generated BLE capability and safety metadatawalkingpad-pp-cli scan— Discover nearby devices by their BLE service (requires--live)walkingpad-pp-cli session— Manage the replay-backed local BLE session runtime (status,start,stop)
Output Formats
# Human-readable text (default in terminal)
walkingpad-pp-cli today
# JSON for scripting and agents
walkingpad-pp-cli today --json
# Agent-friendly JSON (equivalent to --json)
walkingpad-pp-cli today --agent
# Dry run — preview a device write without dispatching it
walkingpad-pp-cli run --speed 2.0 --dry-run --json
Agent Usage
This CLI is designed for AI agent consumption:
- Non-interactive — never prompts; every input is a flag or positional argument
- Pipeable —
--json/--agentoutput to stdout, errors to stderr - Previewable —
--dry-runshows the device write without sending it - Safe by default — replay-backed unless
--liveis passed against a-tags ble_livebuild; physical-effect and configuration-risk commands require--confirm-physical-effect - Read-first MCP surface — the MCP server exposes reads and history/analytics; held-connection control stays on the human CLI
Exit codes: 0 success, 1 error.
Health Check
walkingpad-pp-cli doctor
Reports whether live BLE is compiled in, the active verify/dogfood state, the device's service UUIDs, the protocol's operating quirks and proven workflows, and — with --live — whether the device is reachable. Safe to run anywhere; never actuates the belt.
Configuration
- Live BLE flags (persistent):
--live,--address <addr>,--timeout <dur>(default20s),--dry-run,--json/--agent. - Local history store and profile are kept under the OS user data directory for
walkingpad-pp-cli(created on first write).profile set --weight <kg>is required beforecaloriescan estimate. WALKINGPAD_TRACE=1traces every BLE write and decoded status frame to stderr during a liverun, for diagnosing whether mode and belt-state match expectations.
Troubleshooting
scan/--livedo nothing — You're on the default replay build. Rebuild withgo build -tags ble_live ./...to link the BLE backend.- Live connect fails / device not found — Most belts accept only one BLE client at a time; close the official WalkingPad phone app, then retry. Confirm OS Bluetooth permission for your terminal, and that the pad's display is on.
- The belt auto-stops a few seconds after starting — In manual mode the firmware auto-stops within ~2s if it detects no actual walking (zero steps), even with someone standing still. This is a safety behavior, not an error; sustained running requires real steps.
stopdidn't idle the belt — A bare speed-0 write leaves a walked belt in manual mode (still running under weight). Usewalkingpad-pp-cli stop(or letrunexit), which does speed-0 → settle → standby.caloriessays no weight set — Runwalkingpad-pp-cli profile set --weight <kg>first.
Sources & Inspiration
This CLI was built by studying the reverse-engineered WalkingPad community work, principally:
- ph4r05/ph4-walkingpad — the WalkingPad BLE protocol reference (start/stop ceremony, command spacing, status frames)
Generated by CLI Printing Press
For agents: pass /documentation/walkingpad/agents.md to install this CLI from a prompt.