Rysh Documentation

Rysh is an agentic terminal multiplexer designed for AI-driven software development. It combines the workspace management of tools like tmux and Zellij with autonomous AI agent capabilities in every pane. Each pane is both a real terminal (backed by a PTY) and an AI agent workspace, letting you seamlessly switch between shell commands and LLM-powered development.

What makes Rysh different? Rysh is built on a supervised actor model over a NATS message bus. Every tab, lane, pane group, and pane is an independent actor with its own AI agent. They communicate by passing messages, so each agent is naturally aware of the context in other panes — enabling powerful multi-agent workflows where agents coordinate, share context, and drive development across your entire workspace.

Key Highlights


Installation

Rysh ships as a single self-contained binary with no runtime dependencies. Choose the method that matches your platform.

The command is ry. The installed binary is named ry, with rysh available as an alternate name. Both invoke the same client/daemon application — the examples below use ry.

One-line Installer (all platforms)

The fastest way to install on any Unix-like system:

curl -fsSL https://packages.rysh.ai/install.sh | sh
The script detects your OS and architecture, downloads the correct binary from packages.rysh.ai, and places it in /usr/local/bin. No sudo required if that path is writable.

macOS — Homebrew

The recommended method on macOS. Works on both Intel and Apple Silicon.

# Add the Rysh tap and install
brew tap rysh-ai/rysh
brew install rysh

Or in one line:

brew tap rysh-ai/rysh && brew install rysh

Upgrade to a new version:

brew upgrade rysh

Linux — Debian / Ubuntu (APT)

# Add the Rysh APT repository
curl -fsSL https://packages.rysh.ai/apt/rysh-gpg.asc | sudo tee /usr/share/keyrings/rysh.asc > /dev/null
echo "deb [signed-by=/usr/share/keyrings/rysh.asc] https://packages.rysh.ai/apt stable main" \
  | sudo tee /etc/apt/sources.list.d/rysh.list

# Install
sudo apt-get update
sudo apt-get install -y rysh

Linux — Red Hat / Fedora / CentOS (RPM)

# Add the Rysh RPM repository
sudo curl -fsSL https://packages.rysh.ai/rpm/rysh.repo \
  -o /etc/yum.repos.d/rysh.repo

# Install
sudo dnf install rysh        # Fedora / RHEL 8+
# or
sudo yum install rysh        # CentOS 7 / older RHEL

Windows — Chocolatey

choco install rysh

Windows — WinGet

winget install RyshAI.Rysh

Build from Source

Requires Go 1.21+.

# Clone the repository
git clone https://github.com/rysh-ai/rysh-cli.git
cd rysh-cli

# Build the binary
go build -o rysh .

# Move to your PATH
sudo mv rysh /usr/local/bin/

Verify Installation

ry --version
# ry 0.1.0 (commit: ..., built: ...)

Requirements


Quick Start

Get up and running in under a minute:

# Start Rysh with the default session
ry

# Or start with a named session
ry my-project

# Create a new pane
# Press Ctrl+N in normal mode

# Switch to AI prompt mode
# Press Escape twice (Double-Escape)

# Type a prompt and press Enter
> refactor the auth middleware and write tests

# Switch back to shell mode
# Press Escape twice again
Tip: Everything in Rysh is event-driven. Tabs, panes, and AI agents all coordinate automatically through events — there is nothing extra to configure for multi-agent workflows to work out of the box.

Configuration

Rysh loads configuration from rysh.config in the current working directory or ~/.config/rysh/rysh.config, using TOML format. Environment variables override file settings.

Configuration File Example

# ~/.config/rysh/rysh.config

[provider]
name = "claude"             # LLM provider name
api_key = "sk-ant-..."      # Anthropic API key
api_url = ""                # Custom API endpoint (optional)
model = "claude-opus-4-5"   # Model (defaults: claude-opus-4-5 / claude-sonnet-4-*)
max_tokens = 8192           # Max response tokens
system_prompt = ""          # Custom system prompt file path

[ui]
shell = "/bin/zsh"          # Shell binary (defaults to $SHELL)
initial_tabs = 1            # Number of tabs on startup
initial_panes = 1           # Panes per tab on startup

[session]
dir = "~/.local/state/rysh/sessions"

