Configuration

bmux is configured via a bmux.toml file. If no config file exists, bmux uses sensible defaults for all options.

Config File Location

bmux resolves bmux.toml from the configured config directory candidate chain. Use the path/env override table below to pin exact locations.

Path & Env Overrides

bmux supports environment-variable overrides for config/runtime/data directories and recording storage.
VariableScopeBehavior
BMUX_CONFIGconfigMerges an additional config file after discovered config (lower precedence than –config).
BMUX_CONFIG_DIRconfigOverrides the config directory root and disables fallback candidate chaining.
BMUX_RUNTIME_DIRruntimeOverrides the runtime root used for sockets and temp runtime artifacts.
BMUX_RUNTIME_NAMEruntimeSelects the runtime instance name; non-default values use runtime subdirectories.
BMUX_DATA_DIRdataOverrides the persistent data directory (plugins and runtime identity files).
BMUX_STATE_DIRstateOverrides the persistent state directory (recordings, traces, and runtime layout state); when BMUX_LOG_DIR is unset, logs default to $BMUX_STATE_DIR/logs.
BMUX_LOG_DIRlogsOverrides the log directory used by bmux file logging.
BMUX_RECORDINGS_DIRrecordingsOverrides recording storage root for recording CLI/runtime resolution.
BMUX_SLOT_NAMEslotForces the active bmux slot. Overrides argv[0] parsing. When unset, the binary’s basename (bmux-) is used.
BMUX_SLOTS_MANIFESTslotPath to the slot manifest (slots.toml). - means read from stdin. Defaults to <config_dir>/slots.toml.
BMUX_SLOTS_ROOTslotRoot directory under which per-slot default dirs are materialized. Defaults to the platform data dir.
BMUX_SLOTS_BIN_DIRslotDirectory containing the bmux- binaries. Defaults to ~/.local/bin.
BMUX_NO_BASE_CONFIGconfigWhen set to a truthy value, disables merging the shared ~/.config/bmux/base.toml layer for this invocation.
BMUX_MANIFEST_READ_ONLY_PREFIXESslotColon-separated path prefixes that, when a manifest file lives under one of them, make write-side helpers refuse to modify the file.

[general]

Core session defaults: shell, scrollback depth, and server connection settings
OptionTypeDefaultDescription
default_modestring (normal, insert, visual, command)NORMALDefault interaction mode when starting bmux
mouse_supportbooltrueEnable mouse support for clicking to focus panes, scrolling through output, and dragging to resize pane borders
default_shellstring (optional)Default shell to launch in new panes. When unset, uses the SHELL environment variable or falls back to /bin/sh.
scrollback_limitinteger10000Maximum number of scrollback lines retained per pane. Must be at least 1.
server_timeoutinteger5000Server socket timeout in milliseconds. Must be at least 1.

[appearance]

Visual styling: pane borders, status bar placement, and window titles
OptionTypeDefaultDescription
status_positionstring (TOP, BOTTOM, OFF)BOTTOMWhere to render the status bar. TOP places it above panes, BOTTOM below panes, and OFF hides it entirely.
pane_border_stylestring (SINGLE, DOUBLE, ROUNDED, THICK, NONE)SINGLEDrawing style for pane borders. NONE hides borders entirely, giving panes the full terminal width.
show_pane_titlesboolfalseDisplay a title label in each pane’s border showing the running process name
window_title_formatstring(empty)Format string for the outer terminal’s title bar. Empty string leaves the title unset.

[behavior]

