Native macOS Terminal Built Around the Multi-Agent Attention Problem
Notification ring pattern and per-session sidebar metadata (branch, PR, ports) map directly to monitoring parallel agent loops — and the 'primitives not orchestrators' philosophy echoes ADR-0144
cmux from manaflow-ai is a macOS terminal built specifically for the problem of running multiple Claude Code or Codex sessions in parallel without losing track of which one is waiting on you. Built in Swift/AppKit on top of libghostty — so it reads your existing ~/.config/ghostty/config and gets GPU-accelerated rendering for free — not another Electron wrapper.
The core insight is that macOS system notifications are useless for agent workflows. They all say “Claude is waiting for your input.” No context. No differentiation. When you’ve got eight sessions open, that’s noise, not signal. cmux solves this with notification rings — panes get a blue visual ring, the sidebar tab lights up — wired to OSC 9/99/777 terminal escape sequences via a cmux notify CLI you hook into Claude Code or OpenCode agent hooks. The sidebar also surfaces per-session metadata: git branch, linked PR status/number, working directory, listening ports, and the latest notification text. At a glance you know what every session is doing.
The in-app browser is the other interesting piece. It ports the scriptable API from vercel-labs/agent-browser, so agents can snapshot the accessibility tree, click elements, fill forms, and evaluate JS directly against your dev server — split right next to the terminal pane without switching windows. There’s also a full socket + CLI API for creating workspaces, splitting panes, and sending keystrokes programmatically, which opens up some interesting automation surface.
The Zen of cmux is worth reading. The philosophy is “primitives, not solutions” — give developers composable building blocks and let them figure out their own workflow rather than locking them into an opinionated orchestrator. The same instinct behind ADR-0144 (hexagonal architecture, adapters over integration). Running many parallel sessions and needing per-session awareness is the exact shape of the agent loop problem, and this is a native macOS take on that surface without prescribing how you wire it together.
Key Ideas
- Notification rings via OSC escape sequences —
cmux notifyCLI hooks into Claude Code / OpenCode agent hooks; pane gets a blue ring and sidebar tab lights up when agent is waiting; Cmd+Shift+U jumps to most recent unread - Sidebar as per-session metadata surface — git branch, linked PR status + number, working directory, listening ports, latest notification text — all visible without switching to the pane
- libghostty not Electron — built in Swift/AppKit, reads
~/.config/ghostty/config, GPU-accelerated via libghostty; fast startup, low memory - Embedded scriptable browser — ports the agent-browser API; agents can snapshot accessibility tree, click, fill forms, evaluate JS; split next to terminal pane
- Socket + CLI automation API — create workspaces, split panes, send keystrokes, open URLs — full programmatic control from outside the app
- “Primitives not solutions” philosophy — no opinionated workflow lock-in; composable building blocks, you design the workflow
- Homebrew install —
brew tap manaflow-ai/cmux && brew install --cask cmux; auto-updates via Sparkle
Links
- cmux GitHub
- cmux.dev — The Zen of cmux
- Demo video
- manaflow-ai on X
- agent-browser (vercel-labs) — the browser API cmux ported
- Ghostty — terminal emulator cmux builds on
- OSC escape code docs (iTerm2) — notification protocol used
- OpenCode — another agent workflow cmux targets