Open-source treadmill engine · GPLv3

Trot's mark: a pixel-art runner on a treadmill The engine under the desk.

Trot is a small, headless Rust daemon that reads your under-desk treadmill over Bluetooth and serves it as plain HTTP + WebSocket. Run trot daemon, point anything at it. It's the open-source core the Nowhere app is built on.

Rust · GPLv3 · runs offline · zero telemetry

trot — it's really only treadmilling
What it is

One binary between your treadmill and everything else.

No GUI, no account, no cloud. Trot connects to the belt, keeps the record, and exposes it on localhost. What you build on top is up to you.

api

Local HTTP + WebSocket

A tiny axum server on loopback: poll /api/state or subscribe to /ws for a live stream of steps, speed and distance.

rec

Records sessions

Every walk is written to a local SQLite database with per-minute rollups and retention. Your history, on your disk.

svc

Headless daemon

trot daemon runs quietly in the background — drop it behind systemd, launchd, or a login item and forget it.

priv

Nothing leaves

No accounts, no analytics, no phone-home. Trot binds to 127.0.0.1 and speaks only when spoken to.

rust

Small & portable

One dependency-light Rust binary. Builds and runs on Linux, macOS and Windows from the same source.

Compatibility

Which treadmills work.

Trot reads treadmills over Bluetooth Low Energy — under-desk walking pads and full-size treadmills alike. Six protocol families: five native adapters plus the standard FTMS profile for everything else.

One honest line before the list: two of these are tested on real hardware — LifeSpan here, and the Urevo URTM030 by the contributor who added it. The remaining adapters are independent implementations written from published protocol documentation and open-source reverse engineering, validated against captured frames where captures exist — never against a physical device. If you own one, a report tells us whether it works — still the most useful contribution anyone can make, and how the Urevo got here.

native · tested

LifeSpan™

The proprietary console protocol, developed and tested against a real LifeSpan walking pad. The one family verified on real hardware.

native · URTM030 tested

Urevo™ E1L · URTM030

These pads broadcast FTMS and a proprietary protocol, and only the proprietary one reports steps — so Trot speaks that one. The E1L is checked against published captures; the URTM030 was verified live on real hardware by a contributor, including its different checksum convention, and takes its calories from FTMS where the pad exposes it. Other Urevo pads (Spacewalk) take the FTMS path.

native · untested

WalkingPad™ · WiLink

The legacy KingSmith™ protocol of the A1, A1 Pro, C2, R1 Pro and P1, rebuilt from the canonical open-source reverse engineering and checked against published frame captures. Newer FTMS pads (e.g. the Z1) take the FTMS path.

native · untested

Sperax™ RM01 / RM-02

Speed and steps, honestly: this protocol carries no distance, and Trot won't invent one. The FTMS-broadcasting RM-01 takes the FTMS path.

native · untested

PitPat™ / Deerrun™ / SupeRun™

The shared OEM protocol behind a long tail of budget pads advertising as PitPat-T…, whatever the box says. Steps, distance, time and calories natively, checked against a published frame capture.

standard ftms

Everything that broadcasts FTMS

The standard Bluetooth Fitness Machine Service: Horizon™ AT-series, Technogym MyRun™, BowFlex™ T9, 3G Cardio™, Matrix™, and verified walking pads from Merach™, Sunny Health & Fitness™, CitySports™, WellFit™, Mobvoi™, Sportstech™, YPOO™, TheRun™, Urevo (Spacewalk) and newer KingSmith — where a KingSmith pad broadcasts its step-count extension, steps accrue too.

FTMS is per-model: if your treadmill has an “FTMS” or “broadcast to Zwift / Kinomap” mode, trot scan will find it. Some brands stay closed — iFit (NordicTrack / ProForm), Peloton and Echelon don't broadcast their data, so no third-party tool can read them.

™ Trademarks of their respective owners. See Trademarks.

Install

Install, pair, walk.

Grab a prebuilt binary for macOS, Linux or Windows — or build from source. All you need is a Bluetooth adapter.

# macOS & Linux $ curl -LsSf https://github.com/marcuspuchalla/trot/releases/latest/download/trot-installer.sh | sh # Windows · PowerShell > irm https://github.com/marcuspuchalla/trot/releases/latest/download/trot-installer.ps1 | iex
Or download a binary

Every archive ships a .sha256 next to it. macOS binaries are signed with a Developer ID certificate and notarized by Apple, so they run without a Gatekeeper warning however you download them.

# …or build from source (needs Rust) $ git clone https://github.com/marcuspuchalla/trot $ cd trot && cargo build --release
# pair a treadmill (once), then run the engine $ trot scan # scan + pick one to pair $ trot daemon # track; auto-connects to it
# then, anytime $ trot status # is it up? treadmill connected? $ trot today # today's totals $ trot log --week # recent sessions

