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
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.
Reads the treadmill
Native LifeSpan support plus generic FTMS, straight over Bluetooth LE. No dongle, no vendor app.
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.
Records sessions
Every walk is written to a local SQLite database with per-minute rollups and retention. Your history, on your disk.
Headless daemon
trot daemon runs quietly in the background — drop it behind systemd, launchd, or a login item and forget it.
Nothing leaves
No accounts, no analytics, no phone-home. Trot binds to 127.0.0.1 and speaks only when spoken to.
Small & portable
One dependency-light Rust binary. Builds and runs on Linux, macOS and Windows from the same source.
Which treadmills work.
Trot reads treadmills over Bluetooth Low Energy — under-desk walking pads and full-size treadmills alike. Two ways in.
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.
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, pair, walk.
Grab a prebuilt binary for macOS, Linux or Windows — or build from source. All you need is a Bluetooth adapter.
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.
Prefer a polished UI over a terminal? Nowhere is the desktop, mobile and web app that runs on this exact engine.
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.
| Endpoint | Returns |
|---|---|
| GET /api/state | Connection status + the live sample (steps, speed, distance, duration) + today's totals. |
| GET /api/today | Today's totals with an hourly breakdown. |
| GET /api/sessions | Session history; /api/sessions/:id for one. |
| GET /api/analytics | Aggregated trends over time. |
| GET /api/steps/by-device | Daily steps split by the device that recorded them. |
| GET /api/export | A full, lossless dump of your data (sessions + samples). |
| POST /api/connect | Reconnect the treadmill; /api/disconnect drops the link but stays paired. |
| POST /api/pair | Pair a device from /api/scan; /api/unpair forgets it. |
| WS /ws | Live 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 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.
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
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
The short answers.
Which treadmills work?+
Do I need an account or the internet?+
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?+
GET /api/export.Which platforms does it run on?+
Is there a graphical app?+
/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?+
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.
Marcus Puchalla
Author & maintainer
@marcuspuchalla
Blake Robertson
Reverse-engineered the LifeSpan protocol
@blak3r · treadspan
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.