Runtime behavior toggles for terminal protocol handling, layout persistence, and build compatibility
OptionTypeDefaultDescription
aggressive_resizeboolfalseImmediately resize panes to the largest remaining client when a client disconnects, rather than keeping the previous dimensions
visual_activityboolfalseHighlight panes in the status bar when they produce output while unfocused, so you can tell which panes have new activity
bell_actionstring (NONE, ANY, CURRENT, OTHER)ANYHow to handle terminal bell signals from panes. NONE ignores bells entirely. ANY notifies on bells from any pane. CURRENT only notifies from the focused pane. OTHER only notifies from unfocused panes.
automatic_renameboolfalseAutomatically rename windows based on the currently running command in the focused pane
exit_emptyboolfalseExit bmux when no sessions remain
restore_last_layoutbooltrueRestore and persist the last local CLI runtime layout across sessions, so reattaching resumes where you left off
confirm_quit_destroybooltruePrompt for confirmation before a destructive quit that clears persisted local runtime state
pane_termstringbmux-256colorTerminal type exposed to pane processes via the TERM environment variable. Common values: bmux-256color, xterm-256color, screen-256color.
pane_shell_integrationbooltrueEnable per-shell runtime integration hooks that emit verbatim pane command and prompt metadata for resurrection. When disabled, bmux does not inject shell wrapper config/rc files and falls back to best-effort process inspection for command/cwd restore.
protocol_trace_enabledboolfalseEnable protocol query/reply tracing in the runtime. Useful for debugging terminal protocol behavior with CSI/OSC/DCS sequences.
protocol_trace_capacityinteger200Maximum number of in-memory protocol trace events to retain. Must be at least 1.
terminfo_auto_installstring (ask, always, never)neverWhat to do when the bmux terminfo entry is missing from the system. ask prompts before installing. always installs silently. never skips installation, which may degrade terminal rendering.
terminfo_prompt_cooldown_daysinteger7Number of days to wait before prompting again after the user declines terminfo installation
stale_build_actionstring (ignore, warn, error)ignoreWhat to do when the running server was built from a different version than the current CLI binary. ignore skips stale-build checks. warn connects with a warning message. error refuses to connect until the server is restarted.
kitty_keyboardbooltrueEnable the Kitty keyboard protocol for enhanced key reporting. When true, bmux negotiates enhanced keyboard mode with the outer terminal, allowing modified special keys like Ctrl+Enter to be correctly forwarded to pane programs.
pane_restore_methodstring (snapshot, retain)snapshotHow to restore pane content when hidden panes become visible again (e.g. after exiting zoom). SNAPSHOT re-fetches from the server for guaranteed accuracy. RETAIN keeps parsers in memory for instant restore.
mouse.enabledbooltrueMaster toggle for mouse handling in attach mode.
mouse.focus_on_clickbooltrueFocus pane when clicking inside it.
mouse.click_propagationstring (focus_only, forward_only, focus_and_forward)focus_and_forwardHow pane-area mouse clicks are routed between bmux and pane TUIs.
mouse.focus_on_hoverboolfalseFocus pane when hovering over it.
mouse.hover_delay_msinteger175Hover dwell time before focus is applied.
mouse.scroll_scrollbackbooltrueRoute wheel scrolling to focused pane scrollback.
mouse.wheel_propagationstring (auto, forward_only, scrollback_only, forward_and_scrollback)autoHow wheel events are routed between pane TUIs and bmux scrollback.
mouse.scroll_lines_per_tickinteger3Number of scrollback lines per mouse wheel tick.
mouse.exit_scrollback_on_bottombooltrueExit scrollback mode automatically when wheel scrolling reaches bottom.
mouse.alternate_screen_wheelstring (ignore, forward_only, scrollback_only)ignoreHow wheel events behave in alternate-screen panes that have not requested mouse tracking.
mouse.selection_releasestring (select, copy, copy_and_exit)selectWhat to do when a bmux-managed mouse selection drag is released.
mouse.resize_bordersbooltrueResize panes by dragging shared pane borders.
mouse.resize_drag_throttle_msinteger32Minimum interval in milliseconds between resize requests while dragging pane borders. Set to 0 to apply every drag event. Mouse release always applies the final position.
mouse.gesture_actionstable(empty)Optional mouse gesture overrides mapped to action names. Supported keys in the current core runtime are click_left, hover_focus, scroll_up, and scroll_down. Values use the same action naming format as keybindings, including built-in action names and plugin:<id>:<command>.
damage.max_rectsinteger64Maximum damaged rectangles to track per surface before falling back to a full-surface repaint.
damage.max_area_percentinteger60Damaged cell-area percentage that triggers a full-surface repaint fallback. Must be 1 through 100.
damage.visualizeboolfalseDraw a colored debug overlay around regions repainted by attach damage tracking.
event_coalescing.max_events_per_frameinteger64Maximum ready server events to drain before rendering one attach frame.
images.enabledbooltrueMaster switch for Sixel, Kitty graphics, and iTerm2 inline image support. When false, image escape sequences are passed through to the host terminal without interception or registry tracking.
images.decode_modestring (server, client, passthrough)passthroughHow image decoding is distributed between server and client. PASSTHROUGH forwards raw protocol bytes with coordinate translation (fastest, requires same protocol support on the host terminal). SERVER decodes images to pixel buffers on the server side. CLIENT sends raw bytes for the client to decode and re-encode.
images.max_image_bytesinteger10485760Maximum image payload size in bytes per image. Images exceeding this limit are silently discarded to prevent memory exhaustion.
images.max_images_per_paneinteger100Maximum number of images kept in the registry per pane. When this limit is reached, the oldest images are evicted (FIFO).
compression.enabledbooltrueMaster switch for all compression. When false, image payloads are sent uncompressed and remote connections are not wrapped in streaming compression.
compression.imagesstring (none, auto, zstd, lz4)autoCompress image payloads (Sixel, Kitty graphics, iTerm2) before IPC transport. Typical reduction: 5-15x for sixel text, 3-20x for kitty raw pixels. Pre-compressed formats (e.g. kitty PNG) are automatically detected and skipped. auto selects zstd when available.
compression.remotestring (none, auto, zstd, lz4)autoCompress remote connections (TLS gateway, Iroh P2P) with streaming compression. Local Unix socket connections are never compressed. Both the client and the server gateway must use the same setting; a mismatch will cause the connection to fail. If SSH is already compressing the tunnel, set this to none to avoid double work.
compression.levelinteger3Zstd compression level for image payloads (1-19, ignored for lz4). Level 1 is fastest (~500 MB/s), level 3 (default) balances speed and ratio, level 9+ gives diminishing returns. Remote streaming always uses level 1 internally for low latency regardless of this setting.

