cmux-settings
cmux reads user settings from ~/.config/cmux/cmux.json (JSONC). A file watcher applies changes on save, no restart. Legacy ~/.config/cmux/settings.json is read only as a fallback for keys absent from cmux.json.
Schema: https://raw.githubusercontent.com/manaflow-ai/cmux/main/web/data/cmux.schema.json. The authoritative path list is Sources/CmuxSettingsJSONPathSupport.swift; the installed skill carries a generated copy in references/all-keys.md. Settings sections are app, terminal, notifications, sidebar, sidebarAppearance, workspaceColors, automation, browser, shortcuts. Non-settings sections (actions, ui, commands, vault, rightSidebar) share the same file.
Helper script
Use the bundled helper for every read/write. It strips JSONC comments, writes atomically, and validates keys against the schema.
skills/cmux-settings/scripts/cmux-settings <subcommand> # from a cmux checkout
~/.codex/skills/cmux-settings/scripts/cmux-settings <subcommand> # installed Codex skill
The rest of this doc assumes it is on $PATH as cmux-settings; from a checkout, export PATH="$PWD/skills/cmux-settings/scripts:$PATH".
| Command |
What it does |
cmux-settings path |
Print the config path. |
cmux-settings dump |
Print the raw file (preserves comments). |
cmux-settings dump --no-comments |
Print the parsed JSON. |
cmux-settings get <a.b.c> |
Print value at dotted JSON path. |
cmux-settings set <a.b.c> <value> |
Set value. <value> is parsed as JSON (true, 42, "text", […], {…}); unquoted plain words are stored as strings. |
cmux-settings unset <a.b.c> |
Delete key, reverting to the in-app default. |
cmux-settings list-supported |
List every settings JSON path the app recognizes. |
cmux-settings validate |
Parse the file and flag unknown settings keys. |
cmux-settings open |
Open cmux.json in $EDITOR, VS Code, Cursor, or TextEdit. |
--file <path> overrides the target file, useful for --file ~/.config/cmux/settings.json.
Workflow
- Look up the key when the user named a setting in plain English:
cmux-settings list-supported | rg -i 'sidebar.*terminal|terminal.*sidebar'
- Set it. JSON literals must be valid JSON.
cmux-settings set sidebarAppearance.matchTerminalBackground true
cmux-settings set app.appearance dark
cmux-settings set shortcuts.bindings.newTab '["ctrl+b","c"]'
cmux-settings set browser.hostsToOpenInEmbeddedBrowser '["localhost","*.internal.example"]'
- Read back and
cmux-settings validate.
- Tell the user it auto-reloaded, and that
cmux-settings unset <key> reverts it.
Quick reference
- Appearance:
app.appearance ("system" | "light" | "dark"), app.appIcon, app.menuBarOnly, app.minimalMode.
- Sidebar tint:
sidebarAppearance.matchTerminalBackground, .tintColor, .tintOpacity (0..1).
- Sidebar details:
sidebar.hideAllDetails, .showBranchDirectory, .showPullRequests, .showPorts, .showLog.
- Notifications:
notifications.dockBadge, .sound (enum including "none", "custom_file"), .customSoundFilePath, .hooks (array).
- Browser:
browser.defaultSearchEngine, .theme, .defaultZoomLevel, .openTerminalLinksInCmuxBrowser, .hostsToOpenInEmbeddedBrowser.
- Automation:
automation.socketControlMode (off | cmuxOnly | automation | password | allowAll), .portBase, .portRange.
- Shortcuts:
shortcuts.bindings.<actionId> = "cmd+b", ["ctrl+b","c"], null, or "" to unbind. Action ids in references/shortcut-actions.md.
Full list of settings, defaults, and descriptions: cmux-settings list-supported or references/all-keys.md.
Rules
- Only edit
cmux.json. Never settings.json unless the user explicitly asks; it is legacy and read only when a key is absent from cmux.json.
- Never tell the user to restart cmux. The file watcher reloads on save.
- Always
cmux-settings validate after a bulk edit. Unknown keys mean the user pasted a key the app does not consume.
- Do not blindly overwrite
actions, ui, commands, vault, or rightSidebar; they share the file and hold hand-tuned non-settings config.
- Shortcut action ids must match the schema enum. Look them up before binding.
- Colors are
#RRGGBB; opacities are 0..1.
- Translate app-level phrasing ("Settings > Notifications > Dock badge") to the JSON path first;
web/app/[locale]/(landing)/docs/configuration/page.tsx mirrors the schema 1:1.
1---2name: cmux-settings3description: View and edit cmux settings in ~/.config/cmux/cmux.json. Use when the user wants to change cmux preferences (appearance, sidebar, notifications, automation, browser, shortcuts), set a value by JSON path, validate the file, open it in an editor, or look up which keys cmux recognizes. Triggers on '/cmux-settings', 'change cmux setting', 'set <something> in cmux', 'cmux config', 'cmux.json', or 'rebind a cmux shortcut'.4---5
6# cmux-settings
7
8cmux reads user settings from `~/.config/cmux/cmux.json` (JSONC). A file watcher applies changes on save, no restart. Legacy `~/.config/cmux/settings.json` is read only as a fallback for keys absent from `cmux.json`.
9
10Schema: `https://raw.githubusercontent.com/manaflow-ai/cmux/main/web/data/cmux.schema.json`. The authoritative path list is `Sources/CmuxSettingsJSONPathSupport.swift`; the installed skill carries a generated copy in `references/all-keys.md`. Settings sections are `app`, `terminal`, `notifications`, `sidebar`, `sidebarAppearance`, `workspaceColors`, `automation`, `browser`, `shortcuts`. Non-settings sections (`actions`, `ui`, `commands`, `vault`, `rightSidebar`) share the same file.
11
12## Helper script
13
14Use the bundled helper for every read/write. It strips JSONC comments, writes atomically, and validates keys against the schema.
15
16```bash
17skills/cmux-settings/scripts/cmux-settings <subcommand> # from a cmux checkout
18~/.codex/skills/cmux-settings/scripts/cmux-settings <subcommand> # installed Codex skill
19```
20
21The rest of this doc assumes it is on `$PATH` as `cmux-settings`; from a checkout, `export PATH="$PWD/skills/cmux-settings/scripts:$PATH"`.
22
23| Command | What it does |
24|---|---|
25| `cmux-settings path` | Print the config path. |
26| `cmux-settings dump` | Print the raw file (preserves comments). |
27| `cmux-settings dump --no-comments` | Print the parsed JSON. |
28| `cmux-settings get <a.b.c>` | Print value at dotted JSON path. |
29| `cmux-settings set <a.b.c> <value>` | Set value. `<value>` is parsed as JSON (`true`, `42`, `"text"`, `[…]`, `{…}`); unquoted plain words are stored as strings. |
30| `cmux-settings unset <a.b.c>` | Delete key, reverting to the in-app default. |
31| `cmux-settings list-supported` | List every settings JSON path the app recognizes. |
32| `cmux-settings validate` | Parse the file and flag unknown settings keys. |
33| `cmux-settings open` | Open `cmux.json` in `$EDITOR`, VS Code, Cursor, or TextEdit. |
34
35`--file <path>` overrides the target file, useful for `--file ~/.config/cmux/settings.json`.
36
37## Workflow
38
391. Look up the key when the user named a setting in plain English:
40 ```bash
41 cmux-settings list-supported | rg -i 'sidebar.*terminal|terminal.*sidebar'
42 ```
432. Set it. JSON literals must be valid JSON.
44 ```bash
45 cmux-settings set sidebarAppearance.matchTerminalBackground true
46 cmux-settings set app.appearance dark
47 cmux-settings set shortcuts.bindings.newTab '["ctrl+b","c"]'
48 cmux-settings set browser.hostsToOpenInEmbeddedBrowser '["localhost","*.internal.example"]'
49 ```
503. Read back and `cmux-settings validate`.
514. Tell the user it auto-reloaded, and that `cmux-settings unset <key>` reverts it.
52
53## Quick reference
54
55- Appearance: `app.appearance` (`"system" | "light" | "dark"`), `app.appIcon`, `app.menuBarOnly`, `app.minimalMode`.
56- Sidebar tint: `sidebarAppearance.matchTerminalBackground`, `.tintColor`, `.tintOpacity` (0..1).
57- Sidebar details: `sidebar.hideAllDetails`, `.showBranchDirectory`, `.showPullRequests`, `.showPorts`, `.showLog`.
58- Notifications: `notifications.dockBadge`, `.sound` (enum including `"none"`, `"custom_file"`), `.customSoundFilePath`, `.hooks` (array).
59- Browser: `browser.defaultSearchEngine`, `.theme`, `.defaultZoomLevel`, `.openTerminalLinksInCmuxBrowser`, `.hostsToOpenInEmbeddedBrowser`.
60- Automation: `automation.socketControlMode` (`off | cmuxOnly | automation | password | allowAll`), `.portBase`, `.portRange`.
61- Shortcuts: `shortcuts.bindings.<actionId>` = `"cmd+b"`, `["ctrl+b","c"]`, `null`, or `""` to unbind. Action ids in [references/shortcut-actions.md](references/shortcut-actions.md).
62
63Full list of settings, defaults, and descriptions: `cmux-settings list-supported` or [references/all-keys.md](references/all-keys.md).
64
65## Rules
66
67- Only edit `cmux.json`. Never `settings.json` unless the user explicitly asks; it is legacy and read only when a key is absent from `cmux.json`.
68- Never tell the user to restart cmux. The file watcher reloads on save.
69- Always `cmux-settings validate` after a bulk edit. Unknown keys mean the user pasted a key the app does not consume.
70- Do not blindly overwrite `actions`, `ui`, `commands`, `vault`, or `rightSidebar`; they share the file and hold hand-tuned non-settings config.
71- Shortcut action ids must match the schema enum. Look them up before binding.
72- Colors are `#RRGGBB`; opacities are `0..1`.
73- Translate app-level phrasing ("Settings > Notifications > Dock badge") to the JSON path first; `web/app/[locale]/(landing)/docs/configuration/page.tsx` mirrors the schema 1:1.