Prefer a polished UI over a terminal? Nowhere is the desktop, mobile and web app that runs on this exact engine.

The contract

A local API you can build against.

The daemon picks a free port and writes it to a handshake file; trot status/today/log and Nowhere read it automatically. These are the same endpoints the app uses — nothing is private.

EndpointReturns
GET /api/stateConnection status + the live sample (steps, speed, distance, duration) + today's totals — plus driver (which adapter claimed the treadmill) and steps_supported (null until step data is seen, then true).
GET /api/todayToday's totals with an hourly breakdown.
GET /api/sessionsSession history; /api/sessions/:id for one.
GET /api/analyticsAggregated trends over time.
GET /api/steps/by-deviceDaily steps split by the device that recorded them.
GET /api/exportA full, lossless dump of your data (sessions + samples).
POST /api/connectReconnect the treadmill; /api/disconnect drops the link but stays paired.
POST /api/pairPair a device from /api/scan; /api/unpair forgets it.
WS   /wsLive push: every new sample and session event as it happens.

Reads are open on loopback; anything that changes state needs the per-launch token from the handshake file, sent as x-sc110-token. Point curl, a script, a Grafana panel, or your own front-end at it. The /api + /ws boundary is deliberately the seam between Trot and Nowhere, so anything Nowhere does, you can too.

Trot & Nowhere

Trot is the engine. Nowhere is the app.

Same author, clean split: an open engine anyone can run and fork, and a polished product that pays for the work. Neither hides the other.

Open source · this page

Trot

The GPLv3 Rust daemon. Talks to the treadmill, keeps the database, serves the API. Headless, hackable, yours.

  • Command line + background daemon
  • Local HTTP + WebSocket API
  • Fork it, script it, self-host it
GitHub
The product · nowhere.fitness

Nowhere Coming very soon

The calm, privacy-first app built on Trot — live sessions, history, analytics and optional encrypted sync, on every platform. Launching soon.

  • macOS, Windows, Linux, iOS, Android, Web
  • One codebase, no data collection
  • Buying Plus keeps the engine funded
nowhere.fitness
Questions

The short answers.

Which treadmills work?+
Six protocol families: native adapters for LifeSpan, WalkingPad/KingSmith (the WiLink generation — A1, A1 Pro, C2, R1 Pro, P1), Urevo E1L and URTM030, Sperax RM01/RM-02 and PitPat/Deerrun/SupeRun — plus the standard FTMS Bluetooth profile for anything else that broadcasts it, walking pads and full-size treadmills alike. Honest caveat: LifeSpan is tested on real hardware by us, and the Urevo URTM030 by the contributor who added it (see Credits); the other adapters were written from published reverse engineering, so a report from a real machine is the most useful thing you can send. Details per family in Which treadmills work. Closed ecosystems — iFit (NordicTrack/ProForm), Peloton and Echelon — don't broadcast and can't be read.
Do I need an account or the internet?+
No. Trot runs entirely offline. It binds to 127.0.0.1, keeps no account, and never phones home — no telemetry, no sign-in, nothing leaves the machine.
Where is my data stored?+
In a local SQLite database on your own disk, with per-minute rollups and retention. Pull a full, lossless dump anytime with GET /api/export.
Which platforms does it run on?+
Linux, macOS and Windows, from the same Rust source. Prebuilt binaries ship on the Releases page; building from source needs a Rust toolchain. At runtime all you need is Bluetooth LE — on Linux that's BlueZ, standard on any desktop distro.
Is there a graphical app?+
Trot is terminal-first and complete on its own. Nowhere is the graphical companion — desktop, mobile and web, running on this same /api + /ws — and it's coming soon. Trot never depends on it, and you're free to build your own client.
How is it licensed?+
Under the GNU GPLv3. Run it, read it, modify it, share it — and keep modified versions open.
Contributors

People who contributed to Trot

Everyone here has opened a pull request on GitHub — code that shipped, not suggestions.

Own a treadmill Trot cannot read? A capture from a real machine is the most useful thing you can send — see CONTRIBUTING.

Credits

Who made this possible.

No manufacturer publishes a specification for any of these treadmills. Everything Trot knows about them, other people worked out first — by capturing traffic, decompiling apps and reading bytes until the fields made sense, then publishing what they found. Trot reimplements these protocols in Rust rather than porting them. Where it does reproduce something literally — a cipher table, a command frame, a device-name list — it says so, item by item, in docs/provenance.md. The facts are theirs; the implementation is ours.

What was learned from whom, with every licence in full, is recorded in THIRD-PARTY-NOTICES.md — and it ships inside every release archive. Want to be on this list? The issues are open, and a report from a treadmill Trot has never met on real hardware is the most useful thing anyone could add.

Free as in freedom. GPLv3.

Trot is released under the GNU General Public License v3. Run it, read it, change it, share it. If you ship a modified version, keep it open — that's the whole deal.