TRENDSHIFT DAILY #16 · 2026.05.26 · MANAFLOW-AI

cmux — AI 코딩 에이전트가 "기다리고 있다"고 알려주는 네이티브 macOS 터미널

Ghostty 기반 GPU 가속 렌더링 + Swift/AppKit 네이티브 + 사이드바 알림. Claude Code·Codex·OpenCode 여러 세션을 동시에 굴리는 개발자가 "지금 어느 에이전트가 내 답을 기다리는지" 한눈에 알기 위해 만들어진 도구.

19.5k
GitHub 별 (2026-05-26)
Swift
주력 언어 (30MB+, 85%)
GPL-3.0+
라이선스 (오픈소스 + 상업용 듀얼)
macOS 전용
Electron 아님 · 네이티브

1프로젝트 한줄 요약

"여러 AI 에이전트를 병렬로 굴릴 때 한 명도 놓치지 않는 터미널"

핵심 메시지

"여러 에이전트를 띄워놓으면
누가 나를 부르는지 모른다 — cmux는 그걸 사이드바에 띄워준다."

cmux는 Ghostty의 터미널 렌더링 엔진(libghostty)을 그대로 가져다 쓴, Swift/AppKit 기반의 네이티브 macOS 터미널이다. 보통 터미널과 비슷하게 생겼지만 결정적인 차이가 있다 — "AI 에이전트가 내 입력을 기다리고 있을 때 사이드바 탭이 빛난다"는 점.

창업자 본인이 Claude Code·Codex 세션을 너무 많이 열어놓고 일하다가 "지금 누가 나를 부르는지 모르겠다"는 고통을 겪고 직접 만들었다. 그래서 tab(탭)·split(분할)·notification(알림)이라는 평범한 기능들이, AI 에이전트 워크플로에 맞게 다시 설계됐다.

2왜 주목받는가

트렌딩 #16 · "에이전트 오케스트레이터" 시장의 네이티브 답안

2026년 들어 Claude Code·Codex·OpenCode·Gemini CLI 같은 coding agent(코딩 에이전트)가 폭발적으로 늘었다. 사용자들은 한 화면에 여러 에이전트를 동시에 띄워놓고, 각각 다른 브랜치·다른 작업을 병렬로 굴린다.

용어
coding agent (코딩 에이전트)
사람이 코드를 직접 치는 대신, LLM이 터미널 안에서 파일 읽기·고치기·테스트 실행·git 명령까지 자율적으로 수행하는 도구. Claude Code, Codex CLI, OpenCode 등이 대표. 한 작업당 5~30분씩 돌리는 게 흔해서 "기다리는 시간"이 자연스럽게 생긴다.

이 시장의 빈 자리에 들어가려는 시도가 여럿 있었다. 대부분 Electron이나 Tauri로 만들어진 GUI 오케스트레이터였는데, 성능이 거슬렸고 워크플로를 강제로 제품 흐름에 맞춰야 했다. cmux는 정반대 길을 택한다.

차별점 1

Electron이 아니라 네이티브 Swift/AppKit

대부분의 "AI 코딩 워크스페이스" 앱은 Electron(웹 기술을 데스크톱으로 감싼 것)으로 만들어져 시작 속도가 느리고 메모리를 많이 먹는다. cmux는 macOS 전용으로 좁히는 대신 네이티브 Swift + AppKit + Metal GPU 렌더링으로 빠른 시작과 낮은 메모리를 가져간다.

차별점 2

Ghostty 엔진을 라이브러리로 통째로 가져다 씀

Ghostty는 Mitchell Hashimoto(HashiCorp 창업자)가 만든 GPU 가속 터미널로, 2025년 오픈소스 공개 후 가장 빠르게 성장한 터미널이다. cmux는 Ghostty를 fork해 libghostty를 라이브러리로 임베드한다. 사용자 입장에선 기존 ~/.config/ghostty/config(폰트·테마·색상)를 그대로 읽어 쓰므로, Ghostty 사용자라면 마이그레이션 비용이 거의 0이다.

차별점 3

"기다림" 자체를 1급 시민으로

