Skip to content

Configuration ​

This page is the reference for config.toml, the one TOML file that holds rozi's settings: where it lives, how it reloads, and every key by section. For a guided tour of themes, layouts, pane styles, and keys, see Customize rozi.

Every key is optional; anything you leave out uses its default. examples/config.toml lists every setting commented out, so you can copy it and uncomment only what you need.

File location ​

rozi uses the first of these that applies:

  1. --config <PATH>, which also sets ROZI_CONFIG for the process.
  2. ROZI_CONFIG. ~ and ~/… expand to the home directory.
  3. $XDG_CONFIG_HOME/rozi/config.toml, or ~/.config/rozi/config.toml.
  4. %APPDATA%\rozi\config.toml on Windows.

--config works with launches, session servers, extension inspection, and the session lifecycle commands that load configuration. Control commands do not load configuration and reject --config.

Minimal example ​

toml
cwd = "~/code"

[input]
modifier = "super"
modifier_shortcuts = false

[layout]
default = "columns"

[theme]
name = "lipan"

Edit settings in rozi ​

Changes made in rozi's Settings, Appearance, Profiles, or Themes UI are written to config.toml and take effect at once. If config.toml is a symlink, rozi writes the file it points to and keeps the link.

Settings… in the command palette browses options by category and previews static appearance choices. Behavior and animation choices apply when confirmed with Enter. It has no default key; bind the settings action under [keys] to add one. See Use the Settings picker.

Open the file in an editor ​

The open-config action opens the config file in EDITOR, then VISUAL, then vi:

bash
rozi run-action open-config

The editor runs directly, not through a shell. Quotes around a path that contains spaces ("/opt/my editor/bin/edit" --wait) are honored, and shell syntax in EDITOR is not interpreted.

Cursor blinking ​

Choose Blink in Settings under General › Cursor, or set [cursor] in config.toml. Changes apply immediately to pickers, prompts, text editors, and terminal panes.

KeyTypeDefaultDescription
cursor.blinkstring"inherit"inherit, static, or blinking.

inherit uses the host terminal's blink preference, and panes follow it until a program requests its own cursor style. static and blinking override blink requests throughout rozi. Programs still control cursor shape and visibility.

Mouse pointer ​

Choose Mouse pointer in Settings under General. Changes apply immediately and leave mouse clicks, selection, and dragging enabled. The host terminal must support mouse pointer shapes.

KeyTypeDefaultDescription
cursor.pointerstring"all"off, panes, or all.
Settings choiceValueBehavior
OffoffKeep the normal arrow throughout rozi.
Pane apps onlypanesFollow mouse pointer requests from the pane application under the mouse.
Rozi and pane appsallAlso show rozi's own pointers over editable fields, controls, and pane and divider gestures.

Terminal support varies.

Reloading ​

rozi watches the config file and applies changes without replacing panes or workspaces. If the new file cannot be used (see Invalid configuration), rozi keeps the last good configuration.

rozi does not watch installed extension directories. After installing, updating, or removing an extension, rescan them:

bash
rozi run-action reload-extensions

When a change takes effect ​

Most settings apply as soon as you save. These take effect later or more narrowly. A session server is the background process that owns a session's panes.

SettingWhen it takes effect
shell, shell_integration.mode, cwd, environment.forwardNew panes only.
command_shellNew command, hook, service, sidebar, and workbar executions.
scrollbackNew terminal screens. Restart an existing session server for its new panes to use it.
window_titleOn save. Changing it to "" keeps the last title until rozi exits.
frame_rateNext client launch or reattach.
updates.interval_hoursThe next re-check.
sidebar.startupNext client launch. Reload never opens or closes the sidebar.
session.startupNext bare launch.
session.on_attachNext writable attach by this client after reload.
session.resurrect, session.resurrect_foreground, session.resurrect_agents, session.allow_takeoverSession servers started after the change.
logging.*Session servers started after the change.
remote.reconnect_on_launchNext client launch.
Other remote.* settingsNew SSH connections.
rulesNew pane spawns that carry a command.
servicesOn reload. Changed services restart, removed services stop, and unchanged services keep running.
agentsOn reload, in the controlled session server and the local scratch session.
extensions.disabledWhen the config file changes.
Extension manifestsAutomatically on install, update, or removal; after reload-extensions for edited checkouts.

Invalid configuration ​

rozi handles problems at two levels:

  • The whole file is rejected when it is unreadable or is not valid TOML. At startup rozi uses the defaults; on a live reload it keeps the last good configuration. Either way it shows an error.
  • One setting is skipped when a key is unknown, a value has the wrong type, or a value is not one of the allowed choices. rozi uses that setting's default, applies the rest of the file, and warns with the setting's full key, such as animations.cursor_trail. In a list of tables, such as [[rules]] or [[hints]], a wrong value skips its whole entry, named by its position from zero: rules[1] is the second [[rules]] entry. The other entries still apply.

Several warnings share one toast, and each is also printed to stderr. Some settings are clamped into range rather than skipped; their rows below say so.

In-app toasts ​

rozi shows a toast for failures, rejected actions, destructive confirmations, and results that have no other visible feedback. Changes that already show up in the workbar, pane layout, a picker, or the sidebar do not add a toast. A repeated message renews the existing toast instead of stacking copies. animations.toast sets how toasts arrive and leave.

Scripts can show their own result with rozi notify. Release notices are described in Update notices.

User directories ​

PurposeLinux and macOSWindows
Config$XDG_CONFIG_HOME/rozi, else ~/.config/rozi%APPDATA%\rozi
Data, including extensions$XDG_DATA_HOME/rozi, else ~/.local/share/rozi%LOCALAPPDATA%\rozi
State$XDG_STATE_HOME/rozi, else ~/.local/state/rozi%LOCALAPPDATA%\rozi\state
Cache$XDG_CACHE_HOME/rozi, else ~/.cache/rozi%LOCALAPPDATA%\rozi\cache
Runtime endpoints$XDG_RUNTIME_DIR/rozi, else /run/user/<uid>/rozi, else a private per-user temporary directory%LOCALAPPDATA%\rozi\run

XDG_* values must be absolute paths; relative values are ignored.

XDG_RUNTIME_DIR is often unset under Tailscale SSH, su, or cron. rozi then uses /run/user/<uid> if that directory exists, belongs to you, and is private, so a session server started there is visible to your desktop clients.

Top-level keys ​

