Workbench Server
Workbench Server (workbench-server) is a headless backend for running Claude Code agents on a machine without a desktop environment — a Linux VM, a Mac mini, or any always-on box. Desktop and mobile clients connect to it over an encrypted WebSocket to browse repos, drive chat sessions, and use terminals as if they were local. It’s the same server the desktop app embeds when you click Share this machine; the standalone binary just lets you run it without a GUI attached. See Remote Workspaces for the full connection and collaboration model this page assumes.
Package overview
Section titled “Package overview”Workbench ships as three independent packages — install what you need:
| Package | What it provides | When to use |
|---|---|---|
workbench-cli | workbench command-line client | You want CLI access to a running Workbench instance |
workbench-server | workbench-server headless backend | You want to run agents on a headless machine |
workbench-desktop (Homebrew cask: workbench) | Workbench GUI application | You want the full desktop experience |
workbench-server depends on workbench-cli — your package manager installs it automatically as a matching-version dependency.
Installation
Section titled “Installation”APT (Debian / Ubuntu)
Section titled “APT (Debian / Ubuntu)”# Add the r26d signing key and repository (if not already configured)curl -fsSL https://updates.r26d.dev/apt/r26d-archive-keyring.gpg | sudo tee /usr/share/keyrings/r26d-archive-keyring.gpg > /dev/nullecho "deb [signed-by=/usr/share/keyrings/r26d-archive-keyring.gpg] https://updates.r26d.dev/apt stable main" | sudo tee /etc/apt/sources.list.d/r26d.list
sudo apt updatesudo apt install workbench-serverThis automatically installs workbench-cli as a dependency.
Homebrew (macOS)
Section titled “Homebrew (macOS)”brew install r26d/tap/workbench-serverThe formula depends on r26d/tap/workbench-cli, which Homebrew installs alongside it.
Direct download
Section titled “Direct download”Download the latest workbench-server-<version>-<os>-<arch>.tar.gz tarball from the downloads page. Extract it and install the binary:
sudo install bin/workbench-server /usr/local/bin/Tarballs have no package manager to pull in a dependency, so install the CLI client separately — workbench-server doesn’t strictly require workbench on PATH to run, but the owner/share workflow below assumes the desktop or mobile app is driving it from another machine, and any local scripting needs the CLI too.
Starting the server
Section titled “Starting the server”workbench-serverOn first run this generates a self-signed TLS certificate (cert.pem / key.pem, via rcgen/rustls) in the server’s config directory and starts listening. By default it binds 0.0.0.0 on port 7683 and advertises itself via mDNS on the local network:
workbench-server v0.8.0 listening on wss://0.0.0.0:7683Name: Work Laptop
Certificate fingerprint: 3f:9a:...
Hostname: work-laptop — 0 active share(s). Run `workbench-server share list` to print connection strings.Ready for connections.The console output never prints pairing tokens — only share list and owner mint, run explicitly from a local terminal, do that.
CLI options
Section titled “CLI options”| Flag | Default | Description |
|---|---|---|
--port <port> | 7683 | WebSocket port to listen on |
--bind <address> | 0.0.0.0 | Bind address |
--name <name> | hostname | Display name shown to connecting clients |
--no-mdns | off | Disable mDNS advertisement |
--config <path> | <config dir>/workbench-server/server.toml | Config file path (~/.config/workbench-server/server.toml on Linux, ~/Library/Application Support/workbench-server/server.toml on macOS; override the parent directory with $WORKBENCH_SERVER_CONFIG_DIR) |
Subcommands
Section titled “Subcommands”workbench-server share list # Print connection strings for active sharesworkbench-server owner mint --label <name> # Mint a full-machine owner credentialworkbench-server owner revoke <id> # Revoke one owner credential by idworkbench-server owner revoke --all # Revoke every owner credentialshare list and both owner commands read and write the same config file the desktop app uses, so a share created from the GUI’s Share this machine modal shows up here too — the headless binary doesn’t need to be the thing that created it.
Owner connection security
Section titled “Owner connection security”An owner credential grants the paired client full access to this machine’s Workbench — every repository and workspace, workspace lifecycle, and repo terminals. It’s the model you want when the remote machine is your own (a workstation you drive from a laptop), as opposed to workspace-scoped collaboration shares, which stay GUI-only. See Remote Workspaces → Owner mode for the full feature walkthrough; this section covers the security properties.
- Local-only minting.
workbench-server owner mint --label <name>is the only way to create or escalate to owner scope, and it only runs as a local terminal command on the server machine (SSH is fine — there’s no network RPC that can do this). It creates the config file and TLS certificate if they don’t exist yet, then prints oneworkbench://connection string containing the host, port, pairing token, and the server’s certificate fingerprint (#fp=…). - Fingerprint pinning, not trust-on-first-use. Because the owner connection string embeds the certificate fingerprint, the client verifies it’s talking to that exact server before sending anything on the first connection — unlike scoped shares, which use trust-on-first-use the way SSH’s
known_hostsdoes. - Challenge-response pairing. Authentication is an HMAC challenge-response exchange — the raw pairing token never crosses the wire, and there’s no approval-code prompt (a headless server has nowhere to show one; the pinned certificate plus proof of token possession are the credential).
- No tokens in logs. The server’s console output and startup banner never print tokens —
share listandowner mintare the only commands that do, and they’re deliberate, interactive, operator-invoked actions. - Revocation kills sessions immediately.
workbench-server owner revoke <id>(see the id inshare list) orowner revoke --allremoves the credential from the config; every session it issued dies on its next request and the client shows Re-pair required. If the server process is currently running, restart it — it holds the config in memory and would otherwise overwrite the change on its next save. - Owner ≠ host. An owner session can change this machine’s app settings (see Settings target) and its agent-backend configuration and secrets, but it still cannot manage shares, mint or revoke owner credentials, or stop the server without its local control token — and it can’t be minted or escalated remotely; only that local command can create one.
Best practices
Section titled “Best practices”- Mint credentials only from a local terminal session on the server machine (a systemd/SSH session on the box is fine).
- Use
--labelto name credentials so you can tell devices apart inshare list. - Revoke a credential as soon as a device is lost or no longer trusted.
- Keep the server behind a firewall and expose only the configured port; all traffic is TLS-encrypted, but pointing it directly at the open internet is still more exposure than most setups need.
Connecting from desktop or mobile
Section titled “Connecting from desktop or mobile”- On the server:
workbench-server owner mint --label "my laptop" - Copy the printed
workbench://connection string. - On the client: open Workbench, then + Add remote in the sidebar footer (desktop) or the Advanced entry (mobile).
- Paste the connection string. Pairing completes without an approval-code prompt.
- The server appears in the sidebar as a connection group, with repos and workspaces alongside your local ones.
For LAN setups the server also shows up automatically under Nearby via mDNS (unless started with --no-mdns); for machines reached over Tailscale or a VPN, the manual connection string above is the way in. See Remote Workspaces for reconnection behavior, running the server under systemd, and the full owner-mode feature set.