코딩 에이전트가 권한 요청·계획 확인·질문을 하면 해당 탭에 파란 링이 뜨고 사이드바 탭이 빛난다. Cmd+Shift+U로 "가장 최근에 대기 중인 에이전트"로 점프. 사이드바엔 git 브랜치·연결된 PR 상태·작업 디렉토리·열린 포트·최근 알림 텍스트가 워크스페이스마다 표시된다.

차별점 4

"primitive, not solution" — 추천 워크플로 강요 안 함

창업자 본인의 표현 그대로: "cmux는 솔루션이 아니라 프리미티브다." 터미널·브라우저·알림·워크스페이스·분할·탭·CLI를 제공하지만, "이렇게 일하라"고 강제하지 않는다. 도구를 어떻게 조립할지는 사용자 몫. 이 철학이 GUI 오케스트레이터에 질린 시니어 개발자층의 호응을 얻고 있다.

3기술 스택 전체 지도

Swift 85% + TypeScript 웹 백엔드 + Python/Go 보조 도구

cmux는 한 레포 안에 네이티브 macOS 앱웹 백엔드가 함께 산다. GitHub languages API에 따르면 Swift가 압도적이지만(약 30MB), Python·TypeScript·Go·Rust·Objective-C까지 두루 쓰는 다언어 프로젝트다.

네이티브 macOS 앱 (Swift / AppKit / Metal)

레이어기술역할
UIAppKit + SwiftUI 일부창·사이드바·탭바·분할 패널, Vertical tabs 사이드바
터미널 렌더링libghostty (fork)GPU(Metal) 가속 터미널, 폰트/리거처/이모지 처리
브라우저 패널WKWebView인앱 브라우저(터미널 옆에 띄워서 dev 서버 확인)
CLISwift ArgumentParsercmux notify, cmux feed, cmux hooks setup
패키지 관리Swift Package Manager + Xcode모노레포 안 70개 이상의 Swift Package
업데이트Sparkle자동 업데이트 (한 번만 받으면 됨)
FFIRust (CommandPaletteNucleoFFI)커맨드 팔레트 fuzzy 검색 (Nucleo 매처)
용어
AppKit / SwiftUI
macOS 앱을 만들 때 쓰는 Apple 공식 UI 프레임워크 두 가지. AppKit은 옛날부터 있던 강력한 저수준 UI(창·메뉴·NSView 기반). SwiftUI는 2019년 등장한 선언형 신규 UI. cmux는 사이드바·탭 같은 복잡한 인터랙션을 위해 주로 AppKit을 쓰고, 일부 모달·설정만 SwiftUI를 섞어 쓴다.
용어
libghostty
Ghostty 터미널을 라이브러리 형태로 묶은 것. C로 노출된 ABI(ghostty.h)를 통해 외부 앱이 "터미널 surface 하나" 단위로 임베드할 수 있다. cmux는 자체 윈도우/탭/사이드바를 가진 채로 각 패널 안에 libghostty surface를 끼워 넣는다.

웹 백엔드 / 문서 사이트 (Next.js + Effect + Drizzle)

cmux는 cmux.com(랜딩)과 cmux.dev/docs(문서)를 위한 풀스택 Next.js 앱도 같이 운영한다. 흥미로운 점은 Effect (effect-ts)를 채택했다는 것 — 함수형 에러 처리·동시성·의존성 주입을 한 번에 처리하는 TypeScript 런타임이다.