[multi_client]

Settings for multiple clients attached to the same session
OptionTypeDefaultDescription
allow_independent_viewsboolfalseAllow clients to have independent views of the same session, with separate focused panes and scroll positions
default_follow_modeboolfalseWhen true, new clients automatically track the leader client’s focused pane and scroll position. When false, clients start with an independent view.
max_clients_per_sessioninteger0Maximum number of clients that can attach to a single session. Set to 0 for unlimited.
sync_client_modesboolfalseWhen true, switching interaction modes (e.g. Normal to Insert) on one client applies to all attached clients in the same session

[keybindings]

Keyboard shortcuts organized by scope and interaction mode
OptionTypeDefaultDescription
initial_modestringnormalInitial interaction mode id. Mode ids are matched case-insensitively.
modestable(see defaults below)First-class modal keymap definitions keyed by mode id.
prefixstringctrl+aPrefix key for runtime key chords (e.g. “ctrl+a”). All runtime bindings require pressing this key first. Legacy path only.
timeout_msinteger (optional)Exact timeout in milliseconds for multi-stroke chord resolution. Takes precedence over timeout_profile. Valid range: 50-5000.
timeout_profilestring (optional)Named timeout profile for multi-stroke chord resolution. Built-in profiles: fast (200ms), traditional (400ms), slow (800ms). Ignored when timeout_ms is set.
timeout_profilestable(empty)Override values for built-in timeout profiles or define custom ones. Keys are profile names, values are timeout in milliseconds.
runtimetable(see defaults below)Key bindings triggered after pressing the prefix key. Maps key chords to runtime action names.
globaltable(see defaults below)Key bindings that trigger without the prefix key. Use sparingly to avoid conflicts with pane input.
scrolltable(see defaults below)Key bindings active in scrollback/copy mode. No prefix required unless the chord explicitly includes it.

Default modes bindings

[keybindings.modes] [insert] label = "INSERT" passthrough = true [insert.bindings] "ctrl+a escape" = "enter_mode normal" [normal] label = "NORMAL" passthrough = false [normal.bindings] '"' = "plugin:bmux.windows:split-pane --direction horizontal" "%" = "plugin:bmux.windows:split-pane --direction vertical" "(" = "plugin:bmux.windows:prev-window" ")" = "plugin:bmux.windows:next-window" "?" = "show_help" "[" = "enter_scroll_mode" "]" = "exit_scroll_mode" "^" = "plugin:bmux.windows:last-window" arrow_down = "plugin:bmux.windows:focus-pane-in-direction --direction down" arrow_left = "plugin:bmux.windows:focus-pane-in-direction --direction left" arrow_right = "plugin:bmux.windows:focus-pane-in-direction --direction right" arrow_up = "plugin:bmux.windows:focus-pane-in-direction --direction up" c = "plugin:bmux.windows:new-window" "ctrl+e" = "scroll_down_line" "ctrl+y" = "scroll_up_line" d = "detach" g = "scroll_top" h = "plugin:bmux.windows:focus-pane-in-direction --direction left" i = "enter_mode insert" j = "plugin:bmux.windows:focus-pane-in-direction --direction down" k = "plugin:bmux.windows:focus-pane-in-direction --direction up" l = "plugin:bmux.windows:focus-pane-in-direction --direction right" minus = "plugin:bmux.windows:resize-pane --direction decrease" o = "plugin:bmux.windows:focus-pane-in-direction --direction next" page_down = "scroll_down_page" page_up = "scroll_up_page" plus = "plugin:bmux.windows:resize-pane --direction increase" q = "quit" r = "plugin:bmux.windows:restart-pane" "shift+arrow_down" = "plugin:bmux.windows:resize-pane --direction down" "shift+arrow_left" = "plugin:bmux.windows:resize-pane --direction left" "shift+arrow_right" = "plugin:bmux.windows:resize-pane --direction right" "shift+arrow_up" = "plugin:bmux.windows:resize-pane --direction up" "shift+c" = "plugin:bmux.sessions:new-session" "shift+g" = "scroll_bottom" "shift+h" = "plugin:bmux.windows:resize-pane --direction left" "shift+j" = "plugin:bmux.windows:resize-pane --direction down" "shift+k" = "plugin:bmux.windows:resize-pane --direction up" "shift+l" = "plugin:bmux.windows:resize-pane --direction right" v = "begin_selection" x = "plugin:bmux.windows:close-active-pane" z = "plugin:bmux.windows:zoom-pane"

