Oh My Herdr
DocumentationProduct reference

Configuration reference

Configuration file locations, reload behavior, sections, keys, defaults, and diagnostics for Oh My Herdr.

Configuration reference

Oh My Herdr reads a TOML configuration file. This page describes version 0.2.18 configuration behavior and defaults. The generated template is available with omh --default-config.

File and state paths

Configuration path precedence

The configuration file is selected in this order:

PriorityConditionPath
1OMH_CONFIG_PATH is setThe exact path in OMH_CONFIG_PATH.
2XDG_CONFIG_HOME is set$XDG_CONFIG_HOME/omh/config.toml on release builds.
3Windows and APPDATA is set%APPDATA%/omh/config.toml.
4HOME is set$HOME/.config/omh/config.toml.
5No preceding directory is availableA temporary-directory fallback under omh is used.

A debug source build uses the application directory name omh-dev in these derived paths. A release build uses omh.

OMH_CONFIG_PATH wins over all directory variables and may point outside the derived configuration directory. Relative paths in ui.sound.path, ui.sound.done_path, and ui.sound.request_path are resolved relative to the selected configuration file's parent directory.

State paths

State uses a separate platform path and has no OMH_CONFIG_PATH override:

Platform/conditionState directory
XDG_STATE_HOME is set$XDG_STATE_HOME/omh
Windows and LOCALAPPDATA is set%LOCALAPPDATA%/omh/state
HOME is set$HOME/.local/state/omh
No preceding directory is availableA temporary-directory fallback under omh-state is used.

The configuration directory contains the default session snapshot at session.json. Named session data is under sessions/<name>/. The state directory stores state such as plugin state, agent-detection manifest caches, and product-announcement state. The exact files in those directories are runtime data, not configuration keys.

Loading, missing files, and diagnostics

  • A missing configuration file loads built-in defaults and produces no diagnostic.
  • A configuration read error loads built-in defaults and records a read diagnostic.
  • A TOML parse error loads built-in defaults and records a parse diagnostic.
  • A valid file with an unknown top-level table records a diagnostic. The loader does not promise strict schema validation for every unknown key or nested value.
  • Invalid values can produce diagnostics while the corresponding value or section falls back to a default or remains unchanged during a live reload.

omh config check reads the selected file and prints either config: ok or each diagnostic. It returns 0 when no diagnostics are reported and 1 when diagnostics are reported. A usage error returns 2. See the CLI reference.

Reload and startup application

Configuration reload is available through omh server reload-config and the configured in-app reload action (default prefix+shift+r). The server returns one of these statuses:

StatusConditionApplication behavior
appliedThe file loaded without diagnostics.All reloadable sections are applied.
partialThe file loaded with diagnostics or one or more sections were invalid.Valid reloadable sections are applied; invalid sections retain their previous live values.
failedThe file could not be read or parsed as a reloadable TOML document.The current live configuration is retained.

omh server reload-config prints the JSON response. A successful API response, including a report whose status is partial, exits 0; a server/API error exits 1. The in-app reload reports the same status in its configuration diagnostics surface.

Section or keyStartupLive reloadScope of a live change
onboardingAppliedNo standalone live applicationControls whether the onboarding surface is shown at startup.
themeAppliedYesGlobal theme names, mode, terminal accents, and custom colors.
terminalAppliedYesDefaults used by newly created panes, tabs, and workspaces; existing shells are not rewritten.
session.resume_agents_on_restoreAppliedCopied into runtime stateControls agent restoration when session data is restored; it does not rewrite already running panes.
keysAppliedYesPrefix and action bindings for the running app/server.
uiAppliedYesLive UI defaults and current server-side UI settings. Client-local initial view state remains client-local.
ui.sidebar.initial_state, ui.sidebar.initial_agent_scopeAppliedYes for future client defaultsValues are the initial view defaults for newly connected clients.
advancedAppliedYesScrollback limit used by pane terminals. Existing retained output is not expanded retroactively.
worktreesAppliedYesWorktree root used by future worktree operations. Existing checkouts are not moved.
gitAppliedNodiff_command is captured by the running app at startup.
updateAppliedYesBackground version and manifest check scheduling.
agent_profilesAppliedYesProfile catalog and integration recommendations; running processes are unchanged.
remoteApplied for a remote launchNo for an existing bridgemanage_ssh_config is read when a remote SSH launch starts.
experimentalAppliedYesExperimental runtime toggles, pane history, IME cursor behavior, and macOS input-source behavior.