KeyTypeDefaultConstraints and behavior
shellstring or string arrayPlatform shellA string is one program with no arguments; an array keeps each argument. Unix uses SHELL, then /bin/sh. Windows tries pwsh.exe, powershell.exe, COMSPEC, then cmd.exe.
command_shellstring or string array["/bin/sh", "-c"] on Unix, [COMSPEC, "/D", "/S", "/C"] on WindowsRuns command strings for panes, popups, hooks, services, workbar and sidebar commands, and config commands.
cwdpath stringLaunch directoryStarting directory for new panes. ~ expands.
scrollbackinteger5000Minimum 1.
frame_rateinteger120Clamped to 15..=480 with a warning.
nerd_iconsbooltrueUses Nerd Font glyphs in rozi's chrome.
window_titlestring"rozi · {session} · {pane}"Terminal window title. Placeholders: {session} (empty for a temporary session), {pane} (the focused pane's title), {cwd}, {host}. An empty placeholder drops the text after it. "" leaves the title alone.

With nerd_icons on, rozi draws private-use glyphs for pane title icons, workbar location and named-session badges, the Sessions sidebar client-count badge, directory chevrons, the Files explorer search prefix, and round and arrow caps, and Files and Git use colored file icons and Nerd Font Git marks. With it off, those badges use ⌁, ∞, and ⋈, directory chevrons use ▶ and ▼, the explorer prefix uses ⌕, pane titles drop the icon, and Files and Git use Unicode expansion arrows and text Git marks.

New local panes receive ROZI=1, ROZI_PANE, ROZI_SESSION_INSTANCE, TERM_PROGRAM=rozi, TERM_PROGRAM_VERSION, and, when available, ROZI_SOCKET and ROZI_BIN. See Scripting and Control CLI.

[shell_integration] ​

KeyTypeDefaultConstraints and behavior
modestring"auto""auto" or "off". Auto adds shell integration to recognized interactive shells without editing their startup files.

Shell integration lets the shell report its working directory (OSC 7) and mark prompts and command output (OSC 133). See Working directories and shell metadata.

[environment] ​

KeyTypeDefaultConstraints and behavior
forwardarray of strings[]Extra client environment variables to copy into new local panes. Values are not forwarded through remote attachments.

rozi already forwards the desktop session variables that Wayland, X11, D-Bus, and Hyprland need. A client with no display of its own, such as one attached over SSH, gets the host's current desktop instead on Linux with a systemd user session.

[input] ​

KeyTypeDefaultConstraints and behavior
modifierstring"alt""alt" or "super". mod is an alias for Alt; meta, logo, win, and windows are aliases for Super.
prefixstring"ctrl-a"One key step in config key syntax, such as "ctrl-b".
modifier_shortcutsbooltrueMirrors the generated prefix bindings onto held-modifier chords.
which_keystring"short"Delay before the which-key strip appears: "off", "instant", "short" (500 ms), or "long" (1000 ms).
scroll_multiplierinteger3Multiplies the wheel scrolling your terminal sends in panes and scrollable lists, 1 to 50. It stacks with the terminal's own multiplier.

See Keybindings, and Prefix and held modifier for the which-key strip.

[layout] ​

KeyTypeDefaultConstraints and behavior
split_width_multiplierfloat2.3Must be finite and greater than zero.
defaultstring"dwindle""dwindle", "master", "grid", "columns", "rows", "scrollable", or "monocle". Profiles may override it per workspace.

See Layouts and panes.

[pane] ​

KeyTypeDefaultConstraints and behavior
resize_debounce_msinteger16Minimum delay between batches of terminal resize reports. 0 forwards each report.
focus_on_hoverbooltrueFocuses a pane when the pointer enters it. In a Scrollable layout, a clipped column scrolls into view on the next key or click.
focus_on_hover_pause_modifierstring"shift"Holding this modifier pauses hover focus; click focus still works. "shift", "ctrl", "alt", or "none" for no pause. Other modifiers may be held too.
hold_on_exitboolfalseKeeps shell panes open after they exit on their own. Command panes use their keep_open value.
highlight_focused_backgroundboolfalseUses the panel background for the focused pane.
highlight_focused_borderbooltrueUses the active border color for the focused pane.
highlight_focused_titlebarbooltrueUses focused titlebar styling.
show_workbarbooltrueShows the workbar.
workbar_gapbooltrueKeeps one row between the workbar and panes.
workbar_backgroundbooltruePaints the workbar as a distinct strip. Off, the bar matches the canvas.
workbar_at_bottomboolfalsePlaces the workbar below panes.
show_titlesbooltrueShows pane titles without changing titlebar.
titlebarstring"bar""bar", "border", "integrated", or "inset".
border_modestring"separate""separate", "merged", "none", or "dividers".
alert_borderstring"pulse""off", "static", or "pulse". Whether pane alerts show and whether they breathe.
alert_paintstring"both""border", "content", or "both". content lays a faint wash of the alert color over the pane; it works in every border_mode.
border_stylestring"rounded"Frame glyphs for tiled panes in framed modes. See the token list below.
float_border_stylestring"double"Same tokens as border_style. Floating panes and popups.
scratch_border_stylestringfloat_border_styleSame tokens as border_style. Scratchpad panes.
fullscreen_border_stylestringborder_styleSame tokens as border_style. Fullscreen panes.
picker_border_stylestring"rounded"Same tokens as border_style. The command palette, Settings, Help, Search, and other pickers.
picker_tab_backgroundbooltruePaints picker category tabs as a distinct strip. Off, the tabs share the picker body.
picker_tab_stylestringworkbar_tab_style"padded", "round", or "arrow".
picker_selection_stylestring"padded""padded", "round", or "arrow". Caps at the start and end of the selected picker row.
keep_special_bordersbooltrueKeeps frames on floating panes, popups, and scratchpads in borderless modes.
paddinginteger or integer array0One value, [vertical, horizontal], or [top, right, bottom, left]. Each side is clamped to 0..=8.
title_stylestring"padded""padded", "half", "round", or "arrow".
workbar_badge_stylestring"padded""padded", "round", or "arrow". Also sets the tab style when workbar_tab_style is absent.
workbar_tab_stylestringworkbar_badge_style"padded", "round", or "arrow".
workbar_stylestring"padded""padded", "half", "round", or "arrow".
workbar_powerlinebooltrueJoins adjacent badges in the workbar's center and right sections.
toast_opacityfloat0.8Finite value in 0.0..=1.0. Invalid values are ignored.
unfocused_dimfloat0.0How far an unfocused pane's content fades toward the canvas, 0.0..=1.0; 0.0 is off. Described in Dim unfocused panes.
background_follows_terminalboolfalseUses the host terminal's background for the canvas.

The border style tokens are "rounded", "plain", "double", "thick", "light-double-dashed", "heavy-double-dashed", "light-triple-dashed", "heavy-triple-dashed", "light-quadruple-dashed", and "heavy-quadruple-dashed". A default written as another key's name means the setting follows that key when omitted.

See Layouts and panes, Sidebar, and Themes.

[pane.alert] ​

Colors for pane alert borders and content tints. Each value is a theme role or "off". Theme roles are accent, info, success, warning, error, neutral, and panel.

KeyTypeDefault
blockedstring"warning"
errorstring"error"
finishedstring"success"
workingstring"off"
idlestring"off"

The focused pane still shows a finished run, and an agent waiting on you in any of its conversations. That blocked alert holds still instead of breathing, and clears once you answer the agent. A plain rozi status blocked marks a pane only while it is not focused.

An error alert clears once you use the pane, even while the failure lasts; the sidebar keeps showing the failed row.

[animations] ​

KeyTypeDefaultConstraints and behavior
enabledbooltrueMaster switch.
spawnbooltrueAnimates pane creation.
closebooltrueAnimates pane close.
fullscreenbooltrueAnimates fullscreen transitions.
tile_floatbooltrueAnimates tile and float transitions.
axis_changebooltrueAnimates split-axis changes.
sidebarbooltrueAnimates sidebar movement.
workspacebooltrueSlides workspace content horizontally when switching. In Settings: General › Animations › Workspace switching.
workspace_msinteger220Workspace slide duration in milliseconds. 0 switches instantly.
sessionstring or bool"portal""portal", "wave", "fade", or "off"; true means "portal" and false means "off". Described below. In Settings: General › Animations › Session switching.
focus_chromebooltrueAnimates focus color changes and enables alert pulses.
agent_handoffbooltrueRuns light along the borders of panes whose agents send or receive a request or an answer; see Watch agents talk. In Settings: General › Animations › Agent handoffs.
cursor_trailtableA smear that follows the cursor when it jumps. See Cursor trail.
pickerstring"fade""off", "fade", "portal", or "scan", case-insensitive. Applies to searchable pickers, Settings, and their nested cards. A picker that opens in place of another appears at once. In Settings: General › Animations › Pickers.
toaststring"slide""off", "fade", or "slide", case-insensitive. Slide brings a toast in from the right edge; Fade fades it in place. In Settings: General › Animations › Toasts.
pane_open_stylestring"scale""off", "scale", "slide", "portal", "scan", or "particles", case-insensitive.
pane_close_stylestring"scale""off", "scale", "slide", "portal", "scan", or "particles", case-insensitive.
geometry_msinteger220Base duration of pane geometry animations, in milliseconds.
close_msinteger120Scale close duration in milliseconds.
focus_chrome_msinteger160Focus color duration in milliseconds.
alert_pulse_msinteger1600Alert pulse period. The half-period is at least 400 ms.
open_delay_msinteger36Spawn animation delay in milliseconds.

session controls how the workbar and panes arrive when the foreground session changes: when you switch sessions, when a session finishes connecting, or when you drop to the launcher.

  • "portal" opens a portal from the center onto the new session while the previous one recedes behind it, over geometry_ms.
  • "wave" sweeps a glowing wave from left to right that wipes the previous session away, over four times geometry_ms (880 ms by default).
  • "fade" crossfades from the previous session to the new one in place, over one and a half times geometry_ms (330 ms by default).
  • "off" switches at once.

Pane geometry always snaps and the sidebar stays still. The value is case-insensitive.

Choose opening and closing independently with pane_open_style and pane_close_style, or use General › Animations › Pane open and Pane close in Settings. For example, use slide to open and particles to close. Both default to scale.

An off style shows or hides a pane at once, with no fade. Opening with off also skips the spawn delay.

particles assembles panes from nearby motes that curve into place; closing bursts fragments outward before gravity pulls them down. Opening takes geometry_ms (220 ms by default) and closing four times that (880 ms). Fragments can travel over neighboring panes. This style also applies to floating panes, popups, and scratch panes. Particles run at up to 30 FPS; a lower frame_rate also lowers that.

Pane animation curves and effect settings ​

The five pane effects — Scale, Slide, Portal, Scan, and Particles — accept timing and motion curves. Scale, Portal, and Scan also have geometry settings. These keys also live directly under [animations]:

toml
[animations]
pane_open_style = "slide"
pane_close_style = "particles"
geometry_ms = 130
close_ms = 90
curve = [0.16, 1.0, 0.3, 1.0]
KeyTypeDefaultApplies to
curvecurvethe style's ownall
close_curvecurvethe reverse of curveall
fadebooltrue for Scale, false for Portal, Scan, and ParticlesScale, Portal, Scan, Particles
scale_fromfloat in [0.1, 1]0.9Scale
portal_originfloat pair in [0, 1][0.5, 0.5]Portal
scan_directiontop-left, top-right, bottom-left, bottom-righttop-leftScan

A curve is either CSS cubic-Bézier control points, [x1, y1, x2, y2], or the name of a built-in easing: linear, ease_in_quad, ease_out_quad, ease_in_out_cubic, or ease_in_out_sine. The x coordinates must be in [0, 1]. The y coordinates must be finite and in [-4, 4]; a value above 1 overshoots and settles back. Without close_curve, closing runs curve backwards.

Only the geometry key for the selected open or close style is used. Slide has no geometry key, and fade has no effect on it.

A value outside its range is dropped with a warning, not clamped.

These keys cover only a pane arriving and leaving. Tiles rearranging around that pane, and fullscreen, tile/float, and axis-change transitions, use geometry_ms.

See Pane open and close animation styles.

Cursor trail ​

[animations.cursor_trail] draws a smear that follows the cursor when it jumps. It is off until you set mode. In Settings, General › Cursor › Trail chooses when it shows and Trail style how it looks.

toml
[animations.cursor_trail]
mode = "jump"
style = "sparks"

With "jump", every jump starts its smear at once. A positive settle_ms makes jumps to another line or to the start of the line wait for the cursor to hold still. A move to another pane always draws at once.

KeyTypeDefaultConstraints and behavior
modestring"off""off", "focus", or "jump", case-insensitive. "focus" draws a smear when focus moves to another pane or prompt; "jump" also draws one when the cursor moves at least 8 columns or 2 rows inside a pane. In Settings: General › Cursor › Trail.
stylestring"smear""smear" is a solid smear in the trail color; "sparks" is the smear throwing sparks; "tint" is a fainter smear that never covers text or the cursor. In Settings: General › Cursor › Trail style.
motionstring"spring""spring" stretches the smear out behind the cursor and snaps it in; "glide" keeps the front on the cursor and eases the tail in over glide_ms.
colorstring"cursor""cursor" uses the cursor's color (the theme's caret, else the terminal's cursor color, else its text color); "accent" uses the theme's focused-border color; or give a "#rrggbb" value.
stiffnessfloat0.5Spring pull on the front of the smear, from 0 to 1.
trailing_stiffnessfloat0.28Spring pull on its tail, from 0 to 1. Lower than stiffness stretches the smear.
trailing_exponentfloat0.3How full the smear stays toward its tail, from 0.1 to 10; higher keeps it fuller.
dampingfloat0.82How much speed the smear loses each step, from 0 (bouncy) to 1 (no momentum).
glide_msinteger160How long the tail of a "glide" takes to reach the cursor, in milliseconds. 0 turns the glide off.
settle_msinteger0How long, in milliseconds, the cursor must hold still after a jump to another line or to the start of the line before its smear starts, from 0 to 1000. 0 starts every jump at once.
settle_max_msinteger200The longest, in milliseconds, such a jump waits for a cursor that keeps moving, from 0 to 1000.
max_lengthfloat0.0Caps how far the smear's tail trails the cursor, up to 500, in cell widths as they look on screen. 0 leaves it unbounded.
opacityfloat1.0The smear's strength at the cursor, from 0 to 1.
taperfloat0.0How much the smear fades toward its tail, from 0 (evenly) to 1 (to nothing).
glyphsstring"auto"The characters the smear's edges use: "blocks", "sextants", "octants" (the last two need a font with Symbols for Legacy Computing), or "auto", which picks the richest set your terminal draws itself.

stiffness, trailing_stiffness, and damping work as the settings of the same name in smear-cursor.nvim. A value out of range is ignored with a warning.

[animations.cursor_trail.particles] tunes the sparks style = "sparks" throws off the moving smear.

KeyTypeDefaultConstraints and behavior
per_cellfloat1.5Sparks per cell the smear travels, up to 20.
maxinteger100The most sparks alive at once, at least 1.
lifetime_msinteger300The longest a spark lives, in milliseconds.
spreadfloat6.0The top speed of a spark flying off in a random direction, in cells per second, up to 200.
inheritfloat0.25How much of the smear's own speed a spark keeps, from 0 to 1.
gravityfloat20.0Downward pull in cells per second squared, from -500 to 500. Negative values make sparks rise.
dragfloat3.0How quickly a spark slows, per second, up to 100.

If your editor or terminal draws its own cursor trail, such as smear-cursor.nvim or Kitty's cursor_trail, leave this off or use "focus", so you do not see two trails at once.

[theme] ​

KeyTypeDefaultConstraints and behavior
namestring"rozi"A built-in theme ID, "system", or a file name (without extension) from the themes directory. An active custom theme reloads when its file changes.

See Themes.

[profile] ​

KeyTypeDefaultConstraints and behavior
defaultstringnoneProfile used when nothing with higher precedence chooses one.

See Profiles.

[worktrees] ​

KeyTypeDefaultConstraints and behavior
directorypathnoneWhere a new checkout goes when you give no path. An absolute path, or a single folder name kept inside the repository.
profilestringnoneProfile that seeds a new worktree session, from the Worktrees picker or rozi worktrees open.
delete_brancharray[]Branch copies to delete when you remove a checkout: "local", "remote", or both. Only merged branches are deleted.
sidebar_openstring"session"What a click or Enter on a checkout in the Worktrees sidebar tab opens: "session" or "pane". Ctrl+click and Ctrl+Enter open the other.

Without directory, checkouts go beside the repository in <repo>-worktrees/<branch>. Otherwise:

  • An absolute path (after ~ expansion) holds every repository's checkouts as <directory>/<repo>/<branch>.
  • A single folder name stays inside the repository: ".worktrees" gives <repo>/.worktrees/<branch>.
  • A nested or escaping value such as "tools/.worktrees" or "../worktrees" is ignored with a warning. Use an absolute path for a location outside the repository.

While Git does not ignore that directory, rozi warns and offers to add it to .git/info/exclude. directory is read on the session host.

With profile set, pane directories inside any checkout of the repository move to the new checkout, directories outside it are kept, and panes without a directory start in the checkout. For a worktree on a remote host, the profile applies only when every pane directory it names is inside the repository; otherwise the session starts as one shell in its checkout. rozi reports why a profile failed to load or was skipped.

With delete_branch, "local" deletes the branch with git branch -d and "remote" deletes the branch on the remote it tracks. An unmerged branch, a branch another checkout still has checked out, and a detached checkout are left alone, and rozi says when a branch was kept. An unknown entry ignores the whole setting with a warning. rozi worktrees remove reads the value on the host that owns the repository, and --delete-branch or --keep-branch overrides it. See Delete the branch too.

See Worktrees.

[clipboard] ​

KeyTypeDefaultConstraints and behavior
copy_on_selectstring"both" on Linux, "clipboard" elsewhereWhere a finished mouse selection is copied: "off", "primary", "clipboard", or "both".
middle_click_pastestring"primary" on Linux, "off" elsewhereWhat a middle click pastes: "off", "primary", or "clipboard".
right_clickstring"off"What an otherwise unhandled right click does: "off", "paste" from the clipboard, or "copy-or-paste".
enable_osc52booltrueLets programs in panes set the system clipboard with OSC 52.
drag_and_dropbooltrueTakes drops from other applications onto panes, and lets programs in panes start drags, in a terminal that supports drag and drop (kitty 0.47 or later). See Drag and drop.
copy_feedbackstring"flash"How copied text lights up: "off", "flash", "fade", "scan", or "pulse". With the animation master switch off, all but "off" flash.
copy_feedback_on_selectboolfalseAlso lights up text that copy_on_select copies when a mouse selection ends.
clear_selection_after_copyboolfalseClears a copied selection once the highlight ends, or at once when copy_feedback is "off".

PRIMARY is the Linux selection clipboard. Where it is unsupported, copy_on_select = "both" copies only to the regular clipboard, "primary" copies nowhere, and a middle click that pastes PRIMARY does nothing.

Middle-click and right-click paste go to the pane or text field under the pointer, which takes focus first. "copy-or-paste" copies the selection in the clicked pane, and pastes when there is none. Handlers in rozi's widgets and in the program running in the pane take priority over right_click.

These settings apply on reload and are also in the General category of Settings. See Select, copy, and paste.

[updates] ​

KeyTypeDefaultConstraints and behavior
checkbooltrueLooks for a newer release shortly after a client starts, then every interval_hours. Off, rozi never contacts the release host or the usage counter on its own.
interval_hoursinteger6Hours between re-checks in a client that stays open. Minimum 1; lower values are clamped with a warning.
count_usagebooltrueAdds this install to the anonymous weekly usage count during these checks. Has no effect while check is off.
release_notesbooltrueShows the release notes once, the first time rozi starts after an update. Works offline and while check is off. See Release notes.

rozi update --check checks on demand, whether or not check is on.

Update notices ​

When a newer release exists, rozi shows a toast titled rozi vX.Y.Z available with the version change and how to update; click it to dismiss it. The toast uses warning colors when the release raises the extension API, or when running sessions must be restarted after the update, and says so. Each release is announced only once across clients.

Every client that finds the release also lists Update rozi to vX.Y.Z (update-rozi) in the command palette for as long as it runs:

  1. Choosing it opens the Updating rozi dialog. For a rozi you installed with its installer, it shows the download and then the install. For one a package manager installed, it runs that manager's upgrade command and shows the last lines it prints. The command runs without a terminal, so one that stops to ask a question fails.
  2. Run in background puts the dialog away while the update keeps going; choose Update rozi again to see it. Restart rozi waits until the update is done, and leaving rozi stops an update a package manager is still running.
  3. On success, the dialog becomes the rozi vX.Y.Z installed dialog, which offers to restart rozi on the new build, coming back to the same sessions. Later keeps the old build running until you choose Restart rozi. For an update in the background, a rozi vX.Y.Z installed toast says it is done; click it to restart now.
  4. On failure, the dialog says what stopped the update, and Try again runs it again. For an update in the background, a toast says it failed and the command stays listed so you can retry.

The update always installs the rozi this window was started from, even while a remote session is in front. The command is not listed when rozi was installed from a distribution package or in a way it does not recognize.

Release notes ​

The first time rozi starts after an update, a What's new · rozi dialog shows the release notes, in one client only. A first install skips it, and so does going back to an older version.

The dialog has a tab for each of the latest 20 releases that have notes, newest first. The header names the version you updated from, such as updated from v0.0.37, so every newer tab is a release you skipped.

KeyAction
Tab, →Next, older release
Shift+Tab, ←Previous, newer release
Ctrl+LOpen the shown release's page on GitHub
EnterClose the dialog

What's new in rozi vX.Y.Z (release-notes) in the command palette shows the notes again at any time.

The notes are part of the release archives published on GitHub. A rozi built from source, such as with cargo install rozi, has none, so it shows neither the dialog nor the command.

[notifications] ​

KeyTypeDefaultConstraints and behavior
enabledboolfalseMaster switch for desktop notifications.
pane_exitboolfalseNotifies when a pane exits on its own with status zero.
pane_exit_errorbooltrueNotifies when a pane exits on its own with a nonzero status.
pane_blockedbooltrueNotifies when an unattended pane becomes blocked.
pane_doneboolfalseNotifies when a pane you have not looked at goes from working to finished.
pane_errorbooltrueNotifies when an agent, one of its conversations, or a pane's own status fails in a pane you are not looking at.
bellbooltrueMarks an unattended pane urgent when it rings the terminal bell (BEL), unless it is running an agent. Works even when enabled is off.

Desktop notifications go through the platform's notification service and are best effort.

pane_blocked, pane_done, and pane_error also cover agents in other local sessions and in sessions on a connected remote host that this client is not attached to.

pane_done and pane_error also cover published Activity rows a pane is not showing, such as a background conversation behind a Claude Code client. Looking at the pane does not count as having seen such a row, and the notification names the row, for example fix login redirect in pane 23 is done, rather than the pane.

[sounds] ​

KeyTypeDefaultConstraints and behavior
enabledboolfalseMaster switch for sounds.
bellbooltrueEnables the bell cue.
blockedbooltrueEnables the blocked cue.
donebooltrueEnables the done cue.
errorbooltrueEnables the error cue.
throttle_msinteger2000Clamped to 100..=60000 with a warning.
bell_filepath stringemptyWAV file that replaces the bell cue. ~ expands.
blocked_filepath stringemptyWAV file that replaces the blocked cue. ~ expands.
done_filepath stringemptyWAV file that replaces the done cue. ~ expands.
error_filepath stringemptyWAV file that replaces the error cue. ~ expands.
playerstringemptyPlayer executable. rozi passes the cue file as its last argument.
KeyTypeDefaultConstraints and behavior
editorsarray of stringsBuilt-in and extension targetsPrograms that receive split-aware navigation keys. Setting it replaces the whole list; [] turns split-aware detection off.

When editors is omitted, rozi uses its built-in list of foreground programs plus any targets from enabled extensions. Names are matched against the program's executable name, ignoring case and a Windows .exe suffix.

See Split-aware navigation.

[confirm] ​

Each switch controls whether rozi asks before a destructive action. They apply to key bindings and rozi run-action. Choosing a command from the command palette follows its own confirmation path.

KeyTypeDefaultAsks before
close_paneboolfalseClosing a pane whose program is still running.
kill_workspacebooltrueKilling a workspace.
kill_sessionbooltrueKilling a session.
quit_ephemeralbooltrueClosing a used temporary session when you leave it (the second empty-name confirmation; see Sessions).
new_temporary_sessionbooltrueReplacing a temporary session only this client uses with a new one.
load_profilebooltrueLoading a profile over a temporary session with live panes.

[session] ​

KeyTypeDefaultConstraints and behavior
keep_awake_while_agents_workboolfalseKeeps the host awake while an agent is working; activities such as rozi status and generic published rows do not count. See sleep policy.
autosaveboolfalseSaves and restores the local layout, not running programs.
resurrectbooltrueSaves each named session's layout, commands, scrollback, and what to restart.
resurrect_foregroundstring"hold"What a restore does with a command a pane was running or an agent conversation it reported: "auto" runs it, "hold" types it at the prompt, "never" restores only the shell.
resurrect_agentsbooltrueSaves agents' native session references in named-session snapshots and reopens those conversations on restore.
picker_open_onstring"current-host"Initial Sessions tab: "current-host" opens the current session’s host, the launcher's host, or Local; "all" opens All sessions.
startupstring"picker"What a bare rozi launch opens: "picker", "ephemeral" (a temporary session), "last", or "profile".
pathpath stringsession.toml in the state directoryAutosave file. ~ expands. The default file is private (mode 0600); a path you choose gets ordinary permissions.
allow_takeoverbooltrueLets a writable follower take layout control immediately.
on_attachstring"ask"When another client controls the session: "ask" offers Follow, control, or Cancel; "follow" and "take" choose without prompting. sessions attach --follow or --take-control overrides it for one attach.

See Sessions.

[remote] ​

KeyTypeDefaultConstraints and behavior
default_hoststringnoneHost used by --remote without a value.
reconnect_on_launchbooltrueReconnect hosts you deliberately connected, without SSH prompts or installation. Disconnecting a host removes it from future launches.
connection_timeout_secsinteger15SSH ConnectTimeout. Also sets how long each probe, install step, and remote sessions command may run before rozi stops it. 0 turns off ConnectTimeout and uses the default command limit.
server_alive_interval_secsinteger15Minimum 1.
server_alive_count_maxinteger3Minimum 1.
installstring"prompt"Whether to install rozi on the remote host: "prompt", "always", or "never". Noninteractive runs never install.
batch_modeboolfalseWhen true, refuses SSH prompts. By default, a running client answers them in a dialog. See Remote sessions.

[remote.hosts.<alias>] ​

KeyTypeDefaultConstraints and behavior
hoststringThe aliasSSH hostname.
userstringSSH defaultLogin user.
portintegerSSH default0 is ignored.
identity_filepath stringnoneSSH identity file.
ssh_argsarray of strings[]Extra SSH arguments.
binary_pathstringnoneAbsolute path to rozi on the remote host. Skips probing and installation.

[remote.ports] ​

KeyTypeDefaultConstraints and behavior
auto_forward_linksbooltrueAutomatically forward http and https loopback links opened from remote session panes onto the client.
prefer_same_portbooltrueWhen no local port is requested, try binding the remote port number on 127.0.0.1 before falling back to an ephemeral port. When false, always pick an ephemeral port unless a local port is specified.

See Remote sessions.

[scratchpad] ​

KeyTypeDefaultConstraints and behavior
commandstringNormal shellCommand for the first scratch pane.
cwdpath stringFocused local pane's directory, then the configured cwd~ expands. Read when the scratchpad is first created.
heightfloat0.4Docked height as a fraction of the pane area. Clamped to 0.1..=0.9 with a warning.

See Popups and scratch panes.

KeyTypeDefaultConstraints and behavior
tabsarray["activity", "agents", "panes", "sessions", "files", "git", "worktrees", "projects"]Tab definitions. IDs must be unique; hiding a tab does not remove its definition.
layout.left, layout.righttableSee belowIndependent dock preferences.
layout.hiddenstring array[]Hidden tab IDs; placement and definitions remain saved.
startupboolfalseOpen the remembered docks at client launch. When false, start hidden; b or B brings them back.
layout.<dock>.widthinteger32Clamped to 16..=80; both docks share the available width.
layout.<dock>.panel_countintegerleft 2, right 11..=3; reducing the count retains saved panels.
layout.<dock>.panelstable arrayleft session/repository groups, right emptyEach table contains weight (finite, positive) and ordered tabs (IDs). Unknown IDs retain their placement.
background_follows_canvasboolfalsePaints the sidebar with the canvas background instead of the raised panel fill.
gapbooltrueKeeps one row between each panel's tab bar and its list.
backgroundbooltruePaints the tab strip as a distinct bar. Off, the strip matches the body.
tab_stylestring"padded""padded", "round", or "arrow". Round and arrow need nerd_icons.
settings.<tab>tablenoneA built-in tab's settings. See Built-in tab settings.

Unplaced tabs join the first panel of the left dock, or of the right dock when only it holds tabs; Files, Git, Worktrees, and Projects join that dock's second panel. The default left panel weights are 0.4 and 0.6; the right panel weight is 1.0. See Sidebar for arranging tabs and panels.

Tab tables ​

An entry in tabs can be a table instead of an ID. A table defines a custom tab: a launcher tab with fixed rows, a command tab that lists a command's output, or a stream tab that programs publish rows to.

Tab keyTypeDefaultConstraints and behavior
namestringrequiredUnique tab ID. Built-in tab IDs are reserved.
labelstringrequired for custom tabsBuilt-in tree tab labels are fixed.
entriesarray of tablesnoneLauncher rows. A custom tab needs exactly one of entries, command, or stream = true.
commandstringnoneCommand whose output becomes the tab's rows.
formatstring"lines""lines" or "json". Command tabs only. See JSON command tabs.
streamboolfalseA tab programs publish rows to. See Stream tabs.
intervalinteger seconds30Minimum 5. Command tabs only.
on_clickaction tablenoneAction for a command tab's row.
group_prefixstringnoneLine command tabs only. Output lines starting with it become section headers.

A launcher entry takes a label, exactly one of run, send, or popup, an optional keep_open (default true), and an optional group. An on_click action takes an optional label, exactly one of run, send, popup, or exec, and an optional keep_open. In on_click, label only changes how the command is presented.

An extension can add the same kinds of tab from its manifest; see Extensions.

Built-in tab settings ​

Built-in tabs are listed in tabs by name only. Activity, Agents, Files, and Git take settings in a table of their own, [sidebar.settings.<tab>]. Sidebar tabs… edits the same tables; see Tab settings.

toml
[sidebar.settings.activity]
worktrees = "repository"

[sidebar.settings.files]
explorer = false
show_hidden = false
TabKeyTypeDefaultConstraints and behavior
activityworktreesstring"separate""separate" or "repository". See Activity.
activityagentsboolfalseLists coding agents in Activity as well as in the Agents tab. See Activity.
agentsworktreesstring"separate""separate" or "repository", independent of Activity's. See Agents.
files, gitexplorerbooltrue for files, false for gitShows a search field above the tree.
files, gitshow_hiddenbooltrueLists entries whose names start with a dot.
files, gitrootstring"cwd" for files, "repo" for git"cwd" for the focused pane's directory, "repo" for the repository containing it.
files, gitdiff_statsboolfalse for files, true for gitShows line-change counts beside Git marks.
gitcompact_dirsbooltrueShows a directory whose changes are all in one subdirectory on that subdirectory's row, as in src/view/sidebar.
files, gitmax_entriesinteger2000Clamped to 1..=10000.
files, giton_clickaction table{ send = "{path}" }What activating a file does. Not shown in Sidebar tabs….

Grouping rows into sections ​

A launcher entry's group puts it under a section header. Sections appear in the order their group first appears; entries without a group come first, with no header.

toml
[sidebar]
tabs = [
  { name = "launch", label = "Launch", entries = [
    { label = "rozi", group = "claude", run = "cd ~/Projects/rozi && claude" },
    { label = "docs", group = "claude", run = "cd ~/Projects/docs && claude" },
    { label = "rozi", group = "codex", run = "cd ~/Projects/rozi && codex" },
  ] },
]

A command tab groups its own output with group_prefix: an output line starting with the prefix becomes a section header showing the rest of the line. Headers cannot be selected, so on_click applies to every other row. Its on_click send action may use {line} for the row's text; run, popup, and exec receive the row in ROZI_ROW instead. See Command tabs.

Opening a diff viewer or editor from a row ​

A tree tab's send action may use {path}, because the result is typed into the pane as literal input. Do not end it with a newline unless you mean to run the text.

Tree run, popup, and exec actions receive the selected path in ROZI_FILE. run and popup reject {path}, and exec does not expand it. Quote the variable for your command shell:

toml
[sidebar.settings.files]
on_click = { run = '''"${EDITOR:-vi}" "$ROZI_FILE"''' }

[sidebar.settings.git]
on_click = { popup = '''git diff -- "$ROZI_FILE"''', keep_open = false }

rozi never inserts a selected path into a command string. See Sidebar files.

[workbar] ​

KeyTypeDefaultConstraints and behavior
leftsegment array["title", "workspaces"]Segments on the left, in order.
centersegment array[]Segments pinned to the middle of the workbar. They stay centered whatever the width of left and right.
rightsegment array["location", "session"]Segments on the right, in order.
clock_formatstring"%H:%M"A valid strftime format. Invalid formats are ignored.

A segment is a name string or a table { segment = "…", color = "…", priority = 200 }. The color and priority fields are optional. Colors are accent, info, success, warning, error, neutral, or panel.

SegmentShows
title, workspaces, location, session, clock, layout, activityBuilt-in segments.
text:<literal>Fixed text. It may use {host}, {workspace}, {layout}, and {session}.
command:<shell command>The command's output, refreshed every 60 seconds.
command:<interval seconds>:<shell command>The command's output, refreshed at the given interval (minimum 1 second).

When a section runs out of space, badges disappear whole in retention-priority order. Higher priorities stay visible longer; ties keep earlier configured segments. Set priority from 0 to 255 on a segment table to override its default. Center segments keep their own centered section; side content cannot push them aside. If the center itself is too wide, its lower-priority items disappear too.

SegmentDefault priority
Transient mode, synchronization, collaboration, and recording indicators255
session200
workspaces180
activity120
layout100
location80
clock60
text:…, command:…50
title20

Workspace tabs shrink to a scrolling strip before disappearing. Use the wheel or click ❮ and ❯ to reach hidden tabs. Switching workspaces brings the active tab into view.

Click title to open the command palette. Click location or session to open Sessions.

A command segment times out after 5 seconds and keeps at most 64 KiB from each output stream.

[workbar.alert] ​

KeyTypeDefaultConstraints and behavior
bellbooltrueMarks workspaces with a bell.
blockedbooltrueMarks blocked workspaces.
errorbooltrueMarks workspaces with an error you have not looked at.
finishedbooltrueMarks finished workspaces you have not looked at.
workingboolfalseMarks working workspaces.
idleboolfalseMarks idle workspaces.
modestring"pulse""off", "static", or "pulse".
paintstring"background""background" or "text".

[logging] ​

KeyTypeDefaultConstraints and behavior
dirpath stringlogs in the state directory~ expands.
max_bytesinteger67108864 (64 MiB)Limit per log file. 0 means no limit.

See Pane logging.

[capture] ​

KeyTypeDefaultConstraints and behavior
dirpath stringcaptures in the state directoryWhere Screenshot pane and Screenshot UI write PNGs. ~ expands. Created mode 0700 if missing.
scaleinteger11 to 3. Other values warn and use 1.

See Take a screenshot.

[recording] ​

Defaults for recordings. A pane recording reads these on the session's host, so for a remote session they come from that host. A UI recording uses the UI's own configuration.

KeyTypeDefaultConstraints and behavior
dirpath stringrecordings in the state directoryWhere a recording started without --output is written, including from Start pane recording and Start UI recording. ~ expands. Created mode 0700 if missing.
max_fpsinteger301 to 120.
durationduration string"24h"Such as "90s", "8h", or "1h30m"; at most "7d".
max_bytessize string"1GiB"Such as "512MiB"; at least "64KiB".
ui_indicatorbooltrueWhether a UI recording shows its REC chip. When false, the chip is neither on screen nor in the recording. rozi record start ui --hide-indicator hides it for one recording.

A value out of range, or one that does not parse, warns and keeps the default. The --max-fps, --duration, and --max-bytes options of rozi record start override these for one recording.

[[rules]] ​

Rules set how new panes open. They apply to ordinary panes started with an explicit command, in the order you declare them, and the first match wins.

KeyTypeDefaultConstraints and behavior
matchstringnoneCase-sensitive substring of the command. Set exactly one matcher.
match_regexstringnoneregex-lite pattern. Set exactly one matcher.
floatboolfalseOpens a floating pane.
widthfloat0.6 when floatingClamped to 0.1..=1.0.
heightfloat0.6 when floatingClamped to 0.1..=1.0.
positionstring"center"center, cursor, top-left, top, top-right, left, right, bottom-left, bottom, or bottom-right. Ignored unless floating.
workspaceintegerCurrent workspace1..=9. Invalid values are ignored.
focusbooltrueFocuses the pane and its workspace.
fullscreenboolfalseStarts fullscreen.

The control command split --workspace and --focus override workspace and focus. See Layouts and panes.

[[agents]] ​

KeyTypeDefaultConstraints and behavior
idstringrequiredLowercase letters, digits, _, and -. An entry with a built-in ID replaces that built-in.
labelstringThe IDLabel shown in Activity.
basebooltrueEnables the shared state patterns.
match.namesarray of strings[]Executable names.
match.pathsarray of strings[]Lowercase substrings of the path or arguments.
statesarray of state tables[]State rules.
historystring"mouse-scroll""mouse-scroll" lets agents prompt --result scroll the agent's transcript with the mouse wheel to read its alternate-screen history; "none" never does. Use "none" if the wheel does anything else in this agent.

A new definition needs at least one match name or path. A definition that replaces a built-in may omit match and keep the built-in's process match.

State keyTypeDefaultConstraints and behavior
statestringrequired"unknown", "blocked", "working", or "idle". States are checked in that order, not in declaration order.
scopestring"all""all" or "footer". Footer reads the last eight nonempty screen lines.
screenpattern tablenoneSet exactly one of screen or title.
titlepattern tablenoneSet exactly one of screen or title. scope does not apply.

Pattern tables accept all_of, any_of, and none_of string arrays, plus regex, a bool that defaults to false. At least one of all_of or any_of is required. Matching reads lowercased text. An invalid rule is skipped; an invalid definition is dropped.

See Agent definitions.

Choose what happens when you Ctrl-click a link or select a hint with an uppercase final label character. The first handler matching the URI scheme wins. Unmatched URLs keep the system opener, which supports http, https, and mailto; other schemes require a handler. A file handler also opens file paths shown in plain text, by Ctrl-click or hint. A path is a link only when it exists; on a remote session rozi cannot check, so every path that names a directory, such as src/main.rs, is one. A path in a pane whose shell runs on another host, such as over ssh, is not a link. Installed extensions can contribute handlers automatically; user handlers run first. Disable an extension in Extensions… to remove its handlers.

toml
[[links.handlers]]
schemes = ["http", "https"]
run = 'terminal-browser open "$ROZI_URL"'
keep_open = false

[[links.handlers]]
schemes = ["file"]
popup = 'nvim ${ROZI_LINE:+"+$ROZI_LINE"} -- "$ROZI_FILE"'
keep_open = false

To reuse a terminal-browser, replace run with exec = 'terminal-browser new-tab "$ROZI_URL"'.

KeyTypeDefaultConstraints and behavior
schemesstring arrayrequiredNonempty URI schemes, matched without case sensitivity.
filesstring arrayall filesFile-name patterns a file handler opens, such as "*.png"; * and ? are wildcards and case is ignored. See Open clicked files in popups.
commandstringunsetConfigured or extension command ID. Cannot be combined with inline action fields.
runstringunsetShell command in a new pane. Set exactly one of command, run, popup, or exec.
popupstringunsetShell command in a floating popup.
execstringunsetShell command without a pane, with output discarded.
keep_openbooltruePreserve output after run or popup exits.

To use a command supplied by an extension, name its public ID:

toml
[[links.handlers]]
schemes = ["http", "https"]
command = "terminal-browser.open"

The terminal-browser extension contributes HTTP and HTTPS handlers on installation and requires no handler configuration. Explicit command references are useful for overriding its default behavior. A missing, disabled, or non-process command reports an error rather than falling through to another handler.

Commands receive the following variables. Quote their expansions in shell commands; for PowerShell, use $env:ROZI_URL, $env:ROZI_FILE, and so on. The examples above use POSIX shell syntax.

VariableValue
ROZI_URLOriginal URI; empty for plain paths and custom hint actions.
ROZI_FILEDecoded file-URI path, or a plain path without its :line[:column] suffix, made absolute (on a remote session, as shown); otherwise empty.
ROZI_LINE, ROZI_COLUMNPosition suffix of a plain path, or empty.
ROZI_HINTFull original clicked URI or selected hint, including any position suffix.
ROZI_SOURCE_PANEPane containing the clicked link or selected hint.
ROZI_SOURCE_SESSIONOpaque session-server instance ID containing the source pane.
ROZI_REMOTE_HOSTRemote session host, or empty for local sessions.

Referenced commands run at their declared placement. send commands cannot be used as handlers. Custom hint actions can also reference commands, for example on_open = { command = "my-extension.inspect" }.

run and popup execute on the session host in the source pane's working directory. exec executes on the client; it inherits the source directory only for a local session and receives ROZI_PANE identifying the source pane. A plain path opens only through a handler that runs on the machine the file is on, since rozi does not fetch or translate remote paths: on a remote session that is run, popup, or a command placed on the session host, and in the scratchpad, run or exec. A filename ending in :123 is read as a position; use a file URI to keep that suffix as part of the filename.

[[hints]] ​

KeyTypeDefaultConstraints and behavior
patternstringrequiredNonempty regex-lite pattern. Invalid patterns are skipped.
openboolfalseLets the uppercase hint label open the match through link handlers.
on_opencommand tableunsetcommand, run, popup, or exec action for an uppercase label; enables the action even when open = false. Inline actions may set keep_open, which defaults to true.

Custom hint actions receive ROZI_HINT containing the match:

toml
[[hints]]
pattern = '\bISSUE-[0-9]+\b'
on_open = { exec = 'issue-viewer "$ROZI_HINT"' }

Lowercase labels always copy. Git SHA hints remain copy-only. The built-in URL, path, and Git SHA hints run first and win where matches overlap. See Copy, search, and hints.

[[hooks]] ​

KeyTypeDefaultConstraints and behavior
eventstringrequiredPublic event ID. Unknown IDs are skipped.
runstringrequiredNonempty command string run through command_shell.

Several hooks may use the same event. At most 32 hook and detached exec jobs run at once; further launches are skipped. See Hooks.

[[commands]] ​

Named commands have stable IDs, so you can bind them under [keys] and run them with rozi run-action.

KeyTypeDefaultConstraints and behavior
idstringrequiredLowercase letters, digits, _, and -. Dots, built-in IDs, and reserved prefixes are rejected.
labelstringGeneratedLabel in the command palette and help.
runstringnoneOpens a pane running the command through command_shell.
sendstringnoneSends literal text to the focused pane.
popupstringnoneOpens a centered popup running the command through command_shell.
execstringnoneRuns the command in the background through command_shell and discards its output. Runs on this machine, in the focused pane's directory when that pane is local. Shares the 32-job limit with hooks.
keep_openbooltrueFor run and popup: keeps the pane or popup open after the command exits.

Set exactly one of run, send, popup, or exec.

toml
[[commands]]
id = "branches"
label = "Switch branch"
exec = "~/.config/rozi/branch-pick.sh"

[keys]
branches = "i"

[extensions] ​

KeyTypeDefaultConstraints and behavior
disabledarray of strings[]Manifest IDs of extensions to disable; the Extensions overlay edits this key.

An [extensions.<id>] table configures one installed extension, using the settings that extension declares. rozi reports and ignores an undeclared key, a value of the wrong type, and a table for an extension that is not installed.

toml
[extensions]
disabled = ["docker"]

[extensions.tasks]
runner = "just"
rows = 20

Run rozi extensions check <path> to see the settings an extension declares and their defaults.

Extension commands may suggest a default key after the prefix and x — Ctrl+A, then x, then a key, with the default prefix. A [keys] entry for the command overrides the suggestion.

See Extensions.

[[services]] ​

Services are long-running background commands that rozi starts and restarts for you.

KeyTypeDefaultConstraints and behavior
namestringrequiredNonempty and unique.
runstringrequiredNonempty command string run through command_shell.
cwdpath stringLaunch directory~ expands when the service starts.
restartstring"on-failure""on-failure", "always", or "never".
envstring table{}Environment variables to set for the service.

Services receive ROZI=1, ROZI_SERVICE, ROZI_BIN, and, when control is available, ROZI_SOCKET.

A restarting service waits 1, 2, 4, 8, 16, then 30 seconds between attempts. After five consecutive failures within 60 seconds, the service stays stopped until you change its definition. rozi stops each service's process group when the client exits.

For packaged automation, use extension services instead. See Services.

[experimental] ​

Unstable settings. They may change or disappear in any release.

KeyTypeDefaultConstraints and behavior
terminal_enginestring"alacritty"The terminal emulator behind every pane: "alacritty" or "ghostty". Read when rozi or a session starts, so a running session keeps its engine; rozi context and rozi sessions show the engine in use. A build without Ghostty (Build from source) warns and uses "alacritty".

[keys] ​

Each key in [keys] is a built-in action ID, a named command ID, an extension command ID, or a trigger for an inline command.

Action and named-command bindings ​

Value formBehavior
"b" or ["b", "super-enter"]Replaces the defaults. A bare key expands through the prefix and modifier scheme; a full chord is used as written.
"scheme:ctrl-t"Expands one modified key through the prefix and modifier scheme.
"prefix:w"Binds only the prefix form of one key step. Follows [input] prefix.
"mod:v"Binds only the held-modifier form of one key step. Follows [input] modifier; inactive while modifier_shortcuts is false.
{ add = "super-enter" }Adds a binding and keeps the defaults. add also accepts an array.
"" or []Removes every binding for that action.

A string may list alternatives separated by commas. If every nonempty replacement is invalid, rozi keeps the action's defaults.

See Keybindings for action IDs and key syntax.

User-defined command keybindings ​

An inline command is a table bound directly to a trigger key:

KeyTypeDefaultConstraints and behavior
labelstringGeneratedLabel in the command palette and help.
runstringnoneOpens a pane.
sendstringnoneSends literal text to the focused pane.
popupstringnoneOpens a popup.
execstringnoneRuns in the background and discards output.
keep_openbooltrueApplies to run and popup.

Set exactly one of run, send, popup, or exec. The trigger accepts the same forms as a binding: g, "scheme:ctrl-g", "prefix:g", "mod:g", or a full chord. Inline commands have no stable ID, so rozi run-action cannot call them; use [[commands]] for that.

toml
[keys]
g = { run = "lazygit", label = "Git UI", keep_open = false }
"ctrl-a e" = { send = "ls -la\n" }
u = { exec = "rozi run-action toggle-float", label = "Float pane" }

MPL-2.0