开源项目 GitHub Trending 2026-10-07T12:01 正文 ok 3097 words

专为 AI 编码 Agent 打造:开源 macOS 终端 cmux,集成 Ghostty 内核、垂直标签与内置自动化浏览器

英文标题:🔥 manaflow-ai/cmux

开源项目 cmux 推出了一款专为多任务 AI 编码 Agent(如 Claude Code、Codex 等)量身打造的原生 macOS 终端。项目采用 Swift 与 AppKit 构建,底层由 libghostty 提供 GPU 加速渲染,支持垂直标签页、工作区状态可视化(Git 分支、PR 状态、监听端口)以及基于终端转义序列与 CLI 触发的 Agent 状态高亮通知。cmux 还在终端旁直接集成了移植自 agent-browser 的可编程浏览器,并提供全面的 CLI/Socket 脚本化控制接口。cmux 放弃了沉重的 Electron 架构与束缚性的 GUI 编排思路,通过提供轻量、高可组合的底层基元,让开发者自由搭建和扩展最高效的 Agent 并行工作流。
打开原文相关 8 · 机会 5
media2.5 KB media13.5 KB media1.5 KB media2.8 KB media2.6 KB media1.5 MB media1.5 MB media546.0 KB media865.1 KB media1.2 MB media958.5 KB media1.6 MB media63.9 KB media64.0 KB media282.8 KB media77.5 KB

中文

cmux:专为 AI 编码 Agent 打造的 Ghostty 驱动 macOS 终端

一款基于 Ghostty、带有垂直标签页以及面向 AI 编码 Agent 状态通知的 macOS 终端。

下载 macOS 版 cmux

X / Twitter Discord GitHub stars

cmux 截图

视频/嵌入内容:演示视频 · cmux 的禅道哲学(The Zen of cmux)

文档 · 博客 · 更新日志 · 社区

特性说明 演示预览
当编码 Agent 需要你的关注时,分屏窗格会亮起蓝色光环,标签页也会同步高亮提示 通知光环
在一处集中查看所有未决通知,并可直接跳转至最新的未读项 侧边栏通知标记
在终端旁分屏打开浏览器,内置移植自 agent-browser 的可脚本化 API 内置浏览器

垂直 + 水平标签页

特性说明 演示预览
侧边栏可显示 Git 分支、关联 PR 的状态/编号、工作目录、监听端口以及每个工作区的最新通知内容。支持水平与垂直分屏。 垂直标签与分屏
使用 cmux ssh user@remote 可为远程服务器创建工作区。附带 --command 'omp "investigate auth"' 可在其首个远程终端中单次运行初始命令。浏览器分屏会经由远程网络路由,使得 localhost 开箱即用。将图片拖入远程会话还可通过 scp 自动上传。 cmux SSH
单条命令 cmux claude-teams 即可运行 Claude Code 的 teammate 模式。各队友会作为原生分屏启动,附带侧边栏元数据与通知支持,无需依赖 tmux。 Claude Code Teams
  • 浏览器导入 —— 支持从 Chrome、Firefox、Arc 等 20 多款浏览器导入 Cookie、历史记录与会话,使分屏浏览器即开即用、自带登录态
  • 自定义命令 —— 可在 cmux.json 中为项目定义专属操作,并通过命令面板(Command Palette)快速唤起
  • 全可编程 —— 提供 CLI 与 Socket API,用于创建工作区、分屏、发送按键输入以及自动化操作浏览器
  • 原生 macOS 应用 —— 采用 Swift 与 AppKit 构建,非 Electron 架构;启动迅速、内存占用极低
  • 兼容 Ghostty —— 直接读取已有的 ~/.config/ghostty/config 配置文件,无缝复用主题、字体与配色方案
  • GPU 硬件加速 —— 由 libghostty 驱动,实现极度流畅的高性能渲染
  • 完善的快捷键系统 —— 提供覆盖工作区、分屏、浏览器操作的丰富快捷键支持
  • 开源免费 —— 采用 GPL 许可协议,完全开源