Reload is section-oriented rather than an all-or-nothing schema validation pass. For example, a bad [keys] section can leave current keybindings in place while a valid [theme] section is applied. Invalid [ui] sidebar bounds (sidebar_min_width > sidebar_max_width) retain the previous UI section. Sound-file diagnostics and keybinding diagnostics can produce partial while other valid settings are applied.

Top-level settings

onboarding

KeyTypeDefaultDescription
onboardingboolean or nullmissing (true effective)When true or missing, show onboarding at startup. false skips it.

[theme]

KeyTypeDefaultDescription
namestring or nullnullLegacy single theme name. When light or dark is absent, it supplies the corresponding appearance when valid.
lightstring or nullnullBuilt-in theme for light appearance. Effective fallback: catppuccin-latte.
darkstring or nullnullBuilt-in theme for dark appearance. Effective fallback: catppuccin.
modesystem, light, or darksystemResolves the active light/dark appearance. system follows the host terminal appearance when available.
terminal_accentblue, magenta, cyan, green, yellow, or redblueANSI accent used when no appearance-specific terminal accent is set.
terminal_light_accentterminal accent or nullnullANSI accent for light appearance; falls back to terminal_accent.
terminal_dark_accentterminal accent or nullnullANSI accent for dark appearance; falls back to terminal_accent.
[theme.custom]tablenullOptional token overrides applied on top of the selected built-in theme.

The built-in name, light, and dark values are theme names such as catppuccin, catppuccin-latte, dracula, nord, gruvbox, tokyo-night, and the other names included in omh --default-config. A name is resolved separately for light and dark appearance.

[theme.custom] keys

Each custom color is a string. Accepted color forms are #rrggbb, #rgb, a named color, rgb(r,g,b), and reset aliases where supported.

KeyDefault
accentnull
panel_bgnull
surface0null
surface1null
surface_dimnull
overlay0null
overlay1null
textnull
subtext0null
mauvenull
greennull
yellownull
rednull
bluenull
tealnull
peachnull

[terminal]

KeyTypeDefaultDescription
default_shellstring""Executable for new interactive panes. Empty uses SHELL, then /bin/sh.
shell_modeauto, login, or non_loginautoStartup mode for new pane shells. auto uses login shells on macOS and current behavior elsewhere.
new_cwdfollow, home, current, or a path stringfollowWorking-directory policy for new panes, tabs, and workspaces when no explicit --cwd is supplied. follow inherits the source; home uses the home directory; current uses Oh My Herdr's process directory.

[session]

KeyTypeDefaultDescription
resume_agents_on_restorebooleantrueResume supported AI-agent panes into native conversation sessions when restoring session data. The required session references are supplied by supported integrations.

[keys]

Key binding syntax and the full interactive binding surface are described in the keybinding reference. A binding accepts one string or an array of strings. Empty strings and empty arrays leave optional actions unset.

