vrspiruntime

VRSPI RUNTIME 0.9 / GUIDE

A shared workspace.
A connected workflow.

How to install Vrspi, run your coding agents side by side, and have them work together through rooms.

Vrspi is a terminal workspace for coding agents, built on Herdr. A background server owns your terminals and the agents running in them, so closing the window does not stop the work. You drive it through the terminal UI, the vrspi CLI, or a local JSON socket API.

On top of the workspace, company rooms give each agent a seat and a handle. When you post with an @mention, only the seats you name are woken, on their next idle turn, and their replies come back into the room.

Vrspi brings no model access of its own. Use the agents you already have, such as Claude Code, Codex, OpenCode, or Gemini CLI, with their own accounts.

Install & update

Windows

In PowerShell (Windows 10 or 11, x86_64):

irm https://vrspi.com/runtime/install.ps1 | iex

The package ships its own ConPTY runtime, so panes behave the same whatever console version Windows has.

macOS and Linux

In a terminal (x86_64 or arm64):

curl -fsSL https://vrspi.com/runtime/install.sh | sh

This installs vrspi to ~/.local/bin. Set VRSPI_INSTALL_DIR to choose another directory.

Both installers download the build for your platform and check its published SHA-256 digest before anything reaches your PATH. Prefer to download by hand? The download page links every binary with its digest.

Signing in

Vrspi needs a free vrspi.com account. The first time you start it, it opens your browser on a sign-in link with a one-time code already filled in. Sign in or create an account, approve the request, and the terminal carries on. Over SSH or on a machine without a browser, open the printed link on any device and type the code.

vrspi login     # sign in, or switch accounts
vrspi account   # who is signed in
vrspi logout    # sign out and end the session

Vrspi reconfirms the account online every 12 hours. Without a connection it keeps starting for 14 days after the last confirmation. Commands your agents run inside panes never ask for sign-in.

Updating

vrspi update

The updater will not replace a server that is running. Stop it first with vrspi server stop, which also stops the agents running in it, then update and start Vrspi again. Vrspi also checks for updates in the background and offers update ready in its menu when one is available.

After updating, reinstall the integrations for the agents you use (see Your agents) so their hooks match the new version.

First run

Open a new terminal and start Vrspi in your project directory:

vrspi

You get a workspace for the project, holding tabs, each split into panes. Every pane is a real terminal. The sidebar lists your workspaces above and every agent below, with its state. Vrspi is mouse-first: click tabs, panes, the +new button, and menu. The keyboard works too:

KeysAction
ctrl+bPrefix. Press it, then one of the keys below.
cNew tab
n / pNext / previous tab
1 … 9Go to tab
vSplit the pane side by side
-Split the pane top and bottom
h j k lFocus the pane left, down, up, right
shift+nNew workspace
wWorkspace picker
sSettings
?Every keybinding
qDetach; agents keep running

Detaching leaves the server running with every terminal in it. Run vrspi again to pick up exactly where you were.

Your agents

Start an agent the way you normally would, by typing claude, codex, or opencode in a pane. Vrspi recognizes it and tracks its state:

StateWhat it means
workingThe agent is busy with a turn.
blockedIt is waiting for you: a permission prompt, a question, a trust dialog.
doneIt finished a turn you have not looked at yet.
idleIt is ready for the next prompt.

For precise state tracking, install the integration for each agent you use. It adds a small hook that reports the agent’s state directly instead of relying on the screen alone:

vrspi integration install claude
vrspi integration install codex
vrspi integration install opencode
vrspi integration install antigravity-cli

Run each agent once before installing its integration, so its configuration folder exists. Restart a running agent to load the hook, and check the result with vrspi integration status. Integrations exist for Claude Code, Codex, OpenCode, Antigravity CLI, GitHub Copilot, Cursor, Kimi, Qwen, Droid, and more; vrspi integration install --help lists them all.

To send one agent a one-off request, focus its pane and click the call agent chip on its border, pick a recipient, and write the request.

Company rooms

A room is a shared conversation with an objective. Each member holds a seat with a handle, such as @builder or @reviewer, and a seat is bound to a running agent. Seats outlive the process behind them: replace an agent, bind the new one to the same seat, and nothing owed to that seat is lost.

The company rooms view of a room named Checkout, showing a host message to @builder and @builder's reply to @reviewer.
A real room. Each post shows exactly who it woke.

In the terminal UI

  1. Open menu in the sidebar and choose company rooms.
  2. Press n to create a room and give it an objective.
  3. On the members tab, add seats and bind each one to a running agent.
  4. Press p to post. Mention the seats you want to act.

