Local Tenstorrent inference · from your Mac
Discover a Tenstorrent QuietBox on your LAN like an AirPlay device.
Pair once. Run a model. Point any OpenAI client at one
/v1 endpoint — no drivers, no SSH gymnastics, no llama.cpp.
A native macOS control room rides on top for the days
you'd rather click than type.
The problem
A Tenstorrent QuietBox is a datacenter's worth of inference sitting three feet away — four Blackhole chips, 128 GB of memory, ~2.6 PFLOPS. But reaching it from your daily-driver Mac usually means SSH sessions, remembering IPs, hand-launching containers, and copy-pasting ports.
tt-station is the thin glue that closes that gap. The serving half already
existed — tt-inference-server's vLLM /v1 on the box, and macOS
Bonjour for zero-config .local discovery. What was missing was a small
discovery/pairing layer, a friendly CLI, and a native menu-bar app to tie them together.
tt-station is exactly that glue.
The result feels less like operating a server and more like casting to a speaker: it shows up, you pick it, it just works.
The real menu-bar popover — glance, Run/Stop, open the control room. TTStation.app, shipped.
How it works
tt-station adds a small box-side agent and a Mac-side CLI (plus a native app built on it) on
top of the serving stack you already run. Discovery, pairing, and an optional SSH handshake
happen over the LAN; serving is delegated to tt-inference-server's
run.py/vLLM on the box, behind a backend seam that keeps the serving details off
the Mac.
OPENAI_BASE_URL_tenstorrent._tcp + device meshstable/bleeding)/v1/models/v1Two sides, one workflow
The two halves of tt-station ship independently but are designed as one product: everything
the agent learns about the box — its device mesh, its temperatures, what's serving — surfaces
natively in the Mac app, and everything the app does is just tt-station --json underneath.
crates/tt-station-agentd · Linux, on the QuietBoxtt-smi (e.g. p300x2) at startup and advertises it over mDNS — no manual device flags.agentd.toml defines profiles like stable/bleeding — different repo checkouts or images, picked with tt-station config / --profile./ssh/authorize, tt-station ssh-authorize) — no password prompts for the workbench./v1/models actually lists the model.
The box panel on the QuietBox's own screen — live 6-digit code, start/stop, profile picker.
macos/TTStation · v0.5.0, native appMenuBarExtra popover for glance and quick actions, backed by a resizable window with a boxes sidebar and a card-based detail pane./telemetry WebSocket, color-ramped, with a jump to the deeper tt-toplike view.tt-toplike, and VS Code Remote-SSH launchers.tt-station --json and renders the result, so the CLI's behavior is always the truth.
The control-room window — device mesh, live telemetry, config, and a hardware-aware model browser.
See it running
Everything below is the live qb2-lab box — four Blackhole chips — driven from a Mac over the LAN.
Not mockups: the deep hardware view, the remote workbench, and the one-click Connect launchers.

Live hardware. tt-toplike --remote qb2-lab — four Blackhole devices, streamed from the agent.

Workbench. VS Code Remote-SSH into the box, with the tt-vscode-toolkit lessons and tt-smi.

One-click Connect. Open WebUI / opencode, plus the Terminal · tt-toplike · VS Code workbench.
What you get
_tenstorrent._tcp over Bonjour/mDNS. tt-station discover lists them by name — no IPs to memorize. On locked-down networks, add a host manually or over Tailscale./v1 endpointtt-station endpoint hands you a working OPENAI_BASE_URL — point curl, Cursor, or the openai SDK straight at it.agentd.toml defines profiles like stable/bleeding — different repo checkouts or images. Switch with tt-station config / --profile; no file at all means unchanged flag-only behavior./v1 your box already serves. Nothing to port, nothing to recompile — the endpoint is the product.tt-toplike --remote <box> for the deep hardware view — Tensix, DRAM, temps — from your Mac. Experimental.The payoff
Once tt-station endpoint sets OPENAI_BASE_URL, your QuietBox is a drop-in for
anything that talks to the OpenAI API. Same code you'd point at a cloud provider — pointed at
the box on your desk.

