{"slug": "workbench-a-tui-for-parallel-coding-agents", "title": "Workbench: A TUI for parallel coding agents", "summary": "A new open-source terminal user interface called Workbench allows developers to run multiple AI coding agents side by side in persistent tmux-backed panes. Built with Bun, React 19, and Silvery, it supports agents like Claude Code, Gemini, Goose, OpenCode, and Cursor, along with integrated file viewers and git diff tracking. The tool is installable via a curl command and aims to streamline parallel agent workflows in a full-screen TUI.", "body_md": "\n\n```\n888       888                  888      888                                 888\n888   o   888                  888      888                                 888\n888  d8b  888                  888      888                                 888\n888 d888b 888  .d88b.  888d888 888  888 88888b.   .d88b.  88888b.   .d8888b 88888b.\n888d88888b888 d88\"\"88b 888P\"   888 .88P 888 \"88b d8P  Y8b 888 \"88b d88P\"    888 \"88b\n88888P Y88888 888  888 888     888888K  888  888 88888888 888  888 888      888  888\n8888P   Y8888 Y88..88P 888     888 \"88b 888 d88P Y8b.     888  888 Y88b.    888  888\n888P     Y888  \"Y88P\"  888     888  888 88888P\"   \"Y88888 888  888  \"Y8888P 888  888\n```\n\nA terminal workbench that runs coding-agent CLIs side by side. Each workspace gets a persistent, tmux-backed pane for an agent (Claude Code, Gemini, Goose, OpenCode, Cursor, ...), an integrated file Explorer, extra shell terminals, and rich read-only viewers for the files you are working on — all in one full-screen TUI.\n\n```\ncurl -fsSL https://ehq.so/install | bash\n```\n\nBuilt with [Bun](https://bun.sh), [React 19](https://react.dev), and\n[Silvery](https://www.npmjs.com/package/silvery).\n\n**Multiple agents, side by side.** A left sidebar lists workspaces; each is its own agent session with an independent tab strip (harness panes, terminals, and open files). Switching workspaces swaps the whole strip and restores it on the way back.**Pluggable harnesses.** Claude Code is the default; switch to Gemini, Goose, OpenCode, or the Cursor agent with one flag.**Persistent sessions.** Agent and terminal panes run on a private tmux server, so relaunching (or a hot-reload restart) detaches and reattaches the*same live processes*with tabs intact.**Rich viewers.** Syntax-highlighted text, Preview/Source markdown, images (Kitty graphics / Sixel / true-color half-block fallback), PDFs, video playback, and rendered Mermaid diagrams.**Changes tab.** A live git working-tree diff per workspace, with a sidebar badge when files have changed.**Themes and quick-switch.** Cycle true-color themes and jump between tabs and workspaces with ergonomic`Option`\n\n/`Alt`\n\nchords.\n\n[Bun](https://bun.sh)>= 1.3.5 (the runtime and package manager; the built-in PTY support that backs the agent/terminal panes landed in 1.3.5)`tmux`\n\n(persistent agent/terminal panes)- At least one coding-agent CLI on your\n`PATH`\n\n(e.g.`claude`\n\nfor the default harness) - A terminal that speaks the Kitty graphics protocol for crisp inline images —\nideally\n[Ghostty](https://ghostty.org)(also[Kitty](https://sw.kovidgoyal.net/kitty/)). Sixel terminals work too, and everything else falls back to true-color half-block art.\n\nOptional, for the corresponding viewers (each degrades gracefully if missing):\n\n`ffmpeg`\n\n/`ffprobe`\n\n— video playback`mmdc`\n\n([mermaid-cli](https://github.com/mermaid-js/mermaid-cli)) — Mermaid diagrams rendered as images`pdftoppm`\n\n/`pdfinfo`\n\n(Poppler) — PDF page rendering\n\n```\ncurl -fsSL https://ehq.so/install | bash\n```\n\nThis installs Bun if it is missing, checks out the source into\n`~/.local/share/workbench-cli`\n\n, runs `bun install`\n\n, and symlinks the launcher\nto `~/.local/bin/workbench-cli`\n\n. Pin a specific release with\n`WORKBENCH_CLI_REF=v0.1.0`\n\n, or change the locations with `WORKBENCH_CLI_HOME`\n\n/\n`WORKBENCH_CLI_BIN`\n\n. Tagged builds are published on the\n[Releases](https://github.com/erikqu/workbench-cli/releases) page.\n\n```\ngit clone https://github.com/erikqu/workbench-cli.git\ncd workbench-cli/workbench-ui\nbun install\n```\n\nMake the launcher available on your `PATH`\n\n(optional but recommended):\n\n```\nln -s \"$PWD/../bin/workbench-cli\" ~/.local/bin/workbench-cli\n```\n\nFrom anywhere, launch the workbench in the current directory:\n\n```\nworkbench-cli\n```\n\nOr run it directly without the launcher (from `workbench-ui/`\n\n):\n\n```\nbun run start\nworkbench-cli [path] [--harness <id>] [--hot]\n```\n\n`path`\n\n— workspace directory to open (defaults to the current directory).`--harness <id>`\n\n/`--agent <id>`\n\n— pick the default agent backend:`claude`\n\n(default),`gemini`\n\n,`goose`\n\n,`opencode`\n\n, or`cursor`\n\n.`--hot`\n\n(aliases`--dev`\n\n,`--watch`\n\n) — restart on source changes; near-seamless thanks to tmux reattachment.\n\n| Key | Action |\n|---|---|\n`Ctrl+T` |\nNew terminal in the active workspace |\n`Ctrl+N` |\nNew workspace (folder picker) |\n`Ctrl+H` |\nAdd a harness (agent) to the active workspace |\n`Ctrl+B` |\nToggle the sessions sidebar |\n`Ctrl+W` |\nClose the active file or terminal tab |\n`Ctrl+S` |\nSave the active file tab |\n`Ctrl+Q` |\nQuit |\n`Tab` / `Shift+Tab` |\nCycle focus (or sent to the focused agent/terminal) |\n`Esc` |\nReturn focus to the agent / editor |\n`Option+1..9` |\nJump to that tab in the active workspace |\n`Option+Shift+1..9` |\nJump to that workspace |\n`Option+Space` |\nCycle to the next workspace |\n`Option++` |\nNew workspace (opens the agent picker) |\n`Option+Tab` |\nCycle the UI theme (`Option+Shift+Tab` reverses) |\n`PageUp` / `PageDown` |\nScroll the focused agent / terminal scrollback |\n\nThe top-right `[+]`\n\nmenu opens with a click: `n`\n\nnew workspace, `h`\n\n/`Enter`\n\nadd a\nharness, `t`\n\nnew terminal.\n\nBehavior is driven by environment variables:\n\n| Variable | Purpose |\n|---|---|\n`WORKBENCH_UI_HARNESS_ID` / `WORKBENCH_UI_AGENT_ID` |\nDefault harness id |\n`WORKBENCH_UI_CWD` |\nStarting workspace directory |\n`WORKBENCH_UI_THEME` |\nInitial theme name |\n`WORKBENCH_UI_IMAGE_PROTOCOL` |\nForce image rendering: `kitty` , `sixel` , or `halfblock` (auto-detected by default) |\n`WORKBENCH_UI_CELL_ASPECT` |\nOverride terminal cell aspect ratio for image sizing |\n`WORKBENCH_CLI_HOT` |\nSet to `1` to enable hot-reload (same as `--hot` ) |\n\nPersistent state (workspaces, tabs, sidebar, theme) is saved under `~/.workbench`\n\n,\nand the private tmux server uses the socket `~/.workbench/tmux-ui.sock`\n\n.\n\n`bin/workbench-cli`\n\nis a thin bash launcher that execs the Bun app in\n`workbench-ui/`\n\n. The app is organized into purpose folders under\n`workbench-ui/src/`\n\n:\n\n```\napp/         the controller (lifecycle, actions, diff polling, render throttle)\nstate/       app state, session/harness models, persistence\nterminal/    PTY panels (@xterm/headless), terminal probing, cell sizing\nmedia/       image/Kitty/Sixel pipeline, mermaid, pdf, video, splash\nui/          theme tokens and toasts\ntext/        regex syntax highlighting, diffing, file-tree, editor model\ncomponents/  React/Silvery views (Workbench, sidebar, tabs, dialogs)\n  viewers/   per-kind file viewers (markdown, image, pdf, video, text)\n```\n\nSee [AGENT.md](/erikqu/workbench-cli/blob/main/AGENT.md) for the in-depth architecture, performance, and\ninput-handling notes.\n\nAll commands run from `workbench-ui/`\n\n:\n\n```\nbun run typecheck     # tsc --noEmit\nbun test              # unit tests\nbun run check         # Ultracite/Biome lint + format check\nbun run fix           # apply formatting/safe fixes\nbun run screenshot    # Playwright interaction + screenshot suite\n```\n\nThe screenshot suite drives the real app in a headless-browser PTY and doubles as a golden-master regression check; run it pointed at the package root:\n\n```\nWORKBENCH_UI_CWD=\"$PWD\" bun run screenshot\n```\n\nIssues and pull requests are welcome. Before opening a PR, run `bun run typecheck`\n\n, `bun test`\n\n, and `bun run check`\n\n, and make sure the screenshot suite\nstill passes.\n\n[MIT](/erikqu/workbench-cli/blob/main/LICENSE).", "url": "https://wpnews.pro/news/workbench-a-tui-for-parallel-coding-agents", "canonical_source": "https://github.com/erikqu/workbench-cli", "published_at": "2026-06-26 22:38:59+00:00", "updated_at": "2026-06-26 23:06:52.416468+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "large-language-models", "generative-ai", "ai-agents"], "entities": ["Bun", "React", "Silvery", "Claude Code", "Gemini", "Goose", "OpenCode", "Cursor"], "alternates": {"html": "https://wpnews.pro/news/workbench-a-tui-for-parallel-coding-agents", "markdown": "https://wpnews.pro/news/workbench-a-tui-for-parallel-coding-agents.md", "text": "https://wpnews.pro/news/workbench-a-tui-for-parallel-coding-agents.txt", "jsonld": "https://wpnews.pro/news/workbench-a-tui-for-parallel-coding-agents.jsonld"}}