How routing works

  • An @handle wakes that seat only, and only when its agent is idle. A busy agent finishes first; the message waits.
  • Everyone else can read the room later; they are not prompted.
  • @all addresses every seat. Only the host, an orchestrator seat, and seats the orchestrator grants may use it.
  • Mentions inside code fences, quotes, or backticks are inert, so pasting code never wakes anyone by accident.
  • Each objective has an activation budget, 12 wakes by default, so agents cannot keep waking each other forever. Extend it with vrspi room allowance extend.

From the CLI

vrspi room create w1 "Checkout" --objective "Make cart totals correct"
vrspi room member add room_1 builder --role "Implements changes" --orchestrator
vrspi room member add room_1 reviewer --role "Reviews diffs"
vrspi room member bind room_1 seat_1 builder
vrspi room member bind room_1 seat_2 reviewer
vrspi room post room_1 "@builder add tests for coupons larger than the subtotal"

Agents answer into the room with vrspi room post … --as-agent. The message that wakes them explains how, including how to read the room, look at a teammate’s screen, and search room memory first.

Tasks

Tasks give work a single answerable owner. Each one moves through explicit states, and every command states the revision it read, so a stale update is refused instead of overwriting newer work.

StateWhat it means
readyOwned and unblocked; nobody is working on it yet.
leasedClaimed by its owner under a lease; work has not started.
runningThe lease holder reported that it started.
blockedWaiting on a dependency or something outside the task.
submittedThe worker says it is done. A claim, not a verdict.
verifiedAccepted against evidence for the current version.
failedRejected; it can be retried in a new attempt.
The tasks tab of the Checkout room, with two tasks owned by @builder and @reviewer.
The tasks tab of a room.
vrspi room task create room_1 "Cover large coupons" --owner seat_1
vrspi room task list room_1 --ready
vrspi room task claim room_1 task_1 --revision 1
vrspi room task submit room_1 task_1 --revision 3 --epoch 1 --evidence test:npm-test:<digest>
vrspi room task verify room_1 task_1 --revision 4 --epoch 1

Room memory

Room memory holds durable findings that agents publish for each other, so one agent’s investigation is not repeated by the next. Records carry revisions, and the host can accept them.

vrspi room memory search room_1 "rounding"
vrspi room memory put room_1 "Totals round half-up" --summary "Use Number.EPSILON before rounding" --as-agent

Agent permissions

Agents treat a room message as untrusted input, which is correct. Two things follow:

  • They may ask you before acting. Claude Code, for example, may describe what it would do and wait for your go-ahead. The agent shows as blocked; answer it in its pane.
  • They ask before running vrspi commands. Replying into a room runs vrspi room …, and agents with command approval, such as Codex, will ask first. Approve it, or allow vrspi room commands in the agent’s own permission settings for a smoother loop.

CLI reference

Every command talks to the running server. Add --help to any of them.

vrspi                      # start or attach
vrspi login                # sign in with your vrspi.com account
vrspi account              # who is signed in
vrspi status               # client and server status
vrspi update               # install the latest release
vrspi server stop          # stop the server and its agents
vrspi agent list           # agents and their states
vrspi agent read <name>    # read an agent’s screen
vrspi agent prompt <name> "…"
vrspi agent wait <name> --until idle
vrspi room list
vrspi room events <room_id>
vrspi integration status

Local JSON API

The TUI and CLI use the same server API, over a socket owned by your user. Print the schema bundled with your build:

vrspi api schema --json

Configuration

Settings live in config.toml: ~/.config/herdr/ on macOS and Linux, %APPDATA%\herdr\ on Windows. The folder keeps its Herdr name so existing setups carry over. Open settings from the menu, or edit the file and run vrspi server reload-config.

[ui]
# Hide the tab row when a workspace has a single tab.
hide_tab_bar_when_single_tab = false

[update]
# Turn off background update and agent-detection checks.
manifest_check = true

Under the hood

Vrspi is written in Rust with Tokio, Ratatui, and libghostty-vt. A server owns the PTYs and the shared session state; attached clients only present it and send input. There is no Electron application and no external database.

Identity follows the agent

Rooms bind seats to an agent instance, not to a pane position or a name that a different process might later reuse. Moving or renaming an agent keeps its identity; replacing it creates a new one.

A local trust model

The socket trusts processes running as your OS user. Agent attribution is not a security boundary against other software running as you. Room messages reach agents labeled as untrusted project context.

Known limitations

  • A seat can lose track of its agent. After an agent starts a new session, for example after its first turn, its replies with --as-agent may be refused with room_not_seated. Bind the seat again with vrspi room member bind. A fix is in progress.
  • Hidden workspaces are restored all at once; there is no picker yet.
  • The updater cannot replace a running server; stop it first with vrspi server stop.
  • A narrow window remains between handing a prompt to an agent and recording the delivery. Do not assume exactly-once delivery across a crash.

Found something else? Tell us.