분류패키지역할
프레임워크Next.js 16 + React 19App Router 기반 풀스택
런타임BunNode 대신 Bun으로 빌드·테스트
DB ORMDrizzle ORM 1.0 beta타입 안전한 SQL
DBPostgreSQL (AWS RDS, IAM 인증)로컬은 docker-compose, 프로덕션은 RDS
인증Stackframe (stack-auth)오픈소스 Clerk 대안, Swift SDK도 vendor화
VM 샌드박스e2b + freestylecmux Cloud VM (Founder's Edition에 포함)
i18nnext-intlREADME가 18개 언어로 번역됨
이메일Resend알림·인증 메일
호스팅VercelOIDC로 AWS IAM 자격증명 발급
관측OpenTelemetry + PostHog분산 트레이싱 + 프로덕트 분석

CLI 보조 / 데몬 / 테스트 (Python · Go · Bun)

4아키텍처 심화 분석

"하나의 socket이 모든 것을 연결한다"

cmux의 모든 외부 통합(CLI 명령·에이전트 훅·이벤트 스트림·Feed 권한 요청)은 유닉스 도메인 소켓 하나로 모인다. 그래서 외부 도구는 cmux 앱이 떠 있을 때 같은 소켓에 연결하면 워크스페이스를 만들고, 패널을 분할하고, 키 입력을 보내고, 브라우저를 자동화할 수 있다.

┌──────────────────────────────────────────────────────────────────────────┐ │ cmux macOS App (Swift / AppKit) │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ Workspace 1 │ │ Workspace 2 │ │ Workspace 3 │ │ │ │ branch: main │ │ branch: feat-x │ │ PR #1234 ready │ │ │ │ ● Claude Code │ │ ○ Codex idle │ │ ◉ OpenCode wait│ ← 사이드바 │ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │ │ │ │ │ │ │ ┌────────▼─────────────────────▼─────────────────────▼─────────┐ │ │ │ Pane / Surface 모델 — 각 surface는 terminal 또는 browser │ │ │ │ │ │ │ │ ┌──── Terminal Surface ────┐ ┌──── Browser Surface ────┐ │ │ │ │ │ libghostty (Metal GPU) │ │ WKWebView + a11y tree │ │ │ │ │ │ - VT 시퀀스 파서 │ │ - click / fill / eval │ │ │ │ │ │ - OSC 9/99/777 노티 │ │ - port to agent-browser│ │ │ │ │ └───────────┬───────────────┘ └───────────┬─────────────┘ │ │ │ └───────────────┼──────────────────────────────┼───────────────┘ │ │ │ │ │ │ ┌───────────────▼──────────────────────────────▼───────────────┐ │ │ │ CMUX Unix Domain Socket (~/.cmuxterm/socket) │ │ │ │ v2 JSON-RPC: surface.*, workspace.*, feed.*, events.stream │ │ │ └────────┬───────────────────┬────────────────┬─────────────────┘ │ └───────────┼───────────────────┼────────────────┼─────────────────────────┘ │ │ │ ┌────────▼─────┐ ┌─────────▼────────┐ ┌───▼──────────────┐ │ cmux CLI │ │ Agent hooks │ │ events.jsonl │ │ (Swift) │ │ (claude/codex/ │ │ audit log │ │ - notify │ │ opencode/...) │ │ - workspace.* │ │ - feed │ │ PreToolUse, │ │ - surface.* │ │ - hooks setup│ │ PermissionReq, │ │ - feed.* │ │ - top │ │ Notification │ │ - agent.* │ └──────────────┘ └──────────────────┘ └──────────────────┘

핵심 설계 패턴 1 — 5단계 객체 계층

cmux의 모든 자동화 API는 5단계 계층을 일관되게 사용한다. 이 용어가 docs/agent-browser-port-spec.md에 명시돼 있다.

이름의미비유
windowmacOS 네이티브 윈도우크롬의 "윈도우"
workspace윈도우 안의 사이드바 항목 (UI에선 "tab")크롬의 "탭 그룹"
paneworkspace 안의 분할 영역tmux의 "pane"
surfacepane 안의 탭 (terminal 또는 browser)iTerm의 "tab"
panel내부 구현 용어, 외부 API는 surface로 표준화레거시 별칭
건물 비유

window는 빌딩, workspace는 층, pane은 한 층 안의 사무실 칸막이, surface는 칸막이 안의 책상이다.

에이전트가 작업할 때는 항상 "어느 책상에서 일하는지(surface_id)"를 알아야 하므로, surface가 모든 자동화의 1급 시민이다.

핵심 설계 패턴 2 — OSC 시퀀스로 알림 트리거

cmux 알림의 핵심은 VT 터미널 escape sequence를 사용한다는 것. 에이전트(예: Claude Code)가 표준 출력으로 OSC 9(macOS 알림) 또는 OSC 777(VTE 알림)을 보내면 cmux가 가로채서 사이드바 탭에 파란 링을 띄운다.

용어
OSC (Operating System Command, OS 명령)
터미널 escape sequence의 한 종류. ESC ] N ; payload BEL 형식으로 "터미널에게 OS 수준의 일을 시키는" 명령이다. OSC 9는 iTerm2가 만든 사실상의 macOS 알림 표준이고, OSC 777은 VTE 기반 리눅스 터미널의 표준. cmux는 둘 다 파싱한다.