[upstream]
enabled = false             # Enable remote collaboration
url = "wss://rysh.ai"    # Upstream server URL
api_key = ""                # Upstream API key
auto_share = false
default_share_mode = "view" # "view" or "control"
reconnect_interval = "5s"
max_reconnect_attempts = 10

Environment Variables

VariableDescriptionDefault
RYSH_PROVIDERLLM provider nameclaude
RYSH_API_KEYAnthropic API key
RYSH_API_URLCustom API endpoint URL
RYSH_MODELModel name
RYSH_MAX_TOKENSMax response tokens8192
RYSH_SYSTEM_PROMPTSystem prompt file path
RYSH_CLAUDE_CMDClaude CLI binary pathclaude
RYSH_BRAVE_API_KEYBrave Search API key (for web_search tool)
RYSH_SESSIONDefault session name
RYSH_SESSION_DIRSession registry directory~/.local/state/rysh/sessions
RYSH_INITIAL_TABSNumber of initial tabs1
RYSH_INITIAL_PANESPanes per tab on startup1
RYSH_UPSTREAM_ENABLEDEnable upstream collaborationfalse
RYSH_UPSTREAM_URLUpstream server URL
RYSH_UPSTREAM_API_KEYUpstream API key
RYSH_UPSTREAM_SHARE_MODEDefault share mode: view or controlview

Tabs & Panes

Rysh organizes everything into a clear hierarchy. A workspace holds tabs; each tab is a screen of lanes (vertical columns); each lane holds one or more pane groups (row slots); and each pane group holds a rotating stack of panes. This is conceptually similar to Zellij but specialized for agentic software development. There is no separate “window” concept.

LevelRole
WorkspaceA configured set of tabs with its own upstream/API key. The cloud tenancy boundary (identified by UUID).
TabA screen of lanes (one tab visible at a time). Owns pipeline state.
LaneA vertical column with a horizontal width weight (flex).
Pane groupA row slot within a lane with a vertical height weight (rowFlex); holds a stack of panes.
PaneOne conversation surface: a PTY shell and/or an LLM agent.

Tab Basics

Pane Basics


Lanes, Pane Groups & Stacks

Within a tab, lanes are the columns and pane groups are the row slots inside a lane. Each pane group holds one or more stacked panes.

Column Layout (Lanes)

Lanes are arranged horizontally as columns, each with a flex weight that determines its share of horizontal space. Creating a new pane (Ctrl+N or Ctrl+P then n) adds a new column to the right. A grid seeds an R×C arrangement of lanes and groups in one shot.

Vertical Splits (Split Down)

Groups can be split vertically within the same column using Ctrl+P then v. This creates a new pane group stacked below the current one in the same column, with vertical space distributed proportionally.

Stacked Panes (Card Deck)

Each pane group can hold multiple panes stacked like a deck of cards. Only the top pane (index 0) is visible and accepts input. Background panes are shown as title bars at the bottom of the active pane's content area.


Input Modes

Each pane has an independent input mode that determines how your input is processed. Toggle between modes with Double-Escape (press Escape twice).

ModeBehaviorToggle
Shell Input is executed as a shell command in the pane's PTY. Esc Esc
Prompt Input is sent to the configured LLM provider as an AI prompt.
Note: Lines starting with ## are always treated as Rysh system commands, regardless of the current input mode. The exception is lines starting with ##>, which are pipeline events.

Interactive Terminal Support

Rysh fully supports interactive terminal programs like vim, htop, less, nano, and top. This is powered by a built-in virtual terminal emulator that provides a full 2D screen buffer.

How It Works

  1. Auto-detection: When the terminal emulator detects alternate screen buffer activation (e.g., when you launch vim), the pane automatically enters raw mode.
  2. Keystroke forwarding: In raw mode, all keystrokes (except Ctrl+O) are forwarded as raw bytes to the PTY for minimal latency.
  3. VT rendering: The TUI renders the terminal emulator's screen buffer directly instead of the plain text output buffer.
  4. Exit: When the program exits (alternate screen deactivated), raw mode ends automatically.

Predictive Local Echo

To keep typing responsive over the network, the interactive (xterm) terminal applies predictive local echo: typed characters are echoed immediately on the client and then reconciled against the authoritative PTY output as it streams back. This hides round-trip latency for shells and editors without desynchronizing the screen.

Scrollback (Copy Mode)

Interactive (raw) panes keep a scrollback buffer you can page through via copy mode — so you can scroll back over a full-screen program's history even while it's running. On the mobile app the same scrollback is available with touch scrolling, and subscribers of a shared pane get their own scrollback too.