安装方式

下载 macOS 版 cmux

打开 .dmg 镜像并将 cmux 拖入「应用程序」文件夹。cmux 通过 Sparkle 提供自动更新,下载一次即可持续自动升级。

也可以通过 Homebrew 安装:

bash brew tap manaflow-ai/cmux brew install --cask cmux

后续更新同样支持包管理器。首次启动时,macOS 可能会提示确认打开来自已知开发者的应用程序,点击打开继续即可。


为什么构建 cmux?

我经常需要并行运行大量的 Claude Code 和 Codex 会话。此前我一直使用 Ghostty 配合大量分屏窗格,并依赖系统原生 macOS 通知来获知哪个 Agent 需要我介入。但 Claude Code 的通知正文千篇一律都是 "Claude is waiting for your input",完全缺乏上下文;一旦打开的标签页过多,连标签标题都看不清了。

我也尝试过几款编码编排器(Coding Orchestrator),但它们大多基于 Electron/Tauri 开发,性能表现令我困扰。而且我更偏爱纯终端环境,因为 GUI 编排器往往会把用户限制在它们预设的固定工作流中。因此,我决定用 Swift/AppKit 开发一款原生 macOS 应用 cmux。它使用 libghostty 作为终端渲染引擎,并能读取已有的 Ghostty 配置文件中的主题、字体和配色。

cmux 的核心补充是侧边栏与通知系统。侧边栏包含垂直标签页,能展示每个工作区的 Git 分支、关联 PR 的状态/编号、当前工作目录、监听端口以及最新的通知文本。通知系统能够捕获终端转义序列(OSC 9/99/777),并提供了命令行接口(cmux notify),你可以直接挂接到 Claude Code、OpenCode 等 Agent 的 Hook 中。当某个 Agent 进入等待状态时,其分屏窗格会呈现蓝色光环,侧边栏标签也会随之亮起,方便你在众多分屏与标签中精准定位。按快捷键 Cmd+Shift+U 即可快速跳到最新未读项。

应用内置的浏览器提供了一套从 agent-browser 移植的可脚本化 API。Agent 可以对无障碍树进行快照、获取元素引用、执行点击、填写表单并运行 JavaScript。你可以把浏览器窗格并排分屏在终端旁边,让 Claude Code 直接与本地开发服务器进行交互调试。

所有的功能均可通过 CLI 和 Socket API 实现自动化脚本控制 —— 包括创建工作区/标签页、分屏窗格、发送按键事件、在浏览器中打开特定 URL 等。

cmux 不会对开发者如何使用工具指手画脚。它只为你提供带有 CLI 的终端和浏览器,其余的工作流完全由你掌控。

cmux 是一种基础构件(primitive),而非一刀切的解决方案。它为你准备好终端、浏览器、通知机制、工作区、分屏、标签页以及能够掌控全局的 CLI。cmux 不会强行灌输某种特定使用编码 Agent 的教条。你利用这些基元构建出的东西完全属于你自己。

最优秀的开发者一直都在打造属于自己的工具。当下还没有人真正参透与 Agent 协作的最佳方式,那些构建封闭商业产品的团队显然也没有。最贴近自己代码库的开发者,一定会最先找到答案。

把可组合的基础构件交给一百万名开发者,他们自下而上探索出的高效工作流,速度会远胜于任何产品团队自上而下的规划设计。

如需了解有关 cmux 配置的更多信息,请参阅官方文档。

若需自定义 cmux 外观主题(颜色、字体、透明度、侧边栏等),请参阅自定义 cmux 外观。

针对受管 Mac 环境下的 Shell 监控开销及进程审计负载,请参阅支持的 CMUX_NO_GIT_WATCH=1 缓解方案及其对 Git/PR 更新的权衡。


快捷键指南

工作区操作