이게 똑똑한 이유 — 에이전트는 cmux를 알 필요가 없다. Claude Code/Codex가 평소처럼 OSC를 쏘기만 하면 자동으로 사이드바 알림이 뜬다. cmux를 모르고도 호환된다.

핵심 설계 패턴 3 — Feed (Vibe Island 스타일 권한 패널)

에이전트가 권한을 요청할 때(예: 셸 실행, 파일 쓰기) 보통 터미널 안에서 yes/no를 받는다. cmux는 Feed라는 별도 사이드바를 두고, 거기서 키보드만으로 권한·계획·질문을 처리할 수 있게 한다.

Agent CLI (Claude/Codex/...) │ ← hook script가 stdin으로 payload를 받음 ▼ cmux hooks feed (CLI) ──소켓 호출──▶ feed.push (V2 verb) │ ▼ FeedCoordinator (Swift @MainActor) · request_id 기준 semaphore에 park (최대 120s) · WorkstreamStore에 링버퍼 + JSONL 감사 │ ┌───────────────┴───────────────┐ ▼ ▼ Vibe Island UI (사이드바) Feed TUI (OpenTUI/Bun) · Once / Always / Deny · 키보드만으로 처리

이게 human-in-the-loop(사람이 끼어드는 루프)를 깔끔하게 처리하는 패턴이다. 에이전트는 권한 요청을 보내고 최대 120초까지 대기한다. 사용자가 응답하면 hook은 그 결과를 stdout으로 돌려주고, 에이전트는 작업을 이어간다.

핵심 설계 패턴 4 — 이벤트 스트림 (재연결 가능한 JSONL)

cmux의 모든 상태 변화(workspace 생성·pane 분할·notification·feed·agent hook)는 monotonic seq + boot_id로 식별되는 이벤트로 발행된다. 두 가지 경로:

cmux 재시작 시 boot_id가 바뀌므로 클라이언트는 끊긴 커서를 "resume gap"으로 인식하고 다시 동기화할 수 있다.

핵심 설계 패턴 5 — 세션 복원 메커니즘

각 에이전트마다 session hook이 실행되면서 ~/.cmuxterm/<agent>-hook-sessions.json에 세션 ID를 기록한다. 앱 재시작 시 cmux는 그 ID를 읽어 각 에이전트의 네이티브 resume 명령을 자동 실행한다.

에이전트설치 파일resume 명령
Claude Codewrapper-injected settingsclaude --resume <id>
Codex~/.codex/hooks.jsoncodex resume <id>
OpenCode~/.config/opencode/plugins/cmux-session.jsopencode --session <id>
Gemini~/.gemini/settings.jsongemini --resume <id>
Cursor CLI~/.cursor/hooks.jsoncursor-agent --resume <id>
Amp~/.config/amp/plugins/cmux-session.tsamp threads continue <id>

중요한 보안 처리 — sanitizer가 prompt·자격증명·이전 세션 selector·noninteractive 플래그를 제거한다. 그래서 복원이 새 작업을 시작하거나 시크릿을 흘리지 않고 정확히 같은 세션을 재개한다.

5디렉토리 구조 해부

모노레포 — 네이티브 앱 + 웹 백엔드 + CLI + 데몬 + Ghostty fork