Shared Interactive Terminals

Interactive, full-screen programs (vim, htop, Claude Code) also render correctly inside shared panes — the remote viewer reconstructs the live terminal screen, including a CSS scale-to-fit layout and replay on reconnect. This is what powers the interactive terminal in the Rysh mobile app.

Escape Hatch

Ctrl+O is the escape hatch from raw mode. It enters prefix mode, from which you can switch panes, switch tabs, or detach the session. After the prefix action completes, you return to raw mode.

Manual Toggle

Use the ##raw system command to manually toggle raw mode when auto-detection is not desired.

Tip: The PTY environment includes TERM=xterm-256color for full terminal capability reporting. Initial PTY size is 80×24, then updated on first render.

Global Keybindings

These keybindings work in normal mode (when no special mode is active):

KeybindingAction
Ctrl+NCreate a new pane (split right) in the active tab
TabCycle to the next pane in the active tab
[Switch to the previous tab
]Switch to the next tab
Alt+LeftSwitch to the previous tab
Alt+RightSwitch to the next tab
Alt+UpSwitch to the previous pane
Alt+DownSwitch to the next pane
Alt+BPrevious tab (macOS Meta fallback)
Alt+FNext tab (macOS Meta fallback)
Esc EscToggle input mode (shell / prompt)
Ctrl+PEnter pane mode
Ctrl+TEnter tab mode
Ctrl+SEnter stack mode
Ctrl+OEnter prefix mode (tmux-style)
Alt+PEnter Alt-P prefix mode
Ctrl+SpaceEnter navigate mode
Ctrl+LEnter layout mode

Mouse Support


Pane Mode Ctrl+P

Pane mode provides Zellij-style pane management:

KeyAction
nCreate a new pane (split right)
vCreate a split-down pane group (vertical split in same column)
sCreate a stacked pane (on top of the active group's stack)
xClose the active pane (when more than one exists)
rEnter resize mode
dDetach the session
Alt+UpMove to the previous pane
Alt+DownMove to the next pane
Esc / . / Ctrl+PExit pane mode

Tab Mode Ctrl+T

Tab mode follows Zellij-style tab navigation:

KeyAction
nCreate a new tab
19Jump directly to tab by index
Alt+LeftMove to the previous tab
Alt+RightMove to the next tab
Esc / . / Ctrl+TExit tab mode

Stack Mode Ctrl+S

Stack mode navigates stacked panes within the active pane group:

KeyAction
j / Down / Right / lRotate to the next stacked pane (front moves to back)
k / Up / Left / hRotate to the previous stacked pane (back moves to front)
Esc / . / Ctrl+SExit stack mode

Resize Mode

Enter resize mode from pane mode with r:

KeyAction
h / Left / k / UpShrink the active pane
l / Right / j / DownGrow the active pane
Esc / .Return to pane mode
Ctrl+PReturn to normal mode

Raw Mode (Interactive Programs)

Raw mode is automatically activated when a pane detects alternate screen buffer usage (e.g., vim, htop, less, nano). In raw mode:


AI Agent per Pane

Every pane in Rysh is an autonomous AI agent workspace. When you switch to prompt mode (Double-Escape), your input is sent to the configured LLM provider. The AI agent can then use built-in tools to read files, edit code, run commands, search the web, and coordinate with other agents.

How It Works

  1. Each pane manages its own PTY, output buffers, and state independently.
  2. Every pane has a dedicated AI agent that handles prompt execution with tool use.
  3. The agent orchestrates tool calls with approval flows and cancellation semantics.
  4. A new prompt cancels any in-flight completion (“last-prompt-wins” semantics).

Provider

Agents talk to the model through a single AgenticProvider abstraction backed by the Anthropic Claude Messages API. The orchestrator prefers streaming when available and falls back to non-streaming. Key behaviors:

AI responses are rendered as markdown before being appended to the pane output buffer.

Agent Capabilities


Built-in & Dynamic Tools

Every AI agent has access to a comprehensive toolkit for reading, writing, searching, building, and coordinating across your workspace. Beyond the 40+ built-in tools below, the registry is extensible at runtimeMCP servers and Rysh Forge integrations register additional tools that flow through the same approval and redaction path.

Core Tools

ToolDescription
bashExecute shell commands in the pane's PTY
lsLightweight directory listing
file_readRead file contents
file_editEdit a file with diff preview and approval
multi_editAtomic multi-hunk file replacement
file_writeWrite a new file with approval
apply_patchApply unified diff patches
globFile pattern matching
grepContent search with regex support
web_searchSearch the web via Brave Search API
web_fetchFetch and parse web page content

Git Tools

ToolDescription
git_statusShow working tree status
git_diffShow file diffs
git_logView commit history
git_commitCreate a commit (requires approval)

Code Intelligence

ToolDescription
treeDirectory tree visualization
symbol_searchFind declarations and symbols in code

Process & Environment

ToolDescription
process_listList running processes
port_checkCheck if a port is in use
env_readRead environment variables (with secret redaction)

Testing & Build

ToolDescription
test_runRun tests with structured results
lintRun vet, staticcheck, or golangci-lint
buildBuild the project

Background Execution

ToolDescription
bash_backgroundStart a background session (returns session ID)
bash_outputRead output from a background session, or list all sessions
kill_shellTerminate a background session (requires approval)
monitorWatch a long-running command and stream its output (requires approval)

Workspace Awareness

ToolDescription
ask_userAsk the user a question mid-task and block on the answer
pane_inspectInspect another pane's state and output
pane_sendSend commands to another pane
agents_listList all panes and agents in the workspace
session_historyRetrieve conversation history from any pane
sub_agentSpawn a real child agent with its own context window and toolset
todoPer-pane task list (persisted across sessions)
memory_editRead/append/write durable project memory (RYSH.md)
clipboardRead/write system clipboard
context_storeStore key-value context shared across agents
context_recallRecall stored context from the shared store
project_notesShared project notes (.rysh-notes.md)
list_toolsList all available tools

Tool Approval Flow

Tools that modify files or execute commands require explicit approval before execution. Rysh uses two approval strategies:

Preview-First Approval

Used by: file_edit, multi_edit, file_write, apply_patch.

  1. The tool executes and generates a diff preview.
  2. The diff is shown to you for review.
  3. You approve or reject the change.
  4. On approval, the change is applied. On rejection, it is discarded.

Pre-Approval

Used by: bash, bash_background, kill_shell, git_commit.

  1. The tool description and parameters are shown to you.
  2. You approve or reject the execution.
  3. On approval, the command is executed. On rejection, it is skipped.

Loop Detection

Rysh tracks a sliding window of recent tool calls. After 3 identical calls with the same parameters, execution is blocked to prevent infinite tool-use loops.


Multi-Agent Coordination

One of Rysh's most powerful features is the ability for AI agents across different panes to discover and coordinate with each other.

Agent Discovery

The agents_list tool lets any agent enumerate all panes in the workspace, including their current status, mode, and last command. This enables agents to understand the broader workspace context.

Cross-Pane Communication

Shared Context

Tip: Because every pane is event-driven, agents can react to each other's output in real time. Combine ##pane listen with pipeline events to build automated multi-phase workflows where one agent's output triggers another agent's actions.

Project Memory

Rysh gives agents durable, per-project memory in a plain Markdown file named RYSH.md at the project root. It persists facts, conventions, and decisions across sessions so an agent doesn't relearn your project every time.

This is separate from short-term conversation memory (per-pane summarization of older turns) and the cross-agent context_storeRYSH.md is the long-lived knowledge base for the project itself.

LLM Provider

Rysh routes every agent through a single AgenticProvider interface. The shipped implementation targets the Anthropic Claude Messages API; the same engine powers local CLI agents and server-side panes — only the tool registry differs.

AspectDetails
Default modelsclaude-opus-4-5 and claude-sonnet-4-* (configurable via model / RYSH_MODEL)
TransportStreaming preferred, non-streaming fallback
OptimizationsPrompt caching on by default, extended thinking supported
ResilienceIn-provider retry with exponential backoff and optional model fallback
RequirementAnthropic API key (RYSH_API_KEY or [provider] api_key)

Rysh Forge — API Specs to Agent Tools

Rysh Forge turns a machine-readable API specification into governed, agent-callable tools — and, as side artifacts, SDKs, Markdown docs, and a standalone MCP server. Point Forge at a spec and every operation becomes a tool your agents can call, with auth, retries, and response trimming handled for you.

Inputs & Outputs

Governance (avoiding tool explosion)

Using It


MCP Client — Consume External MCP Servers

Rysh is a Model Context Protocol client: it connects to external MCP servers, discovers their tools, and registers each as a first-class agent tool. MCP tools enter the same shared registry every pane uses, so they flow through the normal tool-use, approval, and audit path — indistinguishable from built-in tools.

Forge and the MCP client are complementary: Forge generates a local MCP server from a spec, while the MCP client consumes any external MCP server.

Scoped & Shared Tools

Dynamic tools (from Forge or MCP) can be scoped so they are only visible where you want them, and shared so collaborators can use a forged API live across sessions.

Scopes

Forged-API Sharing

Declarative Startup Configuration

Instead of running ##forge commands by hand, you can declare integrations and subscriptions per workspace in your config file. On startup Rysh applies them automatically — add → enable (at a scope) → optionally share for sources, and subscribe for consumers:

[[workspace]]
name = "backend"

  [workspace.forge]
    # Source side: make these APIs live on startup
    [[workspace.forge.integrations]]
    name           = "weather"          # integration name (tool prefix)
    spec           = "~/specs/weather.json"   # OpenAPI/GraphQL spec
    base_url       = "https://api.example.com" # required if the spec server is relative
    source         = "openapi"          # openapi | graphql (inferred when empty)
    credential_env = "WEATHER_API_KEY"  # env var holding the key (optional)
    enable_scope   = "tab"              # pane | panegroup | lane | tab (empty ⇒ added, not enabled)
    share          = true               # auto-share via the upstream

    # Subscriber side: mount remote shared APIs on startup
    [[workspace.forge.subscribe]]
    api   = "weather"
    scope = "tab"                       # pane | panegroup | lane | tab (default tab)
The declarative config is workspace-scoped and applied a couple of seconds after the session starts. Subscriptions retry briefly so a subscriber can start before the source share is registered.

System Commands Reference

Lines starting with ## are Rysh system commands. They are processed regardless of the current input mode (shell or prompt).

CommandDescription
##helpShow available system commands
##workspace / ##wsWorkspace management (list, create) and delete entities by id
##tabTab management (create, rename by id, list, list-panes)
##panePane management (create, rename by id, list --tab, listen, unlisten)
##panegroup / ##pgPane group management
##laneLane (column) management
##newCreate layout entities (e.g. ##new grid 2x2, ##new stack)
##cmdRun a command targeting the originating pane's tab/lane/group
##hopJump focus between panes/tabs
##history / ##hShow conversation/command history
##publicMark pane output as public (visible in shared context)
##privateMark pane output as private
##snapTake a snapshot of the workspace state
##share pane [view|control]Share the active pane with remote collaborators
##share panegroup [view|control]Share the active pane group
##share tab [view|control]Share the active tab
##share listList all active shares
##share statusShow upstream connection status
##unshare paneStop sharing the active pane
##unshare panegroupStop sharing the active pane group
##unshare tabStop sharing the active tab
##upstream sharesList available shares on the upstream server
##upstream subscribe <shareID>Subscribe to a remote share
##upstream unsubscribeStop subscribing to a remote share
##upstream send <text>Send a command to a remote pane (control mode)
##rawManually toggle raw mode for interactive programs
##agentManage headless agents (spawn, metrics, reload-prompts)
##humanoidManage humanoids (spawn agents with Slack/email channels)
##integration / ##intRysh Forge integrations (list, enable, disable, tools, remove)
##mcpExternal MCP servers (add, list, tools, reconnect, remove)
##forge share / ##forge subscribeShare / subscribe to a forged API across sessions
##image <path>Attach an image to the next AI prompt (multimodal input)

Pipeline Events

Lines starting with ##> are pipeline events that bypass the PTY entirely. They are published directly to the pane's output stream as clean event lines, enabling powerful automation workflows between panes.

Event Processing

  1. When a pane receives ##> input, it publishes the event directly to the output stream without shell echo or prompt prefix.
  2. The event flows through the shared output pipeline (with secret redaction applied).
  3. Any pane listening to this pane's output receives and processes the event.

Event Types

Event PatternBehavior
##>event:print:<payload> Forwards <payload> to the listening pane without alias prefix.
##>event:ai:softdev:<lang>:<phase> Triggers the AI agent on the listening pane with a contextual prompt including accumulated context from the source pane.
##>event:sh:softdev:<lang>:<phase> Runs a shell command on the listening pane (e.g., go test -v ./... for unit_testing).

Softdev Phases (Go)

Supported phases for the golang language key:

Context buffering: The listener maintains a 50KB context buffer of non-event output from the source pane, which is automatically included in softdev AI prompts for full situational awareness.

Pane Listening

Panes can subscribe to each other's shared output, enabling real-time context sharing between agents.

Usage

# Subscribe to another pane's shared output
##pane listen <pane-id-or-alias>

# Stop listening
##pane unlisten

How It Works

  1. When you run ##pane listen, the pane starts subscribing to the target pane's shared output stream.
  2. Text output is forwarded to the listening pane with an alias prefix (e.g., [pane-2]).
  3. Pipeline events (##>event:...) are intercepted and dispatched to trigger AI prompts or shell commands on the listening pane.
  4. This enables powerful multi-agent workflows where one pane's output drives another pane's actions.

Session Management

Rysh maintains a local session registry on disk, enabling you to detach, reattach, and manage multiple sessions — similar to tmux or screen.

Session States

StateDescription
runningSession is actively running with a TUI attached.
detachedSession is running in the background without a TUI.
stoppedSession has been cleanly exited.

Session Registry

Session records are stored at ~/.local/state/rysh/sessions/. Each record includes the session name, working directory path, state, PID, and update time.

Detaching & Reattaching


CLI Commands

The ry binary (alias rysh) supports the following CLI subcommands:

Entity management & ##-equivalents. Beyond session lifecycle, ry exposes entity subcommands — ry tab, ry lane, ry pane, ry pane-group, ry stacked-pane, ry pipeline (each with list/create/delete verbs) — plus flag forms (--pane, --cmd, --share) that mirror the in-TUI ## system commands, so you can script Rysh without attaching a TUI.
CommandDescription
ryStart the UI with the default session name.
ry <session-name>Start the UI using the specified session name.
ry attach <session-name>Reattach to a stopped or detached session.
ry detach <session-name>Gracefully detach a running session (sends SIGUSR1).
ry list-sessionsList all known sessions with their states.
ry delete-session <name>Delete a session (removes record, kills process, deletes session data).
ry send <session> <input> Send input to a pane without attaching a TUI. Options: --pane <id>, --mode shell|prompt.
# Start a new session
ry my-project

# Detach the session (from keyboard)
# Press Ctrl+O then d

# List sessions
ry list-sessions

# Reattach
ry attach my-project

# Send a command to a running session
ry send my-project "go test ./..." --mode shell

# Delete a session
ry delete-session my-project

Persistence

Rysh automatically persists your workspace state so that sessions survive restarts. All tab structure, pane output, history, mode, and status are saved and restored seamlessly.

What Gets Persisted

ScopeContents
Workspace Tab structure, pane references, active indices
Per Pane Output buffers (shell, AI, chat, system), command history, status, mode, last command

Persistence Behavior

Session Data

Session data is stored per session at ~/.local/state/rysh/. Deleting a session also removes its data directory.


Sharing Panes

Rysh supports sharing panes, pane groups, and entire tabs with remote collaborators via the upstream server. Two sharing modes are available:

ModeCapabilities
View Remote collaborators can see the pane's output in real-time. Read-only.
Control Remote collaborators can see output and send commands to the pane. Includes a configurable command blocklist for safety.

Sharing Commands

# Share the active pane in view mode
##share pane view

# Share in control mode
##share pane control

# Share a pane group or tab
##share panegroup view
##share tab control

# List active shares
##share list

# Check upstream status
##share status

# Stop sharing
##unshare pane
##unshare panegroup
##unshare tab

How Sharing Works


Upstream Server

The Rysh upstream server (rysh-server) acts as a collaboration hub for sharing panes across sessions and users. It is an optional component for teams that need remote collaboration.

Server Stack

Multi-Tenant Isolation

The embedded NATS server is flat, so isolation is enforced at the WebSocket proxy by a streaming subject-ACL that confines every client to its own workspace subtree (ws.{workspaceID}.> and _INBOX.). A client can never publish to or subscribe to another workspace's subjects.

Upstream Commands

# List available remote shares
##upstream shares

# Subscribe to a remote share
##upstream subscribe <shareID>

# Unsubscribe
##upstream unsubscribe

# Send a command to a remote pane (control mode)
##upstream send <text>

Remote Share Listening

When you subscribe to a remote share, Rysh connects to the upstream server and forwards the remote pane's output to your local pane, prefixed with [remote:alias]. In control mode, you can also send commands back to the remote pane.


Secret Redaction

Security is built into Rysh's sharing architecture. Automatic secret redaction is applied before any output leaves your local session.

Important: While Rysh redacts common secret patterns, always review your shared output configuration and use ##private for sensitive panes to ensure complete protection.

Remote File Browser

Shared panes expose a read-only file browser so collaborators (and the mobile app) can navigate and view files from the machine that owns the share — without opening a shell.

How It Works

  1. The upstream server exposes fs.list, fs.read, and fs.stat operations scoped to a share.
  2. The server holds no local filesystem access — it only authorizes the request and relays it over NATS to the share source, which performs the read and answers.
  3. Directory listings, text files (chunked for large files), and images are returned; a payload cap guards oversized reads.
  4. Access is available to authenticated subscribers and via public token links for view shares.
Security: Browsing is read-only and confined to the share's browse root. Because the server never touches the local disk, nothing outside what the share owner exposes is reachable.

Rysh Mobile App

Rysh Mobile is a native iOS app (React Native) for viewing and controlling your Rysh workspaces on the go. Sign in with email/password or Google, then connect to your upstream workspaces.

Features

Tip: Because the mobile app speaks the same share protocol as the desktop client, anything you ##share from your terminal — a single pane or a whole tab — becomes viewable (and controllable) from your phone.

Actor & Message-Bus Architecture

Rysh is built on a fully message-driven architecture with two foundations: a supervised actor model (protoactor-go) for concurrency, and NATS as the universal message bus. Every component — workspaces, tabs, lanes, pane groups, panes, and AI agents — is an independent actor that communicates by passing messages, never by sharing memory.

Everything is an Actor

The daemon hosts a supervised actor tree (workspace → tab → lane → pane group → pane). Each actor processes one message at a time, so its state needs no locks:

The NATS Message Bus

The daemon embeds a NATS server (with JetStream KV for persistence). The TUI is a pure NATS client — it never reads daemon state directly, it only sends and receives messages over NATS. Every message is a typed Go struct serialized into a compact JSON envelope:

{
  "t": "MsgConversationAppend",   // type tag (discriminator)
  "r": "_INBOX.abc...",           // reply-to subject ("" = fire-and-forget)
  "p": { /* the inner message, embedded JSON */ }
}

Subjects are namespaced per session (e.g. {session}.pane.{id}.output, {session}.pane.{id}.inbox). Cross-machine sharing uses a workspace-scoped scheme (ws.{workspaceID}.share.{shareID}.…) that the upstream server confines each client to.

rysh-proto. The rysh-proto module publishes Protobuf reference schemas (conversationpb, panemsgpb, memorypb, envelopepb) that document these message shapes. The actual NATS wire format is JSON — the canonical serialization types are the Go structs in rysh-shared/msg.

Why Event-Driven?

Key design principle: The TUI never reads internal state directly. All rendering is driven by snapshot events, ensuring a clean separation between the UI and the underlying workspace state.

Agent Awareness

Because every pane and its AI agent are part of the same event-driven system, agents have natural awareness of the broader workspace context.

How Agents See Each Other

Real-Time Context Sharing

When a pane listens to another pane's output (##pane listen), its agent receives a continuous stream of context from the source pane. This enables workflows like:

Tip: This is what makes Rysh fundamentally different from running multiple terminal windows with separate AI tools. In Rysh, agents are first-class citizens of a shared workspace — they can see, communicate with, and coordinate alongside each other.

Subscription Plans

The Rysh upstream server integrates Stripe for subscription billing. New users are automatically placed on a free tier; paid tiers raise the per-plan limits. Each plan caps the following dimensions (a value of 0 means unlimited):

LimitApplies to
MaxWorkspacesWorkspaces you can create on the server
MaxSessionsConcurrent sessions connected to the upstream
MaxPanesPanes within a connected workspace
MaxConnectionsExternal channel integrations (Slack, email, …)
MaxChatbots / MaxChatbotSessionsEmbeddable chatbot widgets and their live sessions
ChatbotMessagesPerDay / ChatbotHistoryDaysPer-day chatbot message quota and transcript retention

Enforcement

For current tier names and pricing, see the pricing page.