Open WebUI talking to Llama-3.3-70B on the box — one click from the Mac app.

opencode pointed straight at the box's /v1 — a terminal agent on local silicon.
Get started
Two machines: the QuietBox (which already runs tt-inference-server) and your Mac.
Grab the latest tagged release — a macOS app (.dmg) and Ubuntu packages
(.deb) — or build the Rust binaries from source with cargo.
Download a release
On your Mac
Download TTStation-<version>-arm64.dmg from the latest release and drag TTStation.app into Applications. The app isn't code-signed yet, so clear the quarantine flag once:
xattr -dr com.apple.quarantine /Applications/TTStation.app
Launch it from Applications — it lives in the menu bar. The DMG bundles the tt-station CLI and offers to add it to ~/.local/bin on first run, so the CLI steps below work too.
On the QuietBox (Ubuntu)
Download the tt-station .deb matching your Ubuntu release (noble or jammy) from the latest release, install it, and enable the box agent as a user service:
sudo apt install ./tt-station_<version>_amd64_noble.deb
systemctl --user enable --now tt-station-agentd
The optional tt-station-panel .deb adds the on-box GTK control panel. These packages aren't signed or served from an apt repo — you're installing a local .deb you downloaded.
xattr step above) and the .debs aren't served
from a signed apt repo. Every tagged release ships the same artifacts, built in CI.
Build from source
On the QuietBox
Build and start the box agent. It advertises itself over mDNS, auto-detects the device mesh from tt-smi, and drives serving through run.py/vLLM.
cargo build --release -p tt-station-agentd
./target/release/tt-station-agentd \
--name qb2-lab --ctrl-port 8765 \
--backend runpy \
--tt-inference-repo ~/code/tt-inference-server \
--serving-image ghcr.io/tenstorrent/tt-inference-server/...
Prefer a config file? Define stable/bleeding profiles once in agentd.toml and start with --profile stable instead of repeating flags — see docs/reference/agentd-config.md.
On your Mac
Build the CLI, then discover the box and pair with the 6-digit code it prints. Add --enable-ssh to also install your Mac's key for keyless access.
cargo build --release -p tt-station
tt-station discover
tt-station pair qb2-lab.local:8765 --enable-ssh # enter the code shown on the box
Or install TTStation.app — it drives this same CLI from a menu bar popover and control-room window; see macos/README.md.
On your Mac
Run a model and grab the endpoint. tt-station run waits until the box reports healthy.
tt-station run Qwen3-8B --host qb2-lab.local:8765
eval "$(tt-station endpoint --host qb2-lab.local:8765)"
echo "$OPENAI_BASE_URL" # → http://qb2-lab.local:8002/v1
Anywhere
Point any OpenAI client at it — you're talking to silicon on your desk.
curl "$OPENAI_BASE_URL/chat/completions" \
-H "Content-Type: application/json" \
-d '{"model":"Qwen3-8B","messages":[{"role":"user","content":"hi from my Mac"}]}'
cargo run -p mock-box -- serve --ctrl-port 8899, then
tt-station discover --no-mdns --host 127.0.0.1:8899. The full
discover → pair → run → completion path is exercised end-to-end in CI, no chips needed.
Under the hood
tt-station deliberately builds little. The heavy lifting — compiling models to Tensix cores and serving vLLM — already exists and is battle-tested. The new code is a discovery/pairing daemon, a typed HTTP client, a secret store, and a CLI, all in one small Rust workspace.
Every serving path hides behind a ServingBackend trait, so the
proven run.py/vLLM launch used today stays cleanly separated from the Mac-side
code — the client only ever sees one /v1.
/v1, launched via run.py on your box..local resolution and secure token storage, free on every Mac./v1 handoff. Tested end-to-end./v1 endpoint to remember“Station to Station” — the thin glue between your Mac and your QuietBox.
👨🎤 “Such is the stuff, from where dreams are woven.” 👩🎤David Bowie