cmux/ ├── README.md (+ 18개 언어별 README) ├── CLAUDE.md, AGENTS.md ← 에이전트가 이 레포에서 일하는 법 ├── package.json ← Bun 의존성 (feed-tui용) ├── ghostty/ (git submodule) ← Ghostty fork (manaflow-ai/ghostty) │ ├── Sources/ ★ 메인 macOS 앱 (Swift) │ ├── AppDelegate.swift │ ├── App/ ← 앱 진입, MainWindow, Workspace │ ├── Auth/ ← Stack Auth 통합 │ ├── Cloud/ ← Cloud VM launcher │ ├── BackgroundWorkspacePrimeCoordinator.swift │ ├── BrowserPaneDropTargetView.swift │ ├── CmuxConfig.swift, CmuxConfigExecutor.swift │ ├── CmuxEventBus.swift, CmuxEventStream.swift │ ├── AppleScriptSupport.swift ← AppleScript로 외부 자동화 │ └── ... (수백 개 Swift 파일) │ ├── CLI/ ★ cmux CLI (Swift) │ ├── cmux.swift ← 메인 엔트리 (ArgumentParser 마이그레이션 중) │ ├── CMUXCLI+AgentHookDefinitions.swift │ ├── CMUXCLI+HermesAgentHooks.swift │ ├── CMUXCLI+TmuxCompatSupport.swift │ ├── CMUXCLI+TopRendering.swift ← cmux top (htop처럼) │ └── CLISocketPathResolver.swift │ ├── Packages/ ★ Swift Package 70개 이상 │ ├── CMUXAgentLaunch ← 에이전트 시작 로직 │ ├── CMUXAgentVault ← 자격증명 안전 저장 │ ├── CMUXAuthCore ← 인증 코어 │ ├── CMUXDebugLog │ ├── CMUXPasteboardFidelity ← 클립보드 충실도 보장 │ ├── CMUXSocketPathDomain ← 소켓 경로 해석 │ ├── CMUXWorkstream ← Feed/Vibe Island │ └── CmuxExtensionKit │ ├── Native/ ← Rust FFI │ └── CommandPaletteNucleoFFI/ ← fuzzy 검색 매처 │ ├── daemon/remote/ ← Go 원격 데몬 (Cloud VM용) ├── vendor/ │ ├── bonsplit ← 탭바 라이브러리 vendor │ └── stack-auth-swift-sdk-prerelease/ │ ├── web/ ★ Next.js 풀스택 (cmux.com, cmux.dev/docs) │ ├── app/ ← App Router 페이지 │ ├── db/ ← Drizzle 스키마 │ ├── i18n/, messages/ ← next-intl 번역 │ ├── proxy.ts ← Cloud VM 프록시 │ ├── scripts/ │ │ ├── cloud-vm/ ← VM 마이그레이션·스모크·스트레스 │ │ ├── db-local.sh ← 로컬 Postgres docker-compose │ │ └── migrate-aws-rds-iam.ts │ └── package.json ← Effect, Drizzle, Stackframe... │ ├── tests/, tests_v2/ ← Python pytest (v1 = 레거시, v2 = 신 API) ├── dogfood/ ← 내부 사용 시나리오 ├── scripts/ ← 빌드·서명·업로드·아이콘 생성 ├── docs/ ★ 외부 공개 명세서 │ ├── cli-contract.md ← CLI 호환성 계약 │ ├── notifications.md │ ├── agent-hooks.md │ ├── agent-browser-port-spec.md │ ├── feed.md, events.md │ ├── ghostty-fork.md ← fork 변경 이력 │ └── vault.md, remote-daemon-spec.md └── skills/, skills.sh ← Claude Code Skills 통합

주목할 만한 디자인:

6학습 포인트 (기술별)

cmux 코드를 읽으며 배울 수 있는 것들

(1) Swift + AppKit으로 네이티브 macOS 앱 만들기

SwiftUI만 알고 있다면 cmux 같은 복잡한 데스크톱 앱은 만들기 힘들다. AppKit은 NSWindow·NSView·NSWindowController·NSResponder chain 같은 OS X 시절의 강력한 저수준 API를 제공한다. cmux는 사이드바·탭 드래그·창 분할·다중 디스플레이 처리·VoiceOver 접근성까지 AppKit의 진면목을 보여준다.

실습 아이디어: "vertical tabs를 가진 미니 텍스트 에디터" — NSSplitViewController + NSTableView 사이드바로 시작.

(2) libghostty / 외부 C 라이브러리 임베드

cmux-Bridging-Header.hghostty.h를 통해 Zig로 작성된 라이브러리를 Swift에서 호출한다. 이건 시스템 프로그래밍과 앱 개발의 경계가 모호한 영역의 학습 자료다.

실습 아이디어: SQLite C API를 Swift에서 직접 호출해 보기. 다음 단계로 libgit2.

(3) 유닉스 도메인 소켓 + JSON-RPC API 설계

cmux의 모든 외부 통합은 ~/.cmuxterm/socket 한 곳을 통한다. 이런 단일 소켓 IPC 패턴은 tmux·MPV·Docker daemon이 다 쓰는 검증된 패턴이다.

