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.

ble

Reads the treadmill

Native LifeSpan support plus generic FTMS, straight over Bluetooth LE. No dongle, no vendor app.

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. Two ways in.

Native adapter

LifeSpan

LifeSpan consoles speak a proprietary protocol, so Trot ships a native adapter for them — developed and tested against a LifeSpan walking pad. No app, no account.

Standard FTMS

Anything that broadcasts FTMS

Trot reads any treadmill that broadcasts the standard Bluetooth Fitness Machine Service — walking pads and full-size machines. Models documented to broadcast FTMS include Horizon AT-series, Technogym MyRun, BowFlex T9, 3G Cardio, Matrix (XER-02+) and newer WalkingPad/KingSmith pads — it's per-model, so check yours.

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 aren't signed yet, so an archive downloaded in a browser — rather than via the installer above — is quarantined; clear it with xattr -dr com.apple.quarantine ./trot.

# …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.
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?+
Two ways: a native adapter for LifeSpan under-desk treadmills (which use a proprietary protocol), and the standard FTMS Bluetooth profile for anything else that broadcasts it — walking pads and full-size treadmills. Models documented to broadcast FTMS include Horizon AT-series, Technogym MyRun, BowFlex T9, 3G Cardio, Matrix (XER-02+) and newer WalkingPad/KingSmith pads. It's per-model, so check for an “FTMS” or Zwift/Kinomap mode on your unit. 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. You need a Bluetooth adapter and a Rust toolchain to build it.
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

Who built this.

A small project, honestly credited. Avatars are served from this site, not fetched from GitHub — the page shouldn't tell anyone else that you visited.

Trot's LifeSpan support was bootstrapped from and cross-checked against treadspan (MIT) — without that work this would have started from a blank protocol. Want to be on this list? Trot is GPLv3 and the issues are open; adapters for other treadmills are 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.