Show HN: Wmux – A workspace multiplexer for AI agents
By wong2kim
AI 摘要
Hacker News 讨论热度 11 points · 0 comments
原文正文
Run fleets of Claude Code, Codex & Gemini in parallel — each agent in its own pane, or fan one prompt out into N isolated git worktrees you review hunk by hunk. Native on Windows & macOS, with approval gates, agent-to-agent channels, and a real browser your agents drive. Walk away — after a crash or full OS reboot, they come back mid-conversation.
What's a workspace multiplexer? tmux splits a terminal. wmux multiplexes whole workspaces — terminals, agents, git worktrees, a browser, and the channels they coordinate over — all owned by a daemon that keeps them running across quits, crashes, and full reboots. One window. One fleet. Windows & macOS.
A fleet in one window. Two Claude Code agents, an OpenAI Codex pane, and a test run — split into a grid, each pane its own PTY, with the roster and the orchestrator in the side dock.
Orchestrate real agents, not just chat. The orchestrator picks an idle pane, hands it the task, and relays the answer back — while the Git dock and the diff stay open next to it.
Windows — use a package manager (avoids the SmartScreen warning):
winget install openwong2kim.wmuxor choco install wmux · download Setup.exe for offline install — the installer is signed with a SignPath test certificate for now, so SmartScreen still shows an unknown publisher; winget/choco skip the prompt (why?)
macOS (Apple Silicon)
Download the .dmg — Developer ID signed, notarized and stapled, so it opens without a Gatekeeper detour — and drag wmux to Applications. On first launch the wmux CLI installs itself onto your PATH.
Both platforms update themselves in place: wmux checks for a new release every 30 minutes and verifies the download against a published SHA-256 before installing (Windows x64 and macOS arm64).
Linux — experimental AppImage / .deb / .rpm builds are on the releases page.
Prefer a tour first? wmux.app walks through the same features with screenshots.
- 🧵 Task fan-out & harvest — one prompt → N worktree-isolated tasks (idempotent, per-task compensation) · side-by-side diff with hunk adoption (all-or-nothing git apply) · close / one-click PR / cleanup list · mission channels record every decision
- 🌿 Git surface — a Git tab in the dock: worktrees (create / open-as-workspace / remove, no force-delete) + pull requests & comments for the active repo (GitHub via gh, GitLab viaglab, self-hosted included) · read-only workspace diff from the palette · ask the orchestrator about a hunk with the code attached
- 🔁 One-click loops — put the orchestrator on an objective with optional per-iteration steps (a /-picker autocompletes your.claudeskills), a done-when checklist, and a cadence; it keeps working across restarts, event-woken by your agents, and stopping fails closed to report-only
- 🤝 A2A multi-agent — agents message + delegate tasks by pane, gated by a per-pane execute approval, with a pollable task inbox + symmetric reply
- 💬 Channels — Slack-style rooms agents read, post, and get @-mentioned into · server-verified sender · durable per-agent inbox · wmux channelCLI · operators can self-join private agent rooms (audited)
- 🤖 Agent supervision — declare a pane in wmux.json(trust-gated) and the daemon keeps it alive: restart policy, backoff, reboot survival
- 🖥️ Native PTY (ConPTY on Windows, forkpty on macOS) + xterm.js WebGL rendering · 999K-line scrollback · Unicode 11 (correct CJK / emoji)
- ⌨️ Tmux-style prefix (Ctrl+B+ key, 13 actions) · floating pane (Ctrl+`) · scroll bookmarks
- 🔀 Multiview — several workspaces side by side · layout templates · drag-to-reorder sidebar
- 🧩 Plugin host — sandboxed iframe plugins with an explicit permission model
- 🛡️ Token-authed IPC, SSRF guard, PTY input sanitization, randomized CDP port, Electron Fuses
- 📱 wmux web— your live panes in a phone browser (PWA-installable), read-only and loopback-only by default; input and network exposure are explicit, warned-about opt-ins
- ⬆️ In-app auto-update on Windows and macOS (arm64) — checked every 30 minutes, SHA-256 verified against a published manifest before it installs
- 🎨 10 UI themes (Amber by default · Catppuccin · Nightowl · Monochrome · Void · Hinomaru · Taegeuk · Stars & Stripes · Red Dynasty · Custom) and 10 terminal palettes, light ones included · 🌏 23 locales scaffolded — English & 한국어 complete, 日本語 / 中文 in progress — translations welcome
💡 Tip: point Claude Code at the MCP tools (
browser_open,terminal_read,pane_list,a2a_task_send,channel_post) or script thewmuxCLI (wmux send/read-screen/list-panes/wmux channel post) to orchestrate panes programmatically.
⌨️ Keyboard shortcuts
On macOS, app shortcuts live on ⌘ instead of Ctrl (so Ctrl+C, Ctrl+D, and friends pass through to the shell as you'd expect).
📦 Full feature list
Terminal — xterm.js + WebGL, native PTY (ConPTY on Windows, forkpty on macOS), Unicode 11 width tables, split panes, tabs, floating pane, smart right-click (selection→copy / empty→paste / link menu), scroll bookmarks, Vi copy mode, regex search, 999K scrollback with disk persistence, shell integration (OSC 133) for semantic command boundaries (Constrained Language Mode safe).
Keybindings — Tmux-style prefix mode (Ctrl+B, 13 default actions), fully customizable, reset-to-defaults.
Workspaces — drag-and-drop sidebar, Ctrl+1~9 quick switch, multiview, layout templates, full session persistence (layout / tabs / cwd / scrollback), Fleet View cockpit.
Browser + CDP — built-in panel (Ctrl+Shift+L), nav bar / DevTools / back-forward, element Inspector (hover-highlight, click-to-copy LLM context), full automation: click / fill / type / screenshot / JS eval / key press.
Notifications — output-throughput activity detection (not pattern matching, works with any agent), native OS toasts + taskbar flash (Windows) / Dock & menu-bar tray (macOS), process-exit alerts, notification panel (Ctrl+I), Web Audio cues.
Agent detection — Claude Code, Codex CLI, Gemini CLI, Aider, OpenCode, GitHub Copilot CLI. Detects start → activates monitoring, warns on critical actions.
Task journey (fan-out → diff → PR) — spawn up to 8 WorkTask missions from one prompt, each with a dedicated git worktree on a fresh wtask/* branch, its own task workspace, a private mission channel, and a file-backed initial prompt. Idempotency-keyed end to end; per-task failures compensate individually, and worktrees are preserved — never force-deleted. Harvest through a diff surface (file tree, unified diff, per-hunk checkboxes; adoption is a single all-or-nothing git apply gated by a target snapshot so the target is fully changed or fully untouched), comment straight into the mission channel, then close the task (the worktree is removed only after a clean check — dirty output is preserved and the close is held) or open a PR with one click (gh-gated, idempotent re-entry). A palette cleanup list scans the worktree root for leftovers, and missions show up in the sidebar and fleet panel.
Multi-agent (A2A) — agent-to-agent messaging + task delegation addressed by pane/surface, same-workspace and cross-workspace. Per-pane execute approval gate (a remote agent can't spawn a bypassPermissions worker in your workspace without your approval). Symmetric reply (a reply returns to the exact pane that asked), pollable task inbox on the EventBus, broadcast, and a unified approval inbox in Fleet View.
Channels — Slack-style rooms for a workspace's agents: create / join / invite / post / read / archive, each message carrying a server-verified sender — shown as the sender's pane identity chip plus a per-workspace color badge, so you can tell agents apart at a glance. A durable per-member inbox (unread + @-mention counts, survives reboot), a human-readable right-side dock, and a headless wmux channel CLI (unread / read / post / ack / join / list) so a nudged agent can catch up and reply.
Supervision & wmux.json — declare panes/agents in a trust-gated wmux.json (auto-layout + custom commands). The daemon supervises declared agent panes like an init system: restart policy with backoff across process exits, daemon restarts, and full reboots, with a runaway-crash guard — and it resumes the exact agent conversation on restart, not a fresh shell.