KeyDefaultDescription
prefixctrl+bPrefix key that enters prefix mode.
helpprefix+?Open keybinding help.
settingsprefix+sOpen settings.
new_workspaceprefix+shift+nCreate a workspace.
rename_workspaceprefix+shift+wRename the selected workspace.
close_workspaceprefix+shift+dClose the selected workspace.
workspace_pickerprefix+wOpen workspace navigation.
gotoprefix+gOpen the session navigator.
navigate_workspace_upupMove workspace selection up in navigate mode.
navigate_workspace_downdownMove workspace selection down in navigate mode.
navigate_pane_lefthFocus left in navigate mode; left arrow is also an alias.
navigate_pane_downjFocus down in navigate mode.
navigate_pane_upkFocus up in navigate mode.
navigate_pane_rightlFocus right in navigate mode; right arrow is also an alias.
detachprefix+qDetach from the client/server view or exit no-session mode.
reload_configprefix+shift+rReload config.toml.
open_notification_targetprefix+oFocus the visible notification target.
command_paletteprefix+spaceOpen the command palette.
previous_workspaceunsetSelect the previous workspace.
next_workspaceunsetSelect the next workspace.
open_group_menuunsetOpen the group menu.
new_groupunsetCreate a group.
rename_groupunsetRename the active group.
delete_groupunsetDelete the active group.
toggle_group_filterunsetToggle current-group/all-group filtering.
previous_groupunsetFocus the previous group.
next_groupunsetFocus the next group.
switch_groupprefix+alt+1..0Switch to groups 1–10.
previous_agentunsetFocus the previous agent in the agent panel.
next_agentunsetFocus the next agent in the agent panel.
open_agent_menuunsetOpen the agent-scope menu.
focus_agentunsetFocus an agent by index 1–9.
remote_image_pastectrl+vLocal-client shortcut for sending a clipboard image to a remote session. Empty disables it.
new_tabprefix+cCreate a tab.
rename_tabprefix+shift+tRename the active tab.
previous_tabprefix+pSelect the previous tab.
next_tabprefix+nSelect the next tab.
switch_tabprefix+1..0Switch to tabs 1–10.
switch_workspaceprefix+shift+1..0Switch to workspaces 1–10.
close_tabprefix+shift+xClose the active tab.
rename_paneprefix+shift+pRename the focused pane.
edit_scrollbackprefix+eOpen focused-pane scrollback in EDITOR.
copy_modeprefix+[Enter keyboard copy mode.
focus_pane_leftprefix+hFocus the pane to the left.
focus_pane_downprefix+jFocus the pane below.
focus_pane_upprefix+kFocus the pane above.
focus_pane_rightprefix+lFocus the pane to the right.
cycle_pane_nextprefix+tabCycle to the next pane.
cycle_pane_previousprefix+shift+tabCycle to the previous pane.
last_paneunsetFocus the last-focused pane across workspaces and tabs.
split_verticalprefix+vSplit vertically.
split_horizontalprefix+minusSplit horizontally.
close_paneprefix+xClose the focused pane.
zoomprefix+zToggle pane zoom. fullscreen is a legacy alias for this key.
resize_modeprefix+rEnter resize mode.
toggle_sidebarprefix+bToggle the left/sidebar view.
toggle_right_sidebarunsetToggle the right sidebar.
[keys.indexed]tableLegacy indexed shortcuts; tabs, workspaces, and agents default to unset.
[[keys.command]]empty listAdd a custom command binding.

[keys.indexed] contains:

KeyDefaultDescription
tabsunsetModifier combination for direct tab shortcuts 1–9.
workspacesunsetModifier combination for direct workspace shortcuts 1–9.
agentsunsetModifier combination for direct agent shortcuts 1–9.

Each [[keys.command]] entry contains:

KeyTypeDefaultDescription
keybinding or list of bindingsunsetTrigger binding. prefix+... is a prefix-mode trigger; a modified chord can be direct.
commandstring""Command text or plugin action identifier, according to type.
typeshell, pane, or plugin_actionshellRun a detached shell command, run in a temporary pane, or invoke a plugin action.
descriptionstring or nullnullOptional custom description.

[ui]

KeyTypeDefaultDescription
sidebar_widthinteger26Default expanded sidebar width in columns.
sidebar_min_widthinteger18Minimum expanded sidebar width.
sidebar_max_widthinteger36Maximum expanded sidebar width.
mobile_width_thresholdinteger64Terminal width at or below which the mobile single-column layout is used.
sidebar_arrangementauto, separate, combined_left, or combined_rightautoDesktop sidebar arrangement.
mouse_capturebooleantrueCapture mouse input for the Oh My Herdr UI.
copy_on_selectbooleantrueCopy text selected by mouse drag.
host_cursorauto, native, or drawnautoHost-terminal cursor policy.
right_click_passthrough_modifiermodifier string or emptyemptyModifier that forwards right-click hold/drag gestures to pane apps. Supported modifiers include ctrl, alt, cmd, super, meta, and hyper, including combinations.
redraw_on_focus_gainedbooleantrueForce a full host-terminal redraw when the outer terminal regains focus.
mouse_scroll_linespositive integer or nullnull (effective 3)Lines scrolled per mouse-wheel notch.
confirm_closebooleantrueAsk for confirmation before closing a workspace.
prompt_new_tab_namebooleantrueAsk for a tab name before creating a tab.
show_agent_labels_on_pane_bordersbooleanfalseShow detected/reported agent labels in split-pane borders when no manual label is set.
pane_bordersbooleantrueDraw borders around split panes.
pane_gapsbooleantrueKeep split panes visually separated from divider borders.
hide_tab_bar_when_single_tabbooleanfalseHide the tab row when the active workspace has one tab.
sidebar_collapsed_modecompact or hiddencompactRender a narrow rail or zero-width area when collapsed.
accentcolor stringcyanAccent for highlights, borders, and navigation UI. Supports hex, named colors, and rgb(r,g,b).
[ui.toast]tablesee belowBackground notification popup configuration.
[ui.sound]tablesee belowBackground agent-state sound configuration.
[ui.sidebar]tablesee belowSidebar initial view and row layout configuration.

[ui.sidebar]

KeyTypeDefaultDescription
initial_stateexpanded or collapsedexpandedInitial sidebar state for each newly connected client.
initial_agent_scopeall, group, or currentallInitial agent panel scope: all agents, the current group, or the current space.
[ui.sidebar.agents].rowsarray of token arrays[["workspace"]]Default rows and tokens for agent entries.
[ui.sidebar.agents].rows_by_agenttable of string keys to token arrays{}Per-agent layout overrides keyed by canonical agent ID.
[ui.sidebar.spaces].rowsarray of token arrays[["state_icon", "workspace"]]Rows and tokens for space entries.

Agent-row tokens are state_icon, state_text, workspace, tab, pane, agent, terminal_title, terminal_title_stripped, and custom tokens beginning with $. Space-row tokens are state_icon, state_text, workspace, branch, git_status, and custom tokens beginning with $. A layout can contain at most 16 rows and 16 tokens per row. Unknown built-in tokens, invalid custom token names, and unknown canonical agent IDs are diagnostics.

[ui.toast]

KeyTypeDefaultDescription
deliveryoff, omh, terminal, or systemoffDisable popups, show in-app toasts, request an outer-terminal notification, or request the OS notification service.
delay_secondsinteger from 0 to 36001Delay before a background notification is delivered.
[ui.toast.omh].positiontop-left, top-right, bottom-left, or bottom-rightbottom-rightIn-app toast position.
[ui.toast.clipboard].enabledbooleantrueEnable clipboard toast notifications.
[ui.toast.clipboard].positiontop-left, top-center, top-right, bottom-left, bottom-center, or bottom-rightbottom-centerClipboard toast position.

The legacy ui.toast.enabled boolean is accepted for compatibility and maps to delivery = "omh" when true or delivery = "off" when false, unless an explicit delivery is present.

[ui.sound]

KeyTypeDefaultDescription
enabledbooleantrueEnable background agent-state sounds.
pathpath or nullnullOne MP3 file used for all sound notifications. Relative paths use the configuration file's directory.
done_pathpath or nullnullMP3 for done notifications; falls back to path.
request_pathpath or nullnullMP3 for request/attention notifications; falls back to path.
[ui.sound.agents]tableper-agent defaultsPer-agent sound overrides.

Agent sound override keys are pi, claude, codex, gemini, cursor, agy, cline, open_code, github_copilot, devin, kimi, kiro, droid, amp, grok, hermes, kilo, qodercli, and maki. Each accepts default, on, or off; every key defaults to default except droid, which defaults to off. Sound paths must resolve to existing MP3 files; invalid, missing, or non-MP3 files are diagnostics and use the default sound.

[worktrees]

KeyTypeDefaultDescription
directorypath string~/.omh/worktreesRoot directory under which Oh My Herdr creates <repo>/<branch-slug> checkouts. ~ is expanded when the path is used.

[git]

KeyTypeDefaultDescription
diff_commandstringlazygitCommand launched by the open-git-diff action in the selected repository root. The command is interpreted by the project-command runner.

[update]

KeyTypeDefaultDescription
version_checkbooleantrueCheck GitHub for a newer Oh My Herdr release in the background.
manifest_checkbooleantrueCheck for remote agent-detection manifest updates in the background.

[agent_profiles]

KeyTypeDefaultDescription
orderarray of strings[]Optional global profile order. System IDs use the form system:<kind>; custom IDs are normalized to user:<id>. Unlisted profiles follow the catalog order.
customarray of tables[]User-defined agent profiles.

Each [[agent_profiles.custom]] entry has:

KeyTypeDefaultDescription
idstringrequiredStable custom profile ID.
namestringrequiredDisplay name.
kindagent kindrequiredAgent kind, including supported system kinds or custom.
commandstringrequiredCommand parsed into an argument vector. Shell pipes, redirects, globbing, and $VAR expansion are not applied.
envtable of strings{}Environment variables added to the profile process.
enabledbooleantrueWhether the custom profile is available for launch.

System profiles are catalogued from detected supported agent kinds. A custom profile with an invalid command or invalid environment entries is retained as a profile diagnostic and is not launchable.

[remote]

KeyTypeDefaultDescription
manage_ssh_configbooleantrueFor omh --remote, use a generated SSH configuration that includes the user's SSH configuration and keepalive fallbacks. false runs plain SSH with the user's configuration unchanged.

This setting is read when a remote bridge starts. It does not change an already running SSH bridge through configuration reload.

[advanced]

KeyTypeDefaultDescription
scrollback_limit_bytespositive integer10000000Maximum retained scrollback buffer per pane terminal. The legacy key scrollback_lines is accepted as an alias.

[experimental]

These settings are experimental runtime controls. Their names and behavior can change between releases.

KeyTypeDefaultDescription
allow_nestedbooleanfalseAllow launching Oh My Herdr inside an Oh My Herdr-managed pane.
kitty_graphicsbooleanfalseEnable local Kitty graphics rendering for attached clients.
pane_historybooleantruePersist pane screen history to session-history.json. Disabling it clears persisted history during live reload.
reveal_hidden_cursor_for_cjk_imebooleanfalseExpose a focused pane's cursor anchor to the outer terminal for macOS native input methods even when the pane hides its cursor.
cjk_ime_agentsarray of strings[]Optional case-insensitive allow-list for reveal_hidden_cursor_for_cjk_ime. Empty applies to any focused pane; unknown names are ignored.
cjk_ime_cursor_shapeblock, steady_block, underline, steady_underline, bar, or steady_barsteady_blockCursor shape used for the CJK IME anchor.
switch_ascii_input_source_in_prefixbooleanfalseOn macOS, temporarily switch to an ASCII-capable input source during prefix mode and restore the previous source afterward. It is a no-op on other platforms and best-effort on macOS.

Accepted cjk_ime_agents names are pi, claude, codex, gemini, cursor, cline, opencode, copilot, devin, kimi, kiro, droid, amp, grok, hermes, kilo, qodercli, qoder, and maki.

Diagnostics and invalid sections

Diagnostics identify read failures, TOML parse failures, unknown top-level tables, invalid key combinations, invalid sidebar bounds, invalid sound files, and other value problems detected by the current loader. Diagnostics are not a statement that every unknown nested key is rejected by a strict schema validator.

During a live reload, a syntactically unreadable file has status failed and leaves the current live configuration intact. A readable file with invalid sections has status partial: valid sections may apply, while the invalid section keeps its previous live value. A file with no diagnostics has status applied.

Last updated on

On this page