快捷键 操作
⌘ N 新建工作区
⌘ 1–8 跳转到工作区 1–8
⌘ 9 跳转到最后一个工作区
⌃ ⌘ ] 下一个工作区
⌃ ⌘ [ 上一个工作区
⌘ ⇧ W 关闭工作区
⌘ ⇧ R 重命名工作区
⌥ ⌘ E 编辑工作区描述
⌘ B 切换显示/隐藏侧边栏
⌥ ⌘ B 切换显示/隐藏右侧边栏
⌘ ⇧ E 切换右侧边栏焦点

表面(Surface / 标签页)与分屏操作

快捷键 操作
⌘ T 新建 Surface
⌘ ⇧ ] 下一个 Surface
⌘ ⇧ [ 上一个 Surface
⌃ Tab 下一个 Surface
⌃ ⇧ Tab 上一个 Surface
⌃ 1–8 跳转到 Surface 1–8
⌃ 9 跳转到最后一个 Surface
⌘ W 关闭 Surface
⌘ D 向右分屏
⌘ ⇧ D 向下分屏
⌥ ⌘ ← → ↑ ↓ 按方向切换分屏焦点
⌃ ⇧ H J K L 向左/下/上/右调整分屏大小
⌘ ⇧ H 闪烁高亮当前聚焦面板

浏览器与开发者工具

浏览器开发者工具快捷键遵循 Safari 默认设置,可在 Settings → Keyboard Shortcuts 中自定义。命令面板导航快捷键(包括 ⌃ P)同样支持自定义,并可解除绑定以便将按键直接传递给当前活动的终端。

快捷键 操作
⌘ ⇧ L 在分屏中打开浏览器
⌘ L 聚焦地址栏
⌘ [ 后退
⌘ ] 前进
⌘ R 重新加载页面
⌥ ⌘ I 切换开发者工具(Safari 默认)
⌥ ⌘ C 显示 JavaScript 控制台(Safari 默认)

通知管理

快捷键 操作
⌘ I 显示通知面板
⌘ ⇧ U 跳转至最新未读通知
⌥ ⌘ U 切换当前项未读状态
⌃ ⌘ U 将当前项标记为最早未读并跳转至下一个最新未读
— 全部标为已读(默认未绑定快捷键;可在「设置」或 cmux.json 中配置)
— 清除所有通知(默认未绑定快捷键;可在「设置」或 cmux.json 中配置)

搜索与终端常用

快捷键 操作
⌘ F 查找
⌘ ⇧ F 在目录中查找
⌘ G / ⌥ ⌘ G 查找下一个 / 上一个
⌥ ⌘ ⇧ F 隐藏查找栏
⌘ E 将所选内容用于查找
⌘ K 清除终端回滚记录(Scrollback)
⌘ C 复制(选中文本时)
⌘ V 粘贴
⌘ + / ⌘ - 增大 / 减小字体大小
⌘ 0 重置字体大小

窗口与全局

快捷键 操作
⌘ ⇧ N 新建窗口
⌘ ⇧ O 重新打开上一个会话
⌘ , 打开设置
⌘ ⇧ , 重新加载配置
⌘ Q 退出

cmux NIGHTLY(预览版)

下载 cmux NIGHTLY(通用架构安装包;后续更新会自动适配你的 Mac 芯片架构)

cmux NIGHTLY 是一款独立的应用程序,具有专属的 Bundle ID,因此可以与稳定版本并存运行。它会根据最新的 main 分支提交自动构建,并通过专用的 Sparkle 渠道实现自动更新。

若发现 Nightly 版本的 Bug,可在 GitHub Issues 或 Discord 的 #nightly-bugs 频道提交反馈。


会话恢复机制与持久化

退出 cmux 时会自动保存当前会话状态。重新启动后,cmux 会恢复以下应用自身管理的状态:

  • 窗口/工作区/分屏窗格布局
  • 工作目录
  • 终端回滚内容(尽最大努力恢复)
  • 浏览器 URL 及浏览历史

cmux 不会对任意正在运行的进程状态进行检查点快照(Checkpoint)。普通的终端、tmux、vim、Shell 以及不支持的终端应用程序在重新打开时将呈现为新终端。如果你需要在 cmux 退出、崩溃或更新时保持会话存活并支持分离/重新附加(detach/reattach),可通过 cmux local-tmux 启用本地 tmux 所有者支持;其生命周期和睡眠限制详见 docs/local-tmux.md。zellij 用户可使用 cmux local-zellij,详见 docs/local-zellij.md。

对于受支持的 Agent 会话,当通过 Hook 保存了原生会话 ID 后便可支持自动恢复。请在安装 Agent CLI 并将其添加到系统 PATH 后安装 Hook:

bash cmux hooks setup cmux hooks setup codex cmux hooks setup --agent opencode

cmux hooks setup 会自动安装它能识别的受支持 Agent,并打印被跳过 Agent 的摘要。目前支持恢复集成的 Agent 包括:Claude Code、Codex、Grok、OpenCode、Pi、Amp、Cursor CLI、Gemini、Rovo Dev、Copilot、CodeBuddy、Factory 以及 Qoder。当在设置中开启 Claude 集成后,Claude Code 会由 cmux 的 Claude 包装器直接托管。

高级用户与外部集成还可以为当前的终端 Surface 绑定自定义恢复命令。这对于自身具备状态持久化能力的工具(如 tmux 会话或定制的 Agent CLI)格外有效:

bash cmux surface resume set --kind tmux --checkpoint work --shell "tmux attach -t work" cmux surface resume show --json cmux surface resume clear --checkpoint work

该绑定将始终附着在对应的 cmux Surface 上。通过公共 CLI 或 Socket 创建的绑定会保存供人工审查和手动恢复,除非你批准了用于自动恢复的已签名命令前缀。经过批准的前缀还会绑定到其工作目录及精确的环境变量。你可以在**「设置 > 终端 > 恢复命令」(Settings > Terminal > Resume Commands)**中查看或修改授权配置。cmux 仅会自动执行被标记为受信的恢复绑定(如实时进程检测到的 tmux 绑定或用户显式批准的前缀)。在保存恢复绑定之前,敏感的环境变量(如 Token、密码、密钥和 API Key)都会被自动过滤剥离。

English / 原文

A Ghostty-based macOS terminal with vertical tabs and notifications for AI coding agents

Download cmux for macOS

English | 日本語 | Tiếng Việt | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | ភាសាខ្មែរ | Українська

X / Twitter Discord GitHub stars

cmux screenshot

▶ Demo video · The Zen of cmux

Docs · Blog · Changelog · Community

Panes get a blue ring and tabs light up when coding agents need your attention Notification rings
See all pending notifications in one place, jump to the most recent unread Sidebar notification badge
Split a browser alongside your terminal with a scriptable API ported from agent-browser Built-in browser

Vertical + horizontal tabs

Sidebar shows git branch, linked PR status/number, working directory, listening ports, and latest notification text. Split horizontally and vertically. | Vertical tabs and split panes
cmux ssh user@remote creates a workspace for a remote machine. Pass --command 'omp "investigate auth"' to run an initial command once in its first remote terminal. Browser panes route through the remote network so localhost just works. Drag an image into a remote session to upload via scp. | cmux SSH
cmux claude-teams runs Claude Code's teammate mode with one command. Teammates spawn as native splits with sidebar metadata and notifications. No tmux required. | Claude Code Teams

  • Browser import — Import cookies, history, and sessions from Chrome, Firefox, Arc, and 20+ browsers so browser panes start authenticated
  • Custom commands — Define project-specific actions in cmux.json that launch from the command palette
  • Programmable — CLI and socket API to create workspaces, split panes, send keystrokes, and automate the browser
  • Native macOS app — Built with Swift and AppKit, not Electron. Fast startup, low memory.
  • Ghostty compatible — Reads your existing ~/.config/ghostty/config for themes, fonts, and colors
  • GPU-accelerated — Powered by libghostty for smooth rendering
  • Keyboard shortcuts — Extensive shortcuts for workspaces, splits, browser, and more
  • Open source — Free and GPL-licensed

Download cmux for macOS

Open the .dmg and drag cmux to your Applications folder. cmux auto-updates via Sparkle, so you only need to download once.

brew tap manaflow-ai/cmux
brew install --cask cmux

To update later:

On first launch, macOS may ask you to confirm opening an app from an identified developer. Click Open to proceed.

I run a lot of Claude Code and Codex sessions in parallel. I was using Ghostty with a bunch of split panes, and relying on native macOS notifications to know when an agent needed me. But Claude Code's notification body is always just "Claude is waiting for your input" with no context, and with enough tabs open I couldn't even read the titles anymore.

I tried a few coding orchestrators but most of them were Electron/Tauri apps and the performance bugged me. I also just prefer the terminal since GUI orchestrators lock you into their workflow. So I built cmux as a native macOS app in Swift/AppKit. It uses libghostty for terminal rendering and reads your existing Ghostty config for themes, fonts, and colors.

The main additions are the sidebar and notification system. The sidebar has vertical tabs that show git branch, linked PR status/number, working directory, listening ports, and the latest notification text for each workspace. The notification system picks up terminal sequences (OSC 9/99/777) and has a CLI (cmux notify) you can wire into agent hooks for Claude Code, OpenCode, etc. When an agent is waiting, its pane gets a blue ring and the tab lights up in the sidebar, so I can tell which one needs me across splits and tabs. Cmd+Shift+U jumps to the most recent unread.

The in-app browser has a scriptable API ported from agent-browser. Agents can snapshot the accessibility tree, get element refs, click, fill forms, and evaluate JS. You can split a browser pane next to your terminal and have Claude Code interact with your dev server directly.

Everything is scriptable through the CLI and socket API — create workspaces/tabs, split panes, send keystrokes, open URLs in the browser.

cmux is not prescriptive about how developers hold their tools. It's a terminal and browser with a CLI, and the rest is up to you.

cmux is a primitive, not a solution. It gives you a terminal, a browser, notifications, workspaces, splits, tabs, and a CLI to control all of it. cmux doesn't force you into an opinionated way to use coding agents. What you build with the primitives is yours.

The best developers have always built their own tools. Nobody has figured out the best way to work with agents yet, and the teams building closed products definitely haven't either. The developers closest to their own codebases will figure it out first.

Give a million developers composable primitives and they'll collectively find the most efficient workflows faster than any product team could design top-down.

For more info on how to configure cmux, head over to our docs.

To theme cmux (colors, fonts, transparency, sidebar, and more), see Customizing cmux's look.

For shell watcher churn and managed-Mac process audit volume, see the supported CMUX_NO_GIT_WATCH=1 mitigation and its Git/PR update trade-offs.

Shortcut Action
⌘ N New workspace
⌘ 1–8 Jump to workspace 1–8
⌘ 9 Jump to last workspace
⌃ ⌘ ] Next workspace
⌃ ⌘ [ Previous workspace
⌘ ⇧ W Close workspace
⌘ ⇧ R Rename workspace
⌥ ⌘ E Edit workspace description
⌘ B Toggle sidebar
⌥ ⌘ B Toggle right sidebar
⌘ ⇧ E Toggle right sidebar focus
Shortcut Action
--- ---
⌘ T New surface
⌘ ⇧ ] Next surface
⌘ ⇧ [ Previous surface
⌃ Tab Next surface
⌃ ⇧ Tab Previous surface
⌃ 1–8 Jump to surface 1–8
⌃ 9 Jump to last surface
⌘ W Close surface
Shortcut Action
--- ---
⌘ D Split right
⌘ ⇧ D Split down
⌥ ⌘ ← → ↑ ↓ Focus pane directionally
⌃ ⇧ H J K L Resize pane left/down/up/right
⌘ ⇧ H Flash focused panel

Browser developer-tool shortcuts follow Safari defaults and are customizable in Settings → Keyboard Shortcuts. Command palette navigation shortcuts, including ⌃ P, are also customizable and can be cleared so the keypress reaches the active terminal.

Shortcut Action
⌘ ⇧ L Open browser in split
⌘ L Focus address bar
⌘ [ Back
⌘ ] Forward
⌘ R Reload page
⌥ ⌘ I Toggle Developer Tools (Safari default)
⌥ ⌘ C Show JavaScript Console (Safari default)
Shortcut Action
--- ---
⌘ I Show notifications panel
⌘ ⇧ U Jump to latest unread
⌥ ⌘ U Toggle current item unread state
⌃ ⌘ U Mark current item as oldest unread and jump to next latest unread
— Mark all notifications read (unbound by default; configure in Settings or cmux.json)
— Clear all notifications (unbound by default; configure in Settings or cmux.json)
Shortcut Action
--- ---
⌘ F Find
⌘ ⇧ F Find in directory
⌘ G / ⌥ ⌘ G Find next / previous
⌥ ⌘ ⇧ F Hide find bar
⌘ E Use selection for find
Shortcut Action
--- ---
⌘ K Clear scrollback
⌘ C Copy (with selection)
⌘ V Paste
⌘ + / ⌘ - Increase / decrease font size
⌘ 0 Reset font size
Shortcut Action
--- ---
⌘ ⇧ N New window
⌘ ⇧ O Reopen previous session
⌘ , Settings
⌘ ⇧ , Reload configuration
⌘ Q Quit

Download cmux NIGHTLY (universal; updates then switch to your Mac's architecture automatically)

cmux NIGHTLY is a separate app with its own bundle ID, so it runs alongside the stable version. Built automatically from the latest main commit and auto-updates via its own Sparkle feed.

Report nightly bugs on GitHub Issues or in #nightly-bugs on Discord.

Quitting cmux saves the current session. On relaunch, cmux restores app-owned state:

  • Window/workspace/pane layout
  • Working directories
  • Terminal scrollback (best effort)
  • Browser URL and navigation history

cmux does not checkpoint arbitrary live process state. Ordinary terminals, tmux, vim, shells, and unsupported terminal apps reopen as normal terminals. For live detach/reattach across cmux quit, crashes, and updates, opt in to the local tmux owner with cmux local-tmux; see docs/local-tmux.md for its lifecycle and machine-sleep limits. zellij users can use cmux local-zellij instead; see docs/local-zellij.md.

Supported agent sessions can resume when hooks have saved a native session ID. Install hooks after installing the agent CLI so its binary is on PATH:

cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode

cmux hooks setup installs supported agents it can find and prints a summary for skipped agents. Supported resume integrations include Claude Code, Codex, Grok, OpenCode, Pi, Amp, Cursor CLI, Gemini, Rovo Dev, Copilot, CodeBuddy, Factory, and Qoder. Claude Code is handled by the cmux Claude wrapper when Claude integration is enabled in Settings.

Advanced users and integrations can attach a custom resume command to the current terminal surface. This is useful for tools with their own durable state, such as tmux sessions or custom agent CLIs:

cmux surface resume set --kind tmux --checkpoint work --shell "tmux attach -t work"
cmux surface resume show --json
cmux surface resume clear --checkpoint work

The binding stays attached to the cmux surface. Public CLI or socket-created bindings are stored for inspection and manual restore unless you approve a signed command prefix for automatic restore. Approved prefixes are also bound to the working directory and exact environment values, when present. Review or edit approvals in Settings > Terminal > Resume Commands. cmux only auto-runs resume bindings it marks trusted, such as live process-detected tmux bindings or user-approved prefixes. Sensitive environment keys such as tokens, passwords, secrets, and API keys are dropped before a resume binding is stored.

To keep restored agent terminals idle instead of automatically running their resume commands, turn off Settings > Terminal > Resume Agent Sessions on Reopen or set this in ~/.config/cmux/cmux.json:

{
  "terminal": {
    "autoResumeAgentSessions": false
  }
}

This only disables automatic agent resume commands. cmux still restores the saved layout, working directories, scrollback, and browser history.

If you need to reapply the last saved snapshot manually, use:

  • File > Reopen Previous Session
  • ⌘ ⇧ O
  • cmux restore-session

Each cmux install (stable, nightly, rc, staging, and tagged debug builds) keeps its own saved session. To bring a session from one install into another, for example after trying nightly and switching back to stable, run this from the install you want to open it in:

cmux restore-session --from nightly          # or stable, rc, staging, debug:<tag>
cmux restore-session --export ~/session.json # write this install's saved session to a file
cmux restore-session --export ~/session.json --force # replace an existing export file
cmux restore-session --from ~/session.json   # reopen an exported file

The imported session opens as additional windows next to the ones you have, like cmux restore-session; the other install's saved file is only read. Agent resume carries over because hook session mappings in ~/.cmuxterm/ are shared by every install. Browser cookies and logins are per install and do not move.

--from <channel> restores another install's own session file with the same trust as your own session, including automatic agent resume. --from <path> treats the file as untrusted: layout, working directories, text scrollback, and http(s) browser tabs restore, but nothing in the file runs automatically. Built-in agents (Claude Code, Codex, Amp, and the rest) resume with the command cmux builds from the agent kind and session id, ignoring launch arguments stored in the file, and only when the working directory already exists on this Mac. Custom agent resume commands, resume bindings, and tmux start commands are kept for manual restore only (approved resume prefixes never apply to them): the CLI reports how many were held back, and in each terminal cmux surface resume show shows the command and cmux restore --surface runs it. Terminal control sequences in the scrollback (clipboard, notifications, links, titles), draft attachments, non-http(s) browser pages and profiles, SSH/cloud connections, and workspace environment variables from the file are dropped. A snapshot saved by a newer cmux (newer session format) is refused with an error; if a downgraded cmux finds one in its own session file, it keeps a copy next to it as session-<bundle id>.schema-v<N>.json.

Under the hood, cmux writes a versioned snapshot under ~/Library/Application Support/cmux/ and agent hooks write session mappings under ~/.cmuxterm/. On restore, cmux rebuilds the layout first, then runs the supported agent's native resume command when automatic agent resume is enabled.

Read the full guide at https://cmux.com/docs/session-restore.

How does cmux relate to Ghostty?

cmux is not a fork of Ghostty. It uses libghostty as a library for terminal rendering, the same way apps use WebKit for web views. Ghostty is a standalone terminal; cmux is a different app built on top of its rendering engine.

What platforms does it support?

macOS only, for now. cmux is a native Swift + AppKit app.

Yes, in beta. Pair your iPhone with your Mac from the Mobile Connect window and attach to your terminals from your phone, with optional forwarding of terminal notifications. It ships on TestFlight as cmux BETA. Early access is included with cmux Founders Edition. See the iOS docs.

What coding agents does cmux work with?

All of them. cmux is a terminal, so any agent that runs in a terminal works out of the box: Claude Code, Codex, OpenCode, Gemini CLI, Kiro, Aider, Goose, Amp, Cline, Cursor Agent, and anything else you can launch from the command line.

Can cmux orchestrate multiple agents and subagents?

Yes. When an agent spawns subagents or teammates, cmux turns them into native panes and splits instead of hidden background processes. It supports Claude Code teams and oh-my-opencode multi-model orchestration, so every agent in a run is visible and controllable.

Can I use cmux with remote machines?

Yes. Open workspaces over SSH and attach to remote tmux sessions, so agents can run on a remote host while you drive them from cmux. See SSH and remote.

How do notifications work?

When a process needs attention, cmux shows notification rings around panes, unread badges in the sidebar, a notification popover, and a macOS desktop notification. These fire automatically via standard terminal escape sequences (OSC 9/99/777), or you can trigger them with the cmux CLI and agent hooks. Any agent that supports hooks or OSC works, including Claude Code, Codex, OpenCode, and pi.

Yes. Every action is available through the cmux CLI and a Unix socket: create workspaces, open split panes, send input, read screen contents, take screenshots, and drive the in-app browser. See the CLI reference and browser automation docs.

What can the built-in browser do?

cmux can split a real browser pane next to your terminal, and it is fully programmable: navigate, snapshot the DOM, click, type, evaluate JavaScript, and read console and network activity over the same socket API. Agents use it to verify their own web changes without leaving cmux. See browser automation.

Yes. Skills are reusable workflows you can give any agent running in cmux, for things like CLI control, workspace automation, settings, and browser surfaces. Browse the open collection at cmux-skills, or read the skills docs.

Can I customize keyboard shortcuts?

Terminal keybindings are read from your Ghostty config file (~/.config/ghostty/config), including leader sequences and key tables. Ghostty tab actions target cmux workspaces; see the action mapping, precedence, and limitations. cmux-specific shortcuts (workspaces, splits, browser, notifications) can be customized in Settings. See the default shortcuts for a full list.

Yes. Terminal rendering uses your Ghostty config, so themes, fonts, colors, and cursor carry over directly. cmux's own settings in ~/.config/cmux/cmux.json control the sidebar, tab bar, split panes, and behavior, and every keyboard shortcut is editable. See configuration.

cmux restores windows, workspaces, panes, working directories, and best-effort scrollback when you relaunch. Supported agent integrations can resume from their saved session IDs. Those are reconstructed app state and resume commands; they do not keep arbitrary live processes running. Use cmux local-tmux for live local detach/reattach across cmux quit, crashes, and updates. A local tmux server cannot survive logout, restart, shutdown, or power loss; use cmux ssh-tmux, cmux mosh-tmux, or a persistent cloud VM when the owner must remain online while this Mac is offline. See session restore and docs/local-tmux.md.

How does it compare to tmux?

tmux is a terminal multiplexer that runs inside any terminal. cmux is a native macOS app with a GUI: vertical tabs, split panes, an embedded browser, and a socket API, all built in, no config files or prefix keys needed. That said, lots of people happily run cmux with SSH and tmux together, and cmux can attach to your remote tmux sessions natively (beta).

Yes, cmux is free to use. The source code is available on GitHub.

cmux is free and open source, and always will be. If you want to back development and get early access to what's next, including cmux AI, the iOS app, and Cloud VMs, check out cmux Founders Edition.

I have a feature request or found a bug?

We want to hear it. Open an issue or pull request on GitHub, or email us.

Star History Chart

New here? Start here is the short path from "I want to change something" to a merged pull request, including what you can fix without a Mac. Then the contributor guide and fast local checks.

Ways to get involved:

Community

WeChat: Scan the QR code to join the community.
WeChat QR code to join the cmux community

cmux is free, open source, and always will be. If you'd like to support development and get early access to what's coming next:

Get Founder's Edition

  • Prioritized feature requests/bug fixes
  • Early access: cmux AI that gives you context on every workspace, tab and panel
  • Early access: iOS app with terminals synced between desktop and phone
  • Early access: Cloud VMs
  • Early access: Voice mode
  • My personal iMessage/WhatsApp

Download cmux for macOS

Open the .dmg and drag cmux to your Applications folder. cmux auto-updates via Sparkle, so you only need to download once.

brew tap manaflow-ai/cmux
brew install --cask cmux

To update later:

On first launch, macOS may ask you to confirm opening an app from an identified developer. Click Open to proceed.

cmux is open source under GPL-3.0-or-later. The cmux server software (web/, the Cloudflare workers, and the relay services listed in LICENSE) uses the Business Source License 1.1 instead: you can read, modify, and run it for non-production use, and production use or self-hosting requires a commercial license.

If your organization cannot comply with GPL, commercial terms may be available for portions for which Manaflow controls the necessary rights. They do not relicense third-party material or outside contributions for which Manaflow lacks a separate grant. See LICENSE for the exact scope and contact founders@cmux.com for details.