실습 아이디어: Python으로 asyncio.start_unix_server() 기반 미니 서버 만들기. request_id·method·params·result 4필드 JSON-RPC만 구현해 보면 cmux 소켓 프로토콜이 이해된다.

(4) 에이전트 훅 — "외부 도구를 침범 없이 통합하기"

cmux는 Claude/Codex/OpenCode 등 12+ 에이전트를 통합하는데, 그들의 코드를 수정하지 않는다. 대신 각 에이전트의 공식 hook 설정 파일에 cmux 명령을 끼워 넣는다. 이건 "남의 도구와 잘 어울려 살기"의 좋은 예다.

실습 아이디어: 본인이 자주 쓰는 CLI 도구의 "post-execution hook"을 찾아서, 끝나면 macOS 알림을 띄우는 wrapper 만들기.

(5) Ghostty fork 운영 노하우

docs/ghostty-fork.md는 fork 운영의 모범 사례다. 모든 패치가 upstream 커밋 해시·해당 파일·요약·rebase 충돌 메모와 함께 나열돼 있고, fork SHA가 git submodule + 체크섬 파일로 pin된다.

실습 아이디어: 본인이 자주 쓰는 오픈소스를 fork해서, "upstream으로 PR 보낼 commit"과 "로컬에만 남길 commit"을 분리해 관리해 보기.

(6) Effect TypeScript 런타임

web/ 백엔드는 RxJS·Promise·async/await 대신 effect 라이브러리를 쓴다. Effect는 자바의 ZIO나 Cats Effect와 비슷한 "타입 안전한 효과 시스템"으로, 에러·동시성·의존성을 한 시스템에서 다룬다.

실습 아이디어: fetch + JSON.parse + error handling을 Effect로 다시 써 보기. 처음에는 무겁게 느껴지지만 큰 시스템에서 진가가 드러난다.

(7) Drizzle ORM + AWS RDS IAM 인증

web/ 백엔드는 Drizzle 1.0 beta에 AWS RDS IAM 토큰 발급(@aws-sdk/rds-signer)을 통합한다. 비밀번호 대신 OIDC로 발급된 IAM 토큰으로 DB에 접속하는 모던 패턴.

실습 아이디어: Postgres + Drizzle ORM 미니 프로젝트 만들고, 거기에 IAM 토큰 인증을 얹기.

(8) WKWebView로 인앱 브라우저 + 자동화 API

cmux는 vercel-labs/agent-browser의 명령 표면을 WKWebView 위로 포팅했다. accessibility tree 스냅샷·element ref·click·fill·evaluate JS — LLM이 안정된 핸들로 브라우저를 조작할 수 있게 한다.

실습 아이디어: Playwright나 Puppeteer로 같은 기능을 만들어 보기. cmux가 왜 native WKWebView를 골랐는지 비교할 수 있다.

7하드웨어/시스템 요구사항

macOS 14+ 권장 · Apple Silicon 또는 Intel

지원 환경

설치 옵션

개발 환경 (cmux 자체를 빌드하려면)

8직접 해볼 수 있는 실습 과제

난이도별 실습 — 처음 만지는 사람부터 컨트리뷰터 지망생까지

난이도 ★ 입문

cmux + Claude Code로 알림 받아 보기

brew로 cmux 설치 → claude 실행 → 긴 작업 시키기(예: "이 디렉토리의 모든 파일을 읽고 요약"). 작업이 완료되거나 권한 요청이 뜨면 사이드바 탭에 파란 링이 들어오는지 확인. Cmd+Shift+U로 점프되는지 확인.

brew tap manaflow-ai/cmux brew install --cask cmux # cmux 실행 후 새 워크스페이스 claude --dangerously-skip-permissions
난이도 ★★ 초급

OSC 9 알림을 직접 쏘는 셸 스크립트

에이전트 없이도 cmux 알림을 띄울 수 있다. echo로 OSC escape sequence를 쏘거나 cmux notify CLI를 쓴다. 본인의 긴 빌드 명령 끝에 후크로 붙여 보기.

# OSC 9 직접 발행 printf '\x1b]9;빌드 완료\x07' # cmux CLI (둘 다 됨) cmux notify --title "빌드 완료" --body "타임: $(date +%T)" # 기존 명령 뒤에 붙이는 패턴 long-running-command && cmux notify --title "완료" || cmux notify --title "실패"
난이도 ★★★ 중급