Default runtime bindings

[keybindings.runtime] '"' = "plugin:bmux.windows:split-pane --direction horizontal" "%" = "plugin:bmux.windows:split-pane --direction vertical" "(" = "plugin:bmux.windows:prev-window" ")" = "plugin:bmux.windows:next-window" "?" = "show_help" "[" = "enter_scroll_mode" "]" = "exit_scroll_mode" "^" = "plugin:bmux.windows:last-window" arrow_down = "plugin:bmux.windows:focus-pane-in-direction --direction down" arrow_left = "plugin:bmux.windows:focus-pane-in-direction --direction left" arrow_right = "plugin:bmux.windows:focus-pane-in-direction --direction right" arrow_up = "plugin:bmux.windows:focus-pane-in-direction --direction up" "ctrl+e" = "scroll_down_line" "ctrl+y" = "scroll_up_line" d = "detach" g = "scroll_top" h = "plugin:bmux.windows:focus-pane-in-direction --direction left" j = "plugin:bmux.windows:focus-pane-in-direction --direction down" k = "plugin:bmux.windows:focus-pane-in-direction --direction up" l = "plugin:bmux.windows:focus-pane-in-direction --direction right" minus = "plugin:bmux.windows:resize-pane --direction decrease" o = "plugin:bmux.windows:focus-pane-in-direction --direction next" page_down = "scroll_down_page" page_up = "scroll_up_page" plus = "plugin:bmux.windows:resize-pane --direction increase" q = "quit" r = "plugin:bmux.windows:restart-pane" "shift+arrow_down" = "plugin:bmux.windows:resize-pane --direction down" "shift+arrow_left" = "plugin:bmux.windows:resize-pane --direction left" "shift+arrow_right" = "plugin:bmux.windows:resize-pane --direction right" "shift+arrow_up" = "plugin:bmux.windows:resize-pane --direction up" "shift+c" = "plugin:bmux.sessions:new-session" "shift+g" = "scroll_bottom" "shift+h" = "plugin:bmux.windows:resize-pane --direction left" "shift+j" = "plugin:bmux.windows:resize-pane --direction down" "shift+k" = "plugin:bmux.windows:resize-pane --direction up" "shift+l" = "plugin:bmux.windows:resize-pane --direction right" v = "begin_selection" x = "plugin:bmux.windows:close-active-pane" z = "plugin:bmux.windows:zoom-pane"

Default global bindings

[keybindings.global] "alt+0" = "plugin:bmux.windows:goto-window 10" "alt+1" = "plugin:bmux.windows:goto-window 1" "alt+2" = "plugin:bmux.windows:goto-window 2" "alt+3" = "plugin:bmux.windows:goto-window 3" "alt+4" = "plugin:bmux.windows:goto-window 4" "alt+5" = "plugin:bmux.windows:goto-window 5" "alt+6" = "plugin:bmux.windows:goto-window 6" "alt+7" = "plugin:bmux.windows:goto-window 7" "alt+8" = "plugin:bmux.windows:goto-window 8" "alt+9" = "plugin:bmux.windows:goto-window 9" "alt+=" = "plugin:bmux.windows:resize-pane --direction increase" "alt+down" = "plugin:bmux.windows:focus-pane-in-direction --direction down" "alt+h" = "plugin:bmux.windows:focus-pane-in-direction --direction left" "alt+j" = "plugin:bmux.windows:focus-pane-in-direction --direction down" "alt+k" = "plugin:bmux.windows:focus-pane-in-direction --direction up" "alt+left" = "plugin:bmux.windows:focus-pane-in-direction --direction left" "alt+minus" = "plugin:bmux.windows:resize-pane --direction decrease" "alt+n" = "plugin:bmux.windows:split-pane --direction horizontal" "alt+plus" = "plugin:bmux.windows:resize-pane --direction increase" "alt+right" = "plugin:bmux.windows:focus-pane-in-direction --direction right" "alt+t" = "plugin:bmux.windows:focus-pane-in-direction --direction next" "alt+up" = "plugin:bmux.windows:focus-pane-in-direction --direction up" "ctrl+alt+t" = "plugin:bmux.theme:pick-theme" "ctrl+h" = "plugin:bmux.windows:prev-window" "ctrl+j" = "plugin:bmux.windows:prev-window" "ctrl+k" = "plugin:bmux.windows:focus-pane-in-direction --direction prev" "ctrl+l" = "plugin:bmux.windows:last-window" "ctrl+left" = "plugin:bmux.windows:prev-window" "ctrl+o" = "plugin:bmux.windows:last-window" "ctrl+right" = "plugin:bmux.windows:next-window" "ctrl+s" = "plugin:bmux.windows:next-window" "ctrl+t" = "plugin:bmux.windows:focus-pane-in-direction --direction prev"

