{"slug": "rysh-an-ai-harness-where-claude-and-codex-agents-work-as-a-team-go", "title": "Rysh – an AI harness where Claude and Codex agents work as a team (Go)", "summary": "Rysh, an open-source agentic terminal multiplexer written in Go, lets Claude and Codex agents work as a team in tabs, panes, and splits, with each pane acting as an agent that can answer prompts and call tools. The CLI, available via `go install` or a prebuilt installer, requires Go 1.25.3 or newer and features SecretNAT for secret substitution. The project includes five narrated walkthroughs demonstrating its capabilities, from basic panes to graph engineering for designing agent fleets.", "body_md": "The [Rysh](https://github.com/rysh-ai/rysh-cli-parent) CLI: an agentic terminal\nmultiplexer written in Go. Tabs, panes, splits, and `vim`\n\n/`htop`\n\nworking exactly\nas you expect — except every pane is also an agent that can answer prompts and\ncall tools.\n\nThis repository holds the CLI itself. It depends on\n[ rysh-cli-shared](https://github.com/rysh-ai/rysh-cli-shared).\n\n**Building or contributing? Start at\n** — it carries the\nMakefile, the Go workspace, and CI, and wires this module to a local checkout of\nthe shared one.\n\n`rysh-cli-parent`\n\nFive narrated, subtitled walkthroughs of what rysh actually does, in order —\n**each one assumes the previous**. Every player below is live on this page; press\nplay, nothing leaves GitHub. The first four are recorded against the build the\n[install](#install) line gives you, so every command in them is one you can type.\n\n1 — Install, and your first tabs, lanes and stacked panes · 1:29\n## 01-first-panes.mp4\n|\n2 — Stop the session, start it again — the agents are still there · 2:44\n## 02-stop-start.mp4Why a session is a daemon and not a terminal. Claude and Codex are each told a codeword, the session is stopped |\n3 — Claude and Codex in three stacked panes at once · 2:07\n## 03-claude-codex-parallel.mp4More than one agent, and more than one vendor, side by side: |\n4 — A fleet that talks to itself, on a shared board · 2:29\n## 04-fleet-board.mp4\n|\n5 — Graph engineering — designing the shape of a fleet · 4:00\n## 05-graph-engineering.mp4The deep end: why an agent org chart is a graph, what the edges mean, and what changes when you remove one. Orders travel |\n\nStart at 1 even if you have used tmux or Zellij for years — the panes look familiar and the session model underneath them does not, which is video 2.\n\nSecretNAT is on by default. Secrets are substituted with tokens in the request body before it leaves the machine, and a response carrying a live credential in plaintext is reported into the pane. Responses are not rewritten — by design.\n\nThe mapping is reversible locally, so `##snat get <token>`\n\nhands you back the real\nvalue in your own pane, and the model only ever saw the token.\n\nTwo binaries exist and they are **not interchangeable**:\n\n| this repository | the prebuilt distribution | |\n|---|---|---|\n| binary name | `rysh` |\n`ry` |\n| how you get it | `go install` , or the installer below |\nits own channels, not documented here |\n\nThe names differ so that one machine can carry both. **Every install command in\nthis README installs rysh**, and a script, alias or doc written for one does\nnot run against the other — which is the whole reason the names differ. Check\nwhat you have with\n\n`rysh version`\n\nor `ry version`\n\n.This repository is the `rysh`\n\nhalf: Apache-2.0, with [LICENSE](/rysh-ai/rysh-cli-code/blob/main/LICENSE) and\n[NOTICE](/rysh-ai/rysh-cli-code/blob/main/NOTICE) beside the source you are reading.\n\n**The open-source build, from source:**\n\n```\ngo install github.com/rysh-ai/rysh-cli-code/cmd/rysh@latest\n```\n\nThe binary lands in `$(go env GOPATH)/bin`\n\nas `rysh`\n\n. Requires **Go 1.25.3 or\nnewer** — the floor declared in this module's `go.mod`\n\n.\n\n**The open-source build, prebuilt:**\n\n```\ncurl -fsSL https://packages.rysh.ai/install-rysh.sh | sh\n```\n\nInstalls `rysh`\n\nfrom this repository's own releases — the Apache-2.0 binary, not\n`ry`\n\n. It resolves the newest release at run time; set `RYSH_VERSION`\n\nto pin one\ninstead, or `RYSH_INSTALL_DIR`\n\nto choose where it lands.\n\n**The prebuilt distribution — installs ry, not rysh.** It is the packaged\nproduct and a separate distribution; nothing in it is produced by this repository,\nso\n\n`ry --help`\n\ndescribing a command is not evidence about the source here. Use\n`go install`\n\nabove if you want the build whose source you are reading.Its install commands are deliberately not reproduced here: this README documents the open-source build. The prebuilt distribution has its own channels and its own documentation.\n\n**WSL2 is the supported path.** Native Windows compiles and runs, but it cannot\nopen a pane — those are two different claims and both are true:\n\n`GOOS=windows GOARCH=amd64 go build ./...`\n\nsucceeds — the windows/amd64 target builds clean from this source. This repository's`.goreleaser.yml`\n\nnames that archive`cli-only`\n\non purpose, so the artifact says what it is.- It\n**cannot start a session.** Rysh's PTY layer has no ConPTY implementation, so`platform.PTYSupported`\n\nis`false`\n\non Windows and every session-opening command is refused up front with WSL guidance — rather than starting a session and then failing on your first pane (`cmd/rysh/pty_preflight.go`\n\n). - What it\n*can*do is the pane-less command set, including talking to a session running in WSL from the Windows side:`rysh send`\n\n,`rysh exec`\n\n,`rysh prompt`\n\n,`rysh list-sessions`\n\n,`rysh install`\n\n,`rysh eval`\n\n,`rysh doctor`\n\n.\n\nFor a real session, install WSL2 and use the Linux instructions inside it — the Linux build runs unmodified:\n\n```\nwsl --install\n# inside WSL\ngo install github.com/rysh-ai/rysh-cli-code/cmd/rysh@latest   # rysh\n```\n\nNative panes need ConPTY behind the same seam; it is not implemented yet.\n\nThis module alone builds standalone — it carries no `replace`\n\ndirective, so the\nshared module resolves from its published version:\n\n```\ngit clone https://github.com/rysh-ai/rysh-cli-code\ncd rysh-cli-code\ngo build ./cmd/rysh          # -> ./rysh\n```\n\nFrom the superrepo, which is how to develop against both modules at once — its\n`go.work`\n\nwires the shared module to the sibling checkout, so an edit there is\npicked up without a release round-trip:\n\n```\ngit clone --recursive https://github.com/rysh-ai/rysh-cli-parent\ncd rysh-cli-parent\nmake build       # -> bin/rysh\nmake install     # -> ~/.local/bin/rysh   (override with PREFIX=)\nmake test        # both modules\n```\n\nGo 1.25.3 or newer either way.\n\n```\nexport ANTHROPIC_API_KEY=sk-ant-...\nrysh onboard --provider anthropic --key-env ANTHROPIC_API_KEY\nrysh doctor\n```\n\n`onboard`\n\nvalidates the key, writes a project-local `rysh.config.yaml`\n\n, and opens\nyour session. `rysh --help`\n\nlists the full command surface.\n\nEach pane has an input mode and `Esc Esc`\n\ncycles it: **shell** (a real PTY) →\n**prompt** (goes to the LLM) → **rysh** (multiplexer commands) → **chat**\n(conversation, no tools). Those four are enabled by default; `##mode list`\n\nshows\nwhat a pane has and `##mode new <mode>`\n\nadds the rest.\n\nThe [parent repo README](https://github.com/rysh-ai/rysh-cli-parent#readme) has\nthe keybindings, sessions, agents and humanoids.\n\nCommands starting with `##`\n\nare typed into a pane in **rysh** mode. From outside\nthe session, `rysh exec -- '##<cmd>'`\n\nruns the same thing and prints its output.\n\n```\nrysh create work          # create and attach; add -d to leave it detached\nrysh list-sessions        # what is running\nrysh attach work          # come back to it later\nrysh detach work          # leave it running\nrysh stop work            # shut the daemon down\n```\n\nA session is a daemon plus its panes. It outlives your terminal, so closing the window detaches rather than kills.\n\nA **tab** holds **lanes** (columns); a lane holds **stacks**; a stack holds panes,\nZellij-style — one expanded, the rest collapsed to a title bar showing `[N/M]`\n\n.\n\n```\n##new tab                 a new tab\n##new lane                a new lane (column) in the active tab\n##new pane                a pane at the bottom of the active lane\n##new grid 4              4 panes stacked in the active lane\n##new grid 3x4            3 lanes x 4 panes, in the active tab\n##new grid 2x3x4          2 tabs x 3 lanes x 4 panes\n##new stack 4             4 more stacked panes in the active stack\n```\n\nLook at what you built, and move things around:\n\n```\n##tab list                ##lane list           ##pane list\n##panegroup layout        the lane layout, whole\n##move pane up|down|left|right      reorder in the stack, or cross to the next lane\n##move pane <p> to-lane <lane>      put a live pane somewhere else\n##tab name build          ##lane name left      ##pane name builder\n```\n\nA stack with an agent in every pane is video 3 of the\n[tutorials](#video-tutorials) at the top of this page.\n\nPanes can run an interactive **Claude** or **Codex**, and rysh remembers which, so\na session stop/start resumes the same conversation:\n\n```\n##claude                  run claude in this pane, resumed automatically\n##codex                   run codex in this pane, same deal\n##pane new --claude \"start on the parser\"    a new pane, already working\n```\n\nThe **agents board** is where those panes talk to each other and to you:\n\n```\n##board open              open the board pane\n##board post <text>       post a milestone\n##board reply <thread> <text>\n```\n\nAn agent inside a pane posts without stealing focus, and reads back:\n\n```\nrysh board post --as \"$RYSH_PANE\" -- 'parser wiring done'\nrysh board tail --limit 20\n```\n\n`##board agent up`\n\nstarts a **board agent** — a hidden pane running Claude that\nsits in the path, routes messages between agents, and refuses a request it knows\nis stale. `##board agent visible`\n\ndraws it without moving your focus;\n`##board agent invisible`\n\nputs it away while it keeps running.\n\nA **fleet** is a named group of panes with a board of its own. Registering one\nopens no panes — it is the cheap half:\n\n```\n##fleet register epic-07 --board epic-07\n##fleet state epic-07 up\n##fleet list              ##fleet show epic-07\n##fleet forget epic-07    drop it; the panes keep running\nrysh board tail --fleet epic-07     # that fleet's stream, not the session's\n```\n\nA fleet may be claudes, codexes, or both — the commands are the same either way.\n\n| Path | What |\n|---|---|\n`cmd/rysh` |\nthe main package — entry point and command surface |\n`internal/tui` |\nthe terminal UI |\n`internal/actors` |\nworkspace / tab / pane / agent actors, proto.actor over NATS |\n`internal/vterm` |\nterminal emulation, including a vt10x fork with scrollback |\n`internal/provider` |\nLLM provider adapters |\n`internal/platform` |\nhost capabilities that change what rysh can do (e.g. PTY support) |\n`action/` |\nthe `setup-rysh` composite GitHub Action |\n\n**This repository is a one-way export** of a tree developed elsewhere, so a commit\npushed straight here is overwritten by the next export rather than kept. That does\nnot make patches pointless — [CONTRIBUTING.md](/rysh-ai/rysh-cli-code/blob/main/CONTRIBUTING.md) explains where one\nactually lands.\n\n**Found a vulnerability? Do not open a public issue, PR or discussion.** Rysh runs\nshell commands and holds provider credentials on a developer's machine, so a public\nreport is an exploit notice. [SECURITY.md](/rysh-ai/rysh-cli-code/blob/main/SECURITY.md) has the private channels.", "url": "https://wpnews.pro/news/rysh-an-ai-harness-where-claude-and-codex-agents-work-as-a-team-go", "canonical_source": "https://github.com/rysh-ai/rysh-cli-code", "published_at": "2026-08-17 22:51:16+00:00", "updated_at": "2026-08-17 23:10:59.862711+00:00", "lang": "en", "topics": ["ai-agents", "developer-tools", "ai-tools"], "entities": ["Rysh", "Claude", "Codex", "Go", "SecretNAT", "rysh-cli-parent", "rysh-cli-shared"], "alternates": {"html": "https://wpnews.pro/news/rysh-an-ai-harness-where-claude-and-codex-agents-work-as-a-team-go", "markdown": "https://wpnews.pro/news/rysh-an-ai-harness-where-claude-and-codex-agents-work-as-a-team-go.md", "text": "https://wpnews.pro/news/rysh-an-ai-harness-where-claude-and-codex-agents-work-as-a-team-go.txt", "jsonld": "https://wpnews.pro/news/rysh-an-ai-harness-where-claude-and-codex-agents-work-as-a-team-go.jsonld"}}