API Reference
cmux provides both a CLI tool and a Unix socket for programmatic control. Every command is available through both interfaces.
Socket
| Build | Path |
|---|---|
| Release | /tmp/cmux.sock |
| Debug | /tmp/cmux-debug.sock |
| Tagged debug build | /tmp/cmux-debug-<tag>.sock |
Override with the CMUX_SOCKET_PATH environment variable. Send one newline-terminated JSON request per call:
{"id":"req-1","method":"workspace.list","params":{}}
// Response:
{"id":"req-1","ok":true,"result":{"workspaces":[...]}}{"command":"..."} are not supported.Access modes
| Mode | Description | How to enable |
|---|---|---|
| Off | Socket disabled | Settings UI or CMUX_SOCKET_MODE=off |
| cmux processes only | Only processes spawned inside cmux terminals can connect. | Default mode in Settings UI |
| allowAll | Allow any local process to connect (no ancestry check). | Environment override only: CMUX_SOCKET_MODE=allowAll |
CLI options
| Flag | Description |
|---|---|
--socket PATH | Custom socket path |
--json | Output in JSON format |
--window ID | Target a specific window |
--workspace ID | Target a specific workspace |
--surface ID | Target a specific surface |
--id-format refs|uuids|both | Control identifier format in JSON output |
Workspace commands
list-workspaces
List all open workspaces.
cmux list-workspaces
cmux list-workspaces --json{"id":"ws-list","method":"workspace.list","params":{}}new-workspace
Create a new workspace.
cmux new-workspace{"id":"ws-new","method":"workspace.create","params":{}}select-workspace
Switch to a specific workspace.
cmux select-workspace --workspace <id>{"id":"ws-select","method":"workspace.select","params":{"workspace_id":"<id>"}}current-workspace
Get the currently active workspace.
cmux current-workspace
cmux current-workspace --json{"id":"ws-current","method":"workspace.current","params":{}}close-workspace
Close a workspace.
cmux close-workspace --workspace <id>{"id":"ws-close","method":"workspace.close","params":{"workspace_id":"<id>"}}Split commands
new-split
Create a new split pane. Directions: left, right, up, down.
cmux new-split right
cmux new-split down{"id":"split-new","method":"surface.split","params":{"direction":"right"}}list-surfaces
List all surfaces in the current workspace.
cmux list-surfaces
cmux list-surfaces --json{"id":"surface-list","method":"surface.list","params":{}}focus-surface
Focus a specific surface.
cmux focus-surface --surface <id>{"id":"surface-focus","method":"surface.focus","params":{"surface_id":"<id>"}}Input commands
send
Send text input to the focused terminal.
cmux send "echo hello"
cmux send "ls -la\n"{"id":"send-text","method":"surface.send_text","params":{"text":"echo hello\n"}}send-key
Send a key press. Keys: enter, tab, escape, backspace, delete, up, down, left, right.
cmux send-key enter{"id":"send-key","method":"surface.send_key","params":{"key":"enter"}}send-surface
Send text to a specific surface.
cmux send-surface --surface <id> "command"{"id":"send-surface","method":"surface.send_text","params":{"surface_id":"<id>","text":"command"}}send-key-surface
Send a key press to a specific surface.
cmux send-key-surface --surface <id> enter{"id":"send-key-surface","method":"surface.send_key","params":{"surface_id":"<id>","key":"enter"}}Notification commands
notify
Send a notification.
cmux notify --title "Title" --body "Body"
cmux notify --title "T" --subtitle "S" --body "B"{"id":"notify","method":"notification.create","params":{"title":"Title","subtitle":"S","body":"Body"}}list-notifications
List all notifications.
cmux list-notifications
cmux list-notifications --json{"id":"notif-list","method":"notification.list","params":{}}clear-notifications
Clear all notifications.
cmux clear-notifications{"id":"notif-clear","method":"notification.clear","params":{}}Sidebar metadata commands
Set status pills, progress bars, and log entries in the sidebar for any workspace. Useful for build scripts, CI integrations, and AI coding agents that want to surface state at a glance.
set-status
Set a sidebar status pill. Use a unique key so different tools can manage their own entries.
cmux set-status build "compiling" --icon hammer --color "#ff9500"
cmux set-status deploy "v1.2.3" --workspace workspace:2set_status build compiling --icon=hammer --color=#ff9500 --tab=<workspace-uuid>clear-status
Remove a sidebar status entry by key.
cmux clear-status buildclear_status build --tab=<workspace-uuid>list-status
List all sidebar status entries for a workspace.
cmux list-statuslist_status --tab=<workspace-uuid>set-progress
Set a progress bar in the sidebar (0.0 to 1.0).
cmux set-progress 0.5 --label "Building..."
cmux set-progress 1.0 --label "Done"set_progress 0.5 --label=Building... --tab=<workspace-uuid>clear-progress
Clear the sidebar progress bar.
cmux clear-progressclear_progress --tab=<workspace-uuid>log
Append a log entry to the sidebar. Levels: info, progress, success, warning, error.
cmux log "Build started"
cmux log --level error --source build "Compilation failed"
cmux log --level success -- "All 42 tests passed"log --level=error --source=build --tab=<workspace-uuid> -- Compilation failedclear-log
Clear all sidebar log entries.
cmux clear-logclear_log --tab=<workspace-uuid>list-log
List sidebar log entries.
cmux list-log
cmux list-log --limit 5list_log --limit=5 --tab=<workspace-uuid>sidebar-state
Dump all sidebar metadata (cwd, git branch, ports, status, progress, logs).
cmux sidebar-state
cmux sidebar-state --workspace workspace:2sidebar_state --tab=<workspace-uuid>Utility commands
ping
Check if cmux is running and responsive.
cmux ping{"id":"ping","method":"system.ping","params":{}}
// Response: {"id":"ping","ok":true,"result":{"pong":true}}capabilities
List available socket methods and current access mode.
cmux capabilities
cmux capabilities --json{"id":"caps","method":"system.capabilities","params":{}}identify
Show focused window/workspace/pane/surface context.
cmux identify
cmux identify --json{"id":"identify","method":"system.identify","params":{}}Environment variables
| Variable | Description |
|---|---|
CMUX_SOCKET_PATH | Override the socket path used by CLI and integrations |
CMUX_SOCKET_ENABLE | Force-enable/disable socket (1/0, true/false, on/off) |
CMUX_SOCKET_MODE | Override access mode (cmuxOnly, allowAll, off). Also accepts cmux-only/cmux_only and allow-all/allow_all |
CMUX_WORKSPACE_ID | Auto-set: current workspace ID |
CMUX_SURFACE_ID | Auto-set: current surface ID |
TERM_PROGRAM | Set to ghostty |
TERM | Set to xterm-ghostty |
Detecting cmux
# Prefer explicit socket path if set
SOCK="${CMUX_SOCKET_PATH:-/tmp/cmux.sock}"
[ -S "$SOCK" ] && echo "Socket available"
# Check for the CLI
command -v cmux &>/dev/null && echo "cmux available"
# In cmux-managed terminals these are auto-set
[ -n "${CMUX_WORKSPACE_ID:-}" ] && [ -n "${CMUX_SURFACE_ID:-}" ] && echo "Inside cmux surface"
# Distinguish from regular Ghostty
[ "$TERM_PROGRAM" = "ghostty" ] && [ -n "${CMUX_WORKSPACE_ID:-}" ] && echo "In cmux"Examples
Python client
import json
import os
import socket
SOCKET_PATH = os.environ.get("CMUX_SOCKET_PATH", "/tmp/cmux.sock")
def rpc(method, params=None, req_id=1):
payload = {"id": req_id, "method": method, "params": params or {}}
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock:
sock.connect(SOCKET_PATH)
sock.sendall(json.dumps(payload).encode("utf-8") + b"\n")
return json.loads(sock.recv(65536).decode("utf-8"))
# List workspaces
print(rpc("workspace.list", req_id="ws"))
# Send notification
print(rpc(
"notification.create",
{"title": "Hello", "body": "From Python!"},
req_id="notify"
))Shell script
#!/bin/bash
SOCK="${CMUX_SOCKET_PATH:-/tmp/cmux.sock}"
cmux_cmd() {
printf "%s\n" "$1" | nc -U "$SOCK"
}
cmux_cmd '{"id":"ws","method":"workspace.list","params":{}}'
cmux_cmd '{"id":"notify","method":"notification.create","params":{"title":"Done","body":"Task complete"}}'Build script with notification
#!/bin/bash
npm run build
if [ $? -eq 0 ]; then
cmux notify --title "✓ Build Success" --body "Ready to deploy"
else
cmux notify --title "✗ Build Failed" --body "Check the logs"
fi