Install a runner
Two commands on the box, and a pairing code you generate in the desktop app.
Before you start
The installer refuses anything it cannot support, with the reason:
| Requirement | If it is missing |
|---|---|
| Linux | Refuses, and points macOS users at the desktop app |
| x86_64 | Refuses; arm64 builds are planned |
curl, tar, sha256sum | Refuses, naming the missing tool |
Node is not a requirement — the bundle brings its own.
Install and pair
On the Linux box, run the installer — no root needed.
In the Strado app on your own machine, create a runner pairing code.
Back on the box, pair it with that code. The installer prints this exact line for you when it finishes.
The two commands, in that order:
curl -fsSL https://api.strado.io/install-runner.sh | sh
strado-runner pair --code PAIR-XXXX-XXXX
Pairing prints paired as "<name>" and restarts the service. The runner then
appears in your desktop app, and its worktrees show up in the sidebar next to
your local ones.
A pairing code expires, and works once. The app shows how long a code has left when it gives you one; if you come back to a stale code, or have already used it, generate another rather than retrying that one.
pair takes --name <name> to choose the runner's name rather than take the
default from the hostname. A box that is already paired refuses to pair again
unless you add --force.
Note
The installer never prompts for the code. It is piped from curl, so its
stdin is the script itself — and a pasted secret would end up in your shell
history. Pairing is always a separate command you run yourself.
What the installer did
It installs under ~/.strado/runner, keeping versions side by side:
| Path | What |
|---|---|
~/.strado/runner/versions/<version>/ | One unpacked bundle per version |
~/.strado/runner/current | Symlink to the active version — an upgrade swaps this |
~/.strado/runner/bin/strado-runner | The command, resolving through current |
~/.strado/runner.json | This box's paired identity |
~/.strado/runner.env | Optional KEY=VALUE settings, read at start |
It verifies the download's sha256 against the release feed and refuses to install on a mismatch, unpacks beside the running version rather than over it, and checks the bundle is complete before it becomes reachable.
It also appends ~/.strado/runner/bin to your PATH in ~/.profile, which
takes effect in new shells. Re-running the installer upgrades in place and
leaves your paired identity alone.
The service
If systemd is present, the installer registers a user unit at
~/.config/systemd/user/strado-runner.service and enables lingering for your
account.
Both halves matter. A user unit runs as you, so the runner can read your SSH keys and git config and launch agent CLIs with your credentials — a system service could not. Lingering is what lets a user unit start at boot and survive logout, which is the whole point of a machine you are not sitting at.
Check it:
systemctl --user status strado-runner
strado-runner status
strado-runner status reports the version, the paired identity and its file,
the API and relay it talks to, the service state, and — importantly — whether
lingering is on. It says LINGER OFF — dies at logout when it is not.
Without systemd, the installer says so and you supervise strado-runner
yourself.
Heads up
A systemd user service gets a minimal environment: no .zshrc, no nvm, no
~/.local/bin — which is exactly where claude, codex and opencode
usually live. The installer works around this by snapshotting your login
shell's PATH into the unit. Install a new agent CLI afterwards and that
snapshot is stale, so run strado-runner env to re-capture it and restart
the service. Without that, remote terminals fail with command not found and
nothing explains why.
The commands
| Command | What it does |
|---|---|
strado-runner pair --code … | Pair this box with your account |
strado-runner status | Version, identity, service state, linger |
strado-runner install-service | Write the systemd unit and enable lingering |
strado-runner env | Re-capture the login PATH and restart |
strado-runner logs | Tail the journal, or the log file without systemd. --follow to follow |
strado-runner update | Check for and apply a newer runner build |
strado-runner unpair | Forget this box's identity |
strado-runner version | Print the bundle version |
unpair only forgets the local file. The credential stays valid on any copy of
it, so revoke the runner from your account as well — the command says so.