Install dev-mux
"Install" means something different for each role. Pick your role first, then follow the platform steps for that role. With the managed product the hub is provisioned for you — there is nothing to install for the hub role.
Which role am I installing?
- Spoke — a machine that runs your coding agents. Install the
devtooling here. Floor:bash3.2+,tmux,git. - Device — a machine you drive the fleet *from* (laptop, phone, tablet). Install the
devfclient and point it at your hub withDEV_HUB.
If you are unsure: the box where your code and your agents live is a spoke; the box in your hands is a device.
Before you install
Every spoke and every device connects to your hub over Tailscale, a private network. Set that up first — it is the single most important step and the one most people ask about. Follow the Tailscale setup guide to generate a pre-authorized auth key and join your hub's network, then come back here.
Install a spoke
A spoke runs the single-file dev script. It needs no heavy dependencies — no databases, no tokens, no secrets. The one-line bootstrap fetches and installs it:
./install.sh --role spoke
Then wire the spoke up:
- Install your coding agent (for example, Claude Code).
- Run
dev install-hooksso the spoke reports agent activity to your hub. - Edit
.dev/session.confto declare your sessions, then rundev up.
Once a spoke is installed, register it into your fleet — see Add spokes.
Spoke on a Raspberry Pi or cloud VM
The same install.sh --role spoke works on a Raspberry Pi, a GCP/AWS/Azure VM, or any Linux box. The floor is identical: bash, tmux, git. No native code runs on a spoke.
Spoke on macOS (Apple Silicon)
A Mac works as a spoke; the hub drives its tmux exactly like a Linux box. One thing to clear on Apple Silicon: Homebrew is not on the non-interactive PATH that a remote command runs under, so surface dev and tmux on a system path:
sudo ln -sf ~/.local/bin/dev /usr/local/bin/dev
sudo ln -sf "$(command -v tmux)" /usr/local/bin/tmux
Keep the spoke's repo on the internal disk (not an external volume) so macOS file permissions do not block the remote session.
Install a device
A device runs the devf client and connects to your hub. It stores no node configuration.
./install.sh --role device
export DEV_HUB=<your-hub-host>
<your-hub-host> is your hub's Tailscale name (for example hub.tailnet-XXXX.ts.net). Then run the onboarding helper for your platform, for example devf onboard mac.
Windows (WSL2)
tmux and the dev-mux core run under WSL2 on Windows. The PowerShell installer sets up WSL2, installs the tool inside it, and recommends WezTerm:
./install.ps1 -Role device -Hub <your-hub-host> # or -Role spoke
Then drive the fleet from WezTerm into WSL with devf.
iPhone
There is no dev-mux binary for iPhone — it is a client. Install an SSH app (Blink Shell or Termius) and the Tailscale app, sign in to your hub's network, then connect:
ssh <your-hub-host>
devf next so
Your sessions are held on the hub in tmux, so an SSH reconnect drops you back exactly where you were — this is tmux-backed sessions with automatic reconnect, not a special always-on tunnel.
What connects to what
- A device connects to the hub (you drive from here).
- The hub connects to each spoke over Tailscale (this is the reach your hub needs).
- Sessions live on the hub's
tmux, so clients are free to disconnect and reconnect.
Every convenience tier — cockpit, phone, glasses — is additive. The fleet is fully drivable from the smallest tier alone.
Next steps
- Set up Tailscale so your hub can reach your spokes.
- Add spokes to register machines into your fleet.
- Troubleshooting if a spoke does not show up.