cmux events로 이벤트 스트림 처리

cmux 상태 변화를 JSONL로 받아 자기만의 대시보드/메트릭을 만들어 보기. 예: "오늘 내가 워크스페이스를 몇 개 만들었는지"·"AI 에이전트가 권한 요청한 횟수" 같은 통계 추출.

cmux events --cursor-file ~/.cache/cmux/events.seq --reconnect \ --category workspace --category feed \ | jq -r 'select(.category=="feed") | .payload.kind' \ | sort | uniq -c
난이도 ★★★★ 고급

인앱 브라우저 자동화 스크립트 작성

cmux의 브라우저 API로 dev 서버를 자동 확인하는 스크립트 만들기. 예: 코드 수정 → Vite dev server 리로드 대기 → 페이지 스크린샷 → accessibility tree 덤프 → 에이전트에 피드백.

docs/agent-browser-port-spec.md를 읽고 system.identify·page.evaluate·page.click 메서드를 조합한다.

난이도 ★★★★★ 컨트리뷰터 도전

새로운 에이전트 훅 통합 추가

아직 cmux가 통합 안 한 에이전트(예: 새로 나온 코딩 CLI)에 대한 hook 통합을 추가해 PR 보내기. Sources/CMUXCLI+*HookDefinitions.swift 패턴을 보고 동일한 구조로 구현. docs/agent-hooks.md에 표 한 줄 추가.

핵심은 (1) binary 존재 체크, (2) hook 설정 파일 경로, (3) session resume 명령, (4) Feed bridge 매핑, (5) sanitizer 규칙.

9관련 기술 심화 학습 로드맵

cmux를 읽고 만들 수 있게 되려면 — 12주 계획

주차주제학습 자료 / 실습
1~2Swift 기초 + Swift ConcurrencyApple "The Swift Programming Language" 책, async/await·actor·@MainActor 챕터까지
3~4AppKit 기본Hacking with macOS 책. NSWindow / NSViewController / NSResponder chain / NSTableView 데이터소스
5터미널 작동 원리pty(pseudo-terminal), VT100 escape sequence, OSC/CSI 명령. Ghostty 블로그 글 + xterm.js docs 읽기
6유닉스 도메인 소켓 + JSON-RPCtmux의 client/server 모델 분석. man tmux + tmux 소스에서 cmd-*.c 패턴 보기
7C 라이브러리를 Swift에서 호출Bridging Header, UnsafePointer, OpaquePointer. libsqlite3로 미니 SQL 클라이언트
8WebExtensions vs WKWebView 자동화WKUserContentController, message handler, evaluateJavaScript. Playwright 비교 분석
9Effect TypeScript + Drizzleeffect.website 튜토리얼. 미니 fetch wrapper → 더 복잡한 effect Layer
10오픈소스 fork 운영cmux의 docs/ghostty-fork.md 정독 + 본인 프로젝트에 적용. git submodule, prebuilt artifact pin
11모노레포 빌드 (Swift PM)Package.swift 작성, target dependency graph, resource bundling, xcframework
12cmux 코드 리딩 + PR 만들기이슈 리스트(2123개)에서 "good first issue" 라벨 찾기. CONTRIBUTING.md 따라 환경 세팅

10핵심 키워드 사전

cmux 코드와 문서에 자주 등장하는 용어

용어
Ghostty
Mitchell Hashimoto가 만든 GPU 가속 터미널 에뮬레이터. Zig 언어로 작성. 2025년 오픈소스 공개 후 macOS·Linux에서 빠르게 점유율 확보. cmux는 Ghostty의 fork(manaflow-ai/ghostty)를 submodule로 임베드한다.
용어
libghostty
Ghostty의 핵심 렌더링·VT 파싱 로직을 라이브러리(xcframework)로 패키징한 것. C ABI(ghostty.h)로 노출돼 cmux 같은 외부 호스트 앱이 임베드할 수 있다.
용어
surface
cmux 자동화 API의 1급 시민. pane 안의 탭 한 개를 가리키며, terminal일 수도 browser일 수도 있다. 모든 자동화는 surface_id 단위로 동작한다.
용어
Feed (피드)
cmux의 사이드바 패널. 에이전트의 권한 요청(PermissionRequest)·계획 확인(ExitPlanMode)·질문(AskUserQuestion)을 키보드만으로 처리하게 해 준다. Vibe Island 스타일 UI + OpenTUI 기반 TUI 두 가지.
용어
hook (훅)
에이전트가 특정 이벤트(도구 사용 전, 권한 요청, 알림, 세션 종료) 때 외부 스크립트를 호출하게 해 주는 메커니즘. cmux는 각 에이전트의 공식 hook 설정 파일에 자신의 명령을 끼워 넣는 식으로 통합한다.
용어
OSC 9 / OSC 777
터미널에서 알림을 띄우는 escape sequence 두 가지. OSC 9는 iTerm2가 만든 macOS 알림 사실상 표준. OSC 777은 VTE(GNOME Terminal 등)의 리눅스 표준. cmux는 둘 다 가로채서 사이드바 알림으로 변환한다.
용어
Sparkle
macOS 앱용 자동 업데이트 프레임워크 사실상 표준. cmux는 stable과 nightly 두 채널에 각각 Sparkle feed를 운영한다.
용어
Effect (effect-ts)
TypeScript용 함수형 런타임. 에러 타입·동시성·의존성 주입을 한 시스템에서 다룬다. cmux의 web/ 백엔드 핵심. ZIO·Cats Effect와 컨셉 유사.
용어
Drizzle ORM
TypeScript 타입 안전 SQL ORM. Prisma 대비 가볍고 SQL에 가깝다. cmux web/은 Drizzle 1.0 beta + PostgreSQL을 쓴다.
용어
Stackframe (Stack Auth)
오픈소스 인증 SaaS. Clerk·Auth0의 셀프호스팅 가능 대안. cmux는 Swift SDK까지 vendor 디렉토리에 prerelease로 가져와 쓴다.
용어
GPL-3.0-or-later
강력한 copyleft 라이선스. 소프트웨어를 수정·배포할 때 소스 공개 의무가 발생. cmux는 GPL-3.0-or-later + 상업용 듀얼 라이선스 구조를 채택한다. 개인·오픈소스 프로젝트는 GPL 조건 하에 자유롭게 쓸 수 있고, 상업적 재배포가 필요한 회사는 별도 상업용 라이선스를 구매한다.
용어
e2b / freestyle
에이전트가 코드를 안전하게 실행할 수 있는 클라우드 샌드박스 VM 서비스. cmux의 Cloud VM(Founder's Edition)이 이를 활용해 원격 dev 환경을 제공.

11참고 링크

공식 자료 + 학습에 도움 되는 외부 리소스

시도해볼 만한 것

"AI 에이전트를 병렬로 굴리고 있다면 — cmux는 지금 깔아 볼 가치가 있다"

  1. brew로 깔고 5분 써 보기. Claude Code 세션 두세 개를 다른 워크스페이스에 띄우고, Cmd+Shift+U로 점프해 보기. 평소 "어디서 알림 떴지?" 짜증이 사라지는지 확인.
  2. OSC 9 알림을 본인 빌드 스크립트에 붙이기. cmux notify 한 줄이면 충분. cmux 없는 환경 대비 fallback도 1줄 추가하면 끝.
  3. docs/cli-contract.md를 읽어 보기. CLI 호환성 계약을 문서화하는 모범 사례. 본인 프로젝트의 CLI 안정성을 어떻게 보장할지 영감을 얻을 수 있다.
  4. Sources/ 디렉토리를 GitHub에서 훑기. Swift 코드를 읽을 수 있다면 AppDelegate.swift부터 시작. +Extension 분리 방식으로 거대 파일을 어떻게 다루는지 학습.
  5. "primitive vs solution" 철학을 본인 도구에 적용해 보기. 본인이 만드는 도구가 사용자에게 워크플로를 강요하는지, 아니면 조합 가능한 원시 요소를 주는지 점검.
원문: github.com/manaflow-ai/cmux
수집일: 2026-05-26 · 라이선스: GPL-3.0-or-later (+ 상업용 듀얼) · 주력 언어: Swift · 별 19,524개
Trendshift 순위: #16 (Daily, 2026-05-26)