Default scroll bindings

[keybindings.scroll] arrow_down = "move_cursor_down" arrow_left = "move_cursor_left" arrow_right = "move_cursor_right" arrow_up = "move_cursor_up" "ctrl+a ]" = "exit_scroll_mode" "ctrl+b" = "scroll_up_page" "ctrl+c" = "exit_scroll_mode" "ctrl+e" = "scroll_down_line" "ctrl+y" = "scroll_up_line" enter = "confirm_scrollback" escape = "exit_scroll_mode" g = "scroll_top" h = "move_cursor_left" j = "move_cursor_down" k = "move_cursor_up" l = "move_cursor_right" page_down = "scroll_down_page" page_up = "scroll_up_page" "shift+g" = "scroll_bottom" v = "begin_selection" y = "copy_scrollback"

[plugins]

Plugin discovery, enablement, and per-plugin settings
OptionTypeDefaultDescription
enabledlist of strings(empty)Plugin IDs to enable in addition to the bundled defaults. Bundled plugins like bmux.windows and bmux.permissions are enabled automatically without being listed here.
disabledlist of strings(empty)Plugin IDs to explicitly disable, including bundled ones. Overrides both bundled defaults and the enabled list.
search_pathslist of paths(empty)Additional directories to scan for plugin binaries beyond the default plugin search path. Supports ~, $VAR, and ${VAR} interpolation.
settingstable(empty)Per-plugin settings keyed by plugin ID. Each plugin defines its own accepted keys and values.
native_service.initial_response_bytesinteger4096Initial response buffer size, in bytes, for native service calls.
native_service.max_response_bytesinteger67108864Maximum response buffer size, in bytes, for native service calls.
native_service.buffer_resize_attemptsinteger8Maximum number of buffer-too-small retries before failing the service call. Set to 0 to disable retries beyond the initial buffer.
routing.conflict_modestring (fail_startup)fail_startupConflict behavior when multiple plugins claim overlapping command ownership.
routing.required_namespaces.<index>.namespacestring(empty)Namespace segment that must be owned by a plugin.
routing.required_namespaces.<index>.ownerstring (optional)Optional owner plugin ID; when omitted, any plugin may own the namespace.
routing.required_paths.<index>.pathlist of strings(empty)Command path that must be owned by a plugin.
routing.required_paths.<index>.ownerstring (optional)Optional owner plugin ID; when omitted, any plugin may own the path.

[connections]

Local and remote connection target profiles
OptionTypeDefaultDescription
hosted_modestring (p2p, control_plane)p2pHosted mode strategy. p2p avoids control-plane dependencies by default.
default_targetstring (optional)Default command target when --target is not passed.
control_plane_urlstring (optional)Optional control-plane base URL for hosted auth/share resolution.
targets.<name>.transportstring (local, ssh, tls, iroh)localTransport backend for this target.
targets.<name>.hoststring (optional)SSH host for transport = "ssh".
targets.<name>.userstring (optional)SSH username override.
targets.<name>.portinteger (optional)SSH port override.
targets.<name>.identity_filepath (optional)Private key file path. Supports ~, $VAR, and ${VAR} interpolation.
targets.<name>.known_hosts_filepath (optional)Known hosts file path. Supports ~, $VAR, and ${VAR} interpolation.
targets.<name>.ca_filepath (optional)Optional CA certificate bundle used for TLS transport. Supports ~, $VAR, and ${VAR} interpolation.
targets.<name>.server_namestring (optional)Optional TLS server name override (defaults to host).
targets.<name>.endpoint_idstring (optional)Iroh endpoint id for hosted transport.
targets.<name>.relay_urlstring (optional)Optional Iroh relay URL for hosted transport.
targets.<name>.iroh_ssh_authboolfalseRequire SSH auth handshake when connecting to this iroh target.
targets.<name>.strict_host_key_checkingbooltrueRequire strict host key checking.
targets.<name>.jumpstring (optional)SSH jump host (ProxyJump) value.
targets.<name>.remote_bmux_pathstringbmuxRemote bmux executable path.
targets.<name>.connect_timeout_msinteger8000Connection timeout in milliseconds.
targets.<name>.server_start_modestring (auto, require_running)autoRemote server startup behavior.
targets.<name>.default_sessionstring (optional)Default session name used by clients.
recent_targetslist of strings(empty)Most recently used targets (newest first).
recent_sessionstable(empty)Most recently used sessions per target (newest first).
share_linkstable(empty)User-defined share links (bmux:// -> target reference)
iroh_ssh_access.enabledboolfalseRequire SSH challenge authentication on iroh connections.
iroh_ssh_access.allowlist.<fingerprint>.public_keystring(empty)Public key in OpenSSH one-line format.
iroh_ssh_access.allowlist.<fingerprint>.labelstring (optional)Optional descriptive label (for display and management UX).
iroh_ssh_access.allowlist.<fingerprint>.added_at_unixinteger (optional)Unix timestamp of when the key was added.

[status_bar]

Content and layout of the status bar displayed at the top or bottom of the terminal
OptionTypeDefaultDescription
enabledbooltrueEnable status bar rendering in attach UI.
presetstring (tab_rail, minimal, classic)tab_railHigh-level status bar visual preset.
layout.densitystring (compact, cozy)cozySpacing density for tabs and right modules.
layout.left_paddinginteger1Left padding before first tab.
layout.right_paddinginteger1Right padding after final segment.
layout.tab_gapinteger1Number of spaces between tabs.
layout.module_gapinteger1Number of spaces between right-side modules.
layout.overflow_stylestring (count, arrows)arrowsOverflow indicator style when tabs are hidden.
layout.align_activestring (keep_visible, focus_bias)keep_visibleBehavior used to keep the active tab visible.
style.separator_setstring (angled_segments, plain, ascii)angled_segmentsSeparator character set for tabs and modules.
style.prefer_unicodebooltruePrefer Unicode separators when available.
style.force_asciiboolfalseForce ASCII separators even when Unicode is enabled.
style.dim_inactivebooltrueDim inactive tabs for stronger active emphasis.
style.bold_activebooltrueBold active tabs for stronger active emphasis.
style.underline_activeboolfalseUnderline active tabs.
colors.bar_bgstring (optional)Bar background color (hex #RRGGBB).
colors.bar_fgstring (optional)Bar foreground color (hex #RRGGBB).
colors.tab_active_bgstring (optional)Active tab background color (hex #RRGGBB).
colors.tab_active_fgstring (optional)Active tab foreground color (hex #RRGGBB).
colors.tab_inactive_bgstring (optional)Inactive tab background color (hex #RRGGBB).
colors.tab_inactive_fgstring (optional)Inactive tab foreground color (hex #RRGGBB).
colors.module_bgstring (optional)Right-side module background color (hex #RRGGBB).
colors.module_fgstring (optional)Right-side module foreground color (hex #RRGGBB).
colors.overflow_bgstring (optional)Overflow marker background color (hex #RRGGBB).
colors.overflow_fgstring (optional)Overflow marker foreground color (hex #RRGGBB).
max_tabsinteger12Maximum number of tabs shown in the tab strip before overflow is collapsed.
tab_label_max_widthinteger20Maximum display width for each tab label.
show_tab_indexbooltrueDisplay 1-based tab indexes before labels.
tab_scopestring (all_contexts, session_contexts, mru)all_contextsWhich context set to render as tabs.
tab_orderstring (stable, mru)stableHow tab entries are ordered when rendered.
show_session_nameboolfalseDisplay the active session name in the status bar.
show_context_nameboolfalseDisplay the current context label in the status bar.
show_modebooltrueDisplay the current interaction mode (Normal, Scroll, Help, etc.).
show_rolebooltrueDisplay the current attach role (write/read-only).
show_followbooltrueDisplay follow target details when following another client.
show_hintbooltrueDisplay runtime hints on the right side.
hint_policystring (always, scroll_only, never)scroll_onlyHint visibility policy.

Status Bar Preset Examples

[status_bar] enabled = true preset = "tab_rail" tab_scope = "all_contexts" tab_order = "stable" max_tabs = 14 tab_label_max_width = 22 show_tab_index = true show_mode = true show_role = true show_follow = true show_hint = true hint_policy = "scroll_only" [status_bar.layout] density = "cozy" left_padding = 1 right_padding = 1 tab_gap = 1 module_gap = 1 overflow_style = "arrows" align_active = "keep_visible" [status_bar.style] separator_set = "angled_segments" prefer_unicode = true force_ascii = false dim_inactive = true bold_active = true underline_active = false

Minimal

[status_bar] enabled = true preset = "minimal" tab_scope = "all_contexts" tab_order = "stable" show_tab_index = false show_follow = false show_hint = true hint_policy = "scroll_only" [status_bar.layout] density = "compact" tab_gap = 1 module_gap = 1 overflow_style = "count" align_active = "keep_visible" [status_bar.style] separator_set = "plain" prefer_unicode = false force_ascii = true dim_inactive = true bold_active = false underline_active = false

Status Color Override (partial)

[status_bar.colors] # Unset fields inherit from the runtime appearance defaults tab_active_bg = "#7aa2f7" tab_active_fg = "#1a1b26" tab_inactive_bg = "#2a2f45" module_bg = "#343a55"

[recording]

Session recording for terminal replay, debugging, and playbook generation
OptionTypeDefaultDescription
dirpath (optional)Root directory for recording data. Supports ~, $VAR, and ${VAR} interpolation. Relative paths are resolved against the directory containing bmux.toml.
enabledbooltrueEnable hidden rolling recording by default when the server starts. Manual recordings (bmux recording start/stop) remain available even when this is false.
capture_inputbooltrueCapture pane input bytes (keystrokes sent to pane processes)
capture_outputbooltrueCapture pane output bytes (terminal output from pane processes)
capture_eventsbooltrueCapture lifecycle and server events (pane creation, resize, close, etc.)
rolling_capture_inputbool (optional)Override rolling capture of pane input bytes. None falls back to recording.capture_input.
rolling_capture_outputbool (optional)Override rolling capture of pane output bytes. None falls back to recording.capture_output.
rolling_capture_eventsbool (optional)Override rolling capture of lifecycle/request/custom events. None falls back to recording.capture_events.
rolling_capture_protocol_repliesbool (optional)Enable rolling capture of protocol reply bytes. None defaults to false.
rolling_capture_imagesbool (optional)Enable rolling capture of extracted pane image payloads. None defaults to false.
rolling_event_kindslist of strings (pane_input_raw, pane_output_raw, protocol_reply_raw, pane_image, server_event, request_start, request_done, request_error, custom)(empty)Explicit rolling event-kind allowlist. When non-empty, this takes precedence over rolling capture category booleans.
segment_mbinteger64Rotate recording segments at approximately this size in MB
retention_daysinteger30Retention period for completed recordings in days. Set to 0 to disable automatic pruning and keep recordings indefinitely.
rolling_window_secsinteger0Enable hidden always-on rolling capture and retain at most this many seconds of recent events. Set to 0 to disable rolling capture.
auto_exportboolfalseAutomatically export stopped/cut user-initiated recordings as GIF.
auto_export_dirpath (optional)Directory for auto-exported GIFs. Supports ~, $VAR, and ${VAR} interpolation. Relative paths are resolved against the directory containing bmux.toml. When unset, GIFs are written next to the recording directory.
export.fpsinteger24Target frames per second default for GIF exports.
export.cursorstring (auto, on, off)autoCursor rendering default for recording export.
export.cursor_shapestring (auto, block, bar, underline)autoCursor shape default for recording export.
export.cursor_blinkstring (auto, on, off)autoCursor blink default for recording export.
export.cursor_blink_period_msinteger500Cursor blink period default for recording export.
export.cursor_colorstringautoCursor color default for recording export (auto or #RRGGBB).
export.cursor_profilestring (auto, ghostty, generic)autoCursor behavior profile default for recording export.
export.cursor_solid_after_activity_msinteger (optional)Keep cursor solid after activity for this duration in milliseconds. None lets terminal profiles choose an emulator-specific default.
export.cursor_solid_after_input_msinteger (optional)Keep cursor solid after input activity for this duration in milliseconds.
export.cursor_solid_after_output_msinteger (optional)Keep cursor solid after output activity for this duration in milliseconds.
export.cursor_solid_after_cursor_msinteger (optional)Keep cursor solid after cursor movement activity for this duration in milliseconds.
export.cursor_paint_modestring (auto, invert, fill, outline)autoCursor paint mode default for recording export.
export.cursor_text_modestring (auto, swap_fg_bg, force_contrast)autoCursor text mode default for recording export.
export.cursor_bar_width_pctinteger16Cursor bar width default as a percent of cell width.
export.cursor_underline_height_pctinteger12Cursor underline height default as a percent of cell height.
export.palette_sourcestring (auto, recording, terminal, xterm)autoPalette source default for recording export.
export.palette_foregroundstring (optional)Default foreground override for recording export palette resolution. Accepts auto/empty to keep source-derived defaults, or a color value.
export.palette_backgroundstring (optional)Default background override for recording export palette resolution. Accepts auto/empty to keep source-derived defaults, or a color value.
export.palette_colorslist of strings(empty)Default indexed color overrides for recording export. Entries must be INDEX=COLOR (for example 5=#bb78d9).

[performance]

Performance diagnostics capture controls and telemetry safety limits
OptionTypeDefaultDescription
recording_levelstring (off, basic, detailed, trace)offCapture verbosity for performance telemetry written into recording custom events.
window_msinteger1000Aggregation window for periodic performance telemetry, in milliseconds.
max_events_per_secinteger32Maximum number of performance custom events emitted per second by a client/runtime.
max_payload_bytes_per_secinteger65536Maximum serialized performance payload bytes emitted per second by a client/runtime.

[logs]

Runtime diagnostic log rotation, retention, and sink selection
OptionTypeDefaultDescription
retention_daysinteger14Default completed-log retention for sinks that do not override it.
max_total_mbinteger1024Default maximum total disk usage in MiB for sinks that do not override it.
prune_interval_secsinteger3600Background prune cadence in seconds for long-running processes.
server.modestring (segmented, unified, off)segmentedSink mode: segmented, unified, or off.
server.segment_mbinteger16Segment rotation size in MiB.
server.retention_daysinteger14Completed-run retention in days.
server.max_total_mbinteger512Maximum total disk usage in MiB.
client.modestring (segmented, unified, off)segmentedSink mode: segmented, unified, or off.
client.diagnostic_levelstring (basic, detailed, trace)basicDiagnostic event verbosity.
client.segment_mbinteger8Segment rotation size in MiB.
client.retention_daysinteger7Completed-run retention in days.
client.max_total_mbinteger256Maximum total disk usage in MiB.
client.slow_frame_msinteger50Slow frame warning threshold in milliseconds.
client.slow_terminal_write_msinteger25Slow terminal write warning threshold in milliseconds.
client.metrics_window_msinteger1000Metrics summary window in milliseconds.

[kiosk]

Kiosk profiles and SSH/bootstrap settings for locked-down access flows
OptionTypeDefaultDescription
defaults.enabledboolfalseEnable kiosk features and commands.
defaults.ssh_userstringbmux-kioskDefault SSH user when profiles do not override it.
defaults.rolestring (observer, writer)observerDefault role assigned to issued kiosk tokens.
defaults.allow_detachboolfalseAllow detach in kiosk attach mode.
defaults.token_ttl_secsinteger900Default issued token TTL in seconds.
defaults.one_shotbooltrueRequire one-time token usage by default.
defaults.sandboxstring (auto, none, container, native)autoSandbox mode preference.
profiles.<name>.sessionstring (optional)Optional session name to attach when token omits a session override.
profiles.<name>.targetstring (optional)Optional target name for attach routing.
profiles.<name>.rolestring (optional)Override role for this profile.
profiles.<name>.ssh_userstring (optional)Override SSH user for this profile.
profiles.<name>.allow_detachbool (optional)Override detach policy for this profile.
profiles.<name>.token_ttl_secsinteger (optional)Override token TTL in seconds for this profile.
profiles.<name>.one_shotbool (optional)Override one-shot token behavior for this profile.
profiles.<name>.sandboxstring (optional)Override sandbox mode for this profile.
files.sshd_include_pathpath (optional)Destination path for generated sshd include content.
files.wrapper_dirpath (optional)Destination directory for generated wrapper scripts.

[sandbox]

Sandbox workflow defaults for cleanup and isolation operations
OptionTypeDefaultDescription
cleanup.failed_onlyboolfalseWhen true, cleanup removes only failed/aborted sandboxes.
cleanup.older_than_secsinteger300Minimum age in seconds before sandbox is eligible for cleanup.
cleanup.sourcestring (sandbox_cli, playbook, recording_verify, all)allDefault cleanup source scope.