|
| 1 | +# herdr configuration |
| 2 | +# Place this file at ~/.config/herdr/config.toml |
| 3 | + |
| 4 | +# Show first-run notification setup on startup. |
| 5 | +# Missing also shows onboarding; set false after you've chosen. |
1 | 6 | onboarding = false |
| 7 | + |
| 8 | +[theme] |
| 9 | +# Built-in themes: catppuccin, terminal, tokyo-night, dracula, nord, |
| 10 | +# gruvbox, one-dark, solarized, kanagawa, rose-pine, |
| 11 | +# vesper |
| 12 | +# name = "catppuccin" |
| 13 | + |
| 14 | +# Follow host terminal light/dark appearance and switch Herdr UI themes. |
| 15 | +# Existing manual behavior is unchanged unless this is true. |
| 16 | +# auto_switch = false |
| 17 | +# dark_name = "catppuccin" |
| 18 | +# light_name = "catppuccin-latte" |
| 19 | + |
| 20 | +# Override individual color tokens on top of the base theme. |
| 21 | +# Accepts: hex (#rrggbb), named colors, rgb(r,g,b), or panel_bg = "reset" |
| 22 | +# [theme.custom] |
| 23 | +# sidebar_bg = "#181825" |
| 24 | +# active_row_bg = "#1e1e2e" |
| 25 | +# selection_bg = "#313244" |
| 26 | +# panel_bg = "reset" |
| 27 | +# accent = "#f5c2e7" |
| 28 | +# red = "#ff6188" |
| 29 | +# green = "#a6e3a1" |
| 30 | + |
| 31 | +[terminal] |
| 32 | +# Executable used for new interactive panes. |
| 33 | +# Empty means $SHELL, then /bin/sh. |
| 34 | +# default_shell = "" |
| 35 | + |
| 36 | +# Startup mode for new interactive pane shells: "auto", "login", or "non_login". |
| 37 | +# "auto" uses login shells on macOS and keeps the current behavior elsewhere. |
| 38 | +# shell_mode = "auto" |
| 39 | + |
| 40 | +# CWD policy for new panes, tabs, and workspaces when no explicit --cwd is provided. |
| 41 | +# Use "follow" to inherit the source pane/workspace, "home" for $HOME, |
| 42 | +# "current" for Herdr's process directory, or a fixed path such as "~/Projects". |
| 43 | +# new_cwd = "follow" |
| 44 | + |
| 45 | +[update] |
| 46 | +# Update channel used by background version checks and `herdr update`. |
| 47 | +# Stable builds default to "stable". Windows preview builds default to "preview" |
| 48 | +# so existing preview installs stay there until explicitly switched. |
| 49 | +# channel = "stable" |
| 50 | + |
| 51 | +# Check herdr.dev for new Herdr versions in the background. |
| 52 | +# version_check = true |
| 53 | + |
| 54 | +# Check herdr.dev for remote agent-detection manifest updates in the background. |
| 55 | +# manifest_check = true |
| 56 | + |
| 57 | +[keys] |
| 58 | +# Prefix key to enter prefix mode (default: "ctrl+b") |
| 59 | +# Examples: "ctrl+b", "f12", "esc", "-" |
| 60 | +# Action bindings use explicit syntax: "prefix+n" requires the prefix; |
| 61 | +# "ctrl+alt+n" is a direct terminal-mode shortcut. |
| 62 | +# Accepted key syntax: plain keys, ctrl/shift/alt/cmd/super modifiers, and special keys like enter/tab/esc/left/right/up/down. |
| 63 | +# Named punctuation such as minus, comma, ampersand, plus, and backtick is also accepted. |
| 64 | +# Most reliable direct bindings are ctrl+letter, function keys, and explicit modified chords. |
| 65 | +# alt+..., cmd/super, and punctuation-with-modifiers may depend on your terminal/tmux setup. |
| 66 | +# prefix = "ctrl+b" |
| 67 | + |
| 68 | +# Prefix-mode actions |
| 69 | +# help = "prefix+?" |
| 70 | +# settings = "prefix+s" |
| 71 | +# detach = "prefix+q" |
| 72 | +# reload_config = "prefix+shift+r" |
| 73 | +# open_notification_target = "prefix+o" |
| 74 | +# workspace_picker = "prefix+w" |
| 75 | +# goto = "prefix+g" |
| 76 | +# new_workspace = "prefix+shift+n" |
| 77 | +# new_worktree = "prefix+shift+g" |
| 78 | +# open_worktree = "" # optional, unset by default |
| 79 | +# remove_worktree = "" # optional, unset by default; opens confirmation |
| 80 | +# rename_workspace = "prefix+shift+w" |
| 81 | +# close_workspace = "prefix+shift+d" |
| 82 | +# previous_workspace = "" # optional, unset by default |
| 83 | +# next_workspace = "" # optional, unset by default |
| 84 | +# previous_agent = "" # optional, unset by default |
| 85 | +# next_agent = "" # optional, unset by default |
| 86 | +# focus_agent = "" # optional indexed binding, e.g. "prefix+alt+1..9" |
| 87 | +# remote_image_paste = "ctrl+v" # only active in herdr --remote; empty disables raw-key image paste |
| 88 | +# new_tab = "prefix+c" |
| 89 | +# rename_tab = "prefix+shift+t" |
| 90 | +# previous_tab = "prefix+p" |
| 91 | +# next_tab = "prefix+n" |
| 92 | +# move_tab_previous = "" # optional, e.g. "alt+shift+left" moves the tab toward the front |
| 93 | +# move_tab_next = "" # optional, e.g. "alt+shift+right" moves the tab toward the back |
| 94 | +# switch_tab = "prefix+1..9" |
| 95 | +# switch_workspace = "" # optional indexed binding, e.g. "prefix+shift+1..9" |
| 96 | +# close_tab = "prefix+shift+x" |
| 97 | +# rename_pane = "prefix+shift+p" |
| 98 | +# edit_scrollback = "prefix+e" |
| 99 | +# focus_pane_left = "prefix+h" |
| 100 | +# focus_pane_down = "prefix+j" |
| 101 | +# focus_pane_up = "prefix+k" |
| 102 | +# focus_pane_right = "prefix+l" |
| 103 | +# cycle_pane_next = "prefix+tab" |
| 104 | +# cycle_pane_previous = "prefix+shift+tab" |
| 105 | +# last_pane = "" # optional, unset by default; bind e.g. "prefix+tab" for global back-and-forth |
| 106 | +# split_vertical = "prefix+v" |
| 107 | +# split_horizontal = "prefix+minus" |
| 108 | +# close_pane = "prefix+x" |
| 109 | +# zoom = "prefix+z" # legacy alias: fullscreen |
| 110 | +# resize_mode = "prefix+r" |
| 111 | +# resize_pane_left = "" # optional, e.g. "ctrl+shift+alt+left" resizes without entering resize mode |
| 112 | +# resize_pane_down = "" # optional, e.g. "ctrl+shift+alt+down" |
| 113 | +# resize_pane_up = "" # optional, e.g. "ctrl+shift+alt+up" |
| 114 | +# resize_pane_right = "" # optional, e.g. "ctrl+shift+alt+right" |
| 115 | +# toggle_sidebar = "prefix+b" |
| 116 | + |
| 117 | +# Navigate-mode movement. These local shortcuts win while navigate mode is open. |
| 118 | +# They are independent from focus_pane_*. Do not include prefix+, esc, enter, tab, or 1..9 here. |
| 119 | +# navigate_workspace_up = "up" |
| 120 | +# navigate_workspace_down = "down" |
| 121 | +# navigate_pane_left = "h" # left arrow always focuses the pane to the left |
| 122 | +# navigate_pane_down = "j" |
| 123 | +# navigate_pane_up = "k" |
| 124 | +# navigate_pane_right = "l" # right arrow always focuses the pane to the right |
| 125 | + |
| 126 | +# Custom commands use the same binding syntax. |
| 127 | +# type = "shell" runs detached in the background. |
| 128 | +# type = "pane" opens a temporary pane and closes it when the command exits. |
| 129 | +# type = "popup" opens a session-modal terminal without changing the tab layout. |
| 130 | +# Popup width and height accept terminal cells or percentages such as "80%". |
| 131 | +# On Windows, command strings run through cmd.exe /d /c. |
| 132 | +# [[keys.command]] |
| 133 | +# key = "prefix+alt+g" |
| 134 | +# type = "popup" |
| 135 | +# command = "lazygit" |
| 136 | +# width = "80%" |
| 137 | +# height = "80%" |
| 138 | + |
| 139 | +# Legacy indexed shortcut config is still parsed for compatibility. |
| 140 | +# Prefer switch_tab, switch_workspace, and focus_agent for new configs. |
| 141 | +# [keys.indexed] |
| 142 | +# tabs = "" # e.g. "ctrl" makes ctrl+1..9 switch tabs directly |
| 143 | +# workspaces = "" # e.g. "ctrl+shift" makes ctrl+shift+1..9 switch workspaces directly |
| 144 | +# agents = "" # e.g. "alt" makes alt+1..9 focus agent rows directly |
| 145 | + |
| 146 | +# Size of the virtual terminal used when no client is attached. |
| 147 | +# Attached clients always use their own terminal size. |
| 148 | +[server] |
| 149 | +# headless_cols = 120 |
| 150 | +# headless_rows = 40 |
| 151 | + |
| 152 | +# [worktrees] |
| 153 | +# directory = "~/.herdr/worktrees" |
| 154 | + |
| 155 | +[ui] |
| 156 | +# Sidebar width (auto-scaled based on workspace names, this sets the default) |
| 157 | +# sidebar_width = 26 |
| 158 | + |
| 159 | +# Minimum sidebar width when expanded (columns) |
| 160 | +# sidebar_min_width = 18 |
| 161 | + |
| 162 | +# Maximum sidebar width when expanded (columns) |
| 163 | +# sidebar_max_width = 36 |
| 164 | + |
| 165 | +# Start with the sidebar collapsed. Changes take effect on the next launch. |
| 166 | +# sidebar_start_collapsed = false |
| 167 | + |
| 168 | +# Collapsed sidebar presentation: "compact" keeps the narrow status rail, "hidden" uses zero width. |
| 169 | +# sidebar_collapsed_mode = "compact" |
| 170 | + |
| 171 | +# Terminal width at or below which Herdr uses the mobile single-column layout. |
| 172 | +# Increase this for foldables, tablets, or wide phone terminals. |
| 173 | +# mobile_width_threshold = 64 |
| 174 | + |
| 175 | +# Capture mouse input for Herdr's mouse UI. |
| 176 | +# Set false to let the terminal handle normal clicks, such as Cmd-clicking URLs. |
| 177 | +# Pane apps like lazygit and btop can still receive mouse when they request it. |
| 178 | +# mouse_capture = true |
| 179 | + |
| 180 | +# Automatically copy text selected with the mouse. |
| 181 | +# Set false to retain drag or double-click word selection until Ctrl+C, |
| 182 | +# or Cmd+C when the host forwards it, copies and clears it. |
| 183 | +# copy_on_select = true |
| 184 | + |
| 185 | +# Host cursor policy: "auto", "native", or "drawn". |
| 186 | +# "auto" draws Herdr's own cursor on native Windows builds and WSL to avoid ConPTY cursor flicker, and uses the native terminal cursor elsewhere. |
| 187 | +# "native" always uses the outer terminal cursor. "drawn" always draws Herdr's cursor as terminal cell content. |
| 188 | +# host_cursor = "auto" |
| 189 | + |
| 190 | +# Optional modifier that forwards right-click hold/drag gestures to pane apps instead of opening Herdr's pane menu. |
| 191 | +# Empty/off disables this. Shift is intentionally unsupported because terminals commonly reserve Shift+mouse. |
| 192 | +# right_click_passthrough_modifier = "" |
| 193 | + |
| 194 | +# Force a full redraw when the outer terminal regains focus. |
| 195 | +# Set false to reduce visible flashing when switching back to Herdr. |
| 196 | +# Trade-off: rare host terminal surface corruption may persist until the next full redraw. |
| 197 | +# redraw_on_focus_gained = true |
| 198 | + |
| 199 | +# Pane scrollback lines to scroll per mouse wheel notch. |
| 200 | +# mouse_scroll_lines = 3 |
| 201 | + |
| 202 | +# Ask for confirmation before closing a workspace |
| 203 | +# confirm_close = true |
| 204 | + |
| 205 | +# Ask for a tab name before creating a new tab. |
| 206 | +# Set false to create tabs immediately with generated names. |
| 207 | +# prompt_new_tab_name = true |
| 208 | + |
| 209 | +# Ask for a workspace name before interactive creation. |
| 210 | +# prompt_new_workspace_name = false |
| 211 | + |
| 212 | +# Draw borders around split panes. |
| 213 | +# pane_borders = true |
| 214 | + |
| 215 | +# Draw borders along the outside edge of the pane area. |
| 216 | +# Disable for tmux-style internal splitters without an outside frame. |
| 217 | +# pane_outer_borders = true |
| 218 | + |
| 219 | +# Draw interactive scrollbars beside terminal panes. |
| 220 | +# Set false to reclaim the scrollbar column and keep it out of terminal-native selections. |
| 221 | +# pane_scrollbars = true |
| 222 | + |
| 223 | +# Keep split panes visually separated instead of sharing divider borders. |
| 224 | +# pane_gaps = true |
| 225 | + |
| 226 | +# Show detected/reported agent labels in split pane borders when no manual pane name is set. |
| 227 | +# show_agent_labels_on_pane_borders = false |
| 228 | + |
| 229 | +# Hide the tab row when a workspace has exactly one tab. |
| 230 | +# New tabs can still be created with the configured keybinding. |
| 231 | +# hide_tab_bar_when_single_tab = false |
| 232 | + |
| 233 | +# Desktop tab row placement: "top" or "bottom". |
| 234 | +# tab_bar_position = "top" |
| 235 | + |
| 236 | +# Ordered status entries at the right edge of the desktop tab bar. |
| 237 | +# Supported types: zoom, hostname, datetime, text, and command. |
| 238 | +# Hostname, datetime, and command entries resolve on the Herdr server. |
| 239 | +# tab_bar_right = [] |
| 240 | +# tab_bar_right_separator = " " |
| 241 | + |
| 242 | +# Title Herdr writes to the terminal it runs in, which is what window managers |
| 243 | +# show in title, tab, and group bars. Tokens are {hostname}, {workspace}, {tab}, |
| 244 | +# {pane}, and {terminal_title}; {{ and }} are literal braces. |
| 245 | +# The title renders on the Herdr server, so {hostname} names the host the panes |
| 246 | +# run on even when attaching from a remote client. |
| 247 | +# Set to "" to leave the outer terminal title alone. |
| 248 | +# window_title = "{hostname}: {workspace}" |
| 249 | + |
| 250 | +# Agent panel ordering: "spaces" (grouped by space) or "priority" (attention queue). |
| 251 | +# "workspaces" is accepted as an alias for "spaces". |
| 252 | +# agent_panel_sort = "spaces" |
| 253 | + |
| 254 | +# Agent status indicators: "dots" preserves the compact color marks; "symbols" uses |
| 255 | +# distinct static glyphs for blocked, working, done, idle, and unknown states. |
| 256 | +# status_indicators = "dots" |
| 257 | + |
| 258 | +# Expanded agent rows. Built-ins are state_icon, state_text, workspace, tab, pane, agent, |
| 259 | +# terminal_title, and terminal_title_stripped. |
| 260 | +# Custom values reported through pane metadata use a $name token. |
| 261 | +# A token occurrence may be styled with { token = "workspace", fg = "#89b4fa", bold = true, dim = false }. |
| 262 | +# Omitted style fields preserve the contextual default. |
| 263 | +# [ui.sidebar.agents] |
| 264 | +# Blank rows between agent entries. Set to 1 to restore the previous spacing. |
| 265 | +# row_gap = 0 |
| 266 | +# rows = [["state_icon", "workspace", "tab"], ["agent"]] |
| 267 | +# Optional canonical agent IDs replace the default rows for matching agents. |
| 268 | +# [ui.sidebar.agents.rows_by_agent] |
| 269 | +# claude = [["state_icon", "workspace", "tab"], ["terminal_title_stripped"], ["agent"]] |
| 270 | + |
| 271 | +# Expanded space rows. Built-ins are state_icon, state_text, workspace, branch, and git_status. |
| 272 | +# Custom values reported through workspace metadata use a $name token, for example $jj_status. |
| 273 | +# Inline token styles accept strict #RGB/#RRGGBB foregrounds plus bold and dim booleans. |
| 274 | +# [ui.sidebar.spaces] |
| 275 | +# Blank rows between space entries. Set to 1 to restore the previous spacing. |
| 276 | +# row_gap = 0 |
| 277 | +# rows = [["state_icon", "workspace"], ["branch", "git_status"]] |
| 278 | + |
| 279 | +# Accent color for highlights, borders, and navigation UI. |
| 280 | +# Accepts: hex (#89b4fa), named colors (cyan, blue, magenta), or rgb(r,g,b) |
| 281 | +# accent = "cyan" |
| 282 | + |
| 283 | +# Background notification popup delivery |
| 284 | +[ui.toast] |
| 285 | +# off = disable pop-up notifications |
| 286 | +# herdr = show in-app toasts |
| 287 | +# terminal = ask the outer terminal to show a desktop notification |
| 288 | +# system = ask the OS notification service directly |
| 289 | +# delivery = "off" |
| 290 | +# delay_seconds = 1 |
| 291 | + |
| 292 | +[ui.toast.herdr] |
| 293 | +# position = "bottom-right" |
| 294 | + |
| 295 | +[ui.toast.clipboard] |
| 296 | +# enabled = true |
| 297 | +# position = "bottom-center" |
| 298 | + |
| 299 | +# Play sounds when agents change state in background workspaces |
| 300 | +[ui.sound] |
| 301 | +# enabled = true |
| 302 | +# Optional custom mp3 sound files. Relative paths are resolved from this config file's directory. |
| 303 | +# path = "sounds/notification.mp3" # one mp3 file for all sound notifications |
| 304 | +# done_path = "sounds/done.mp3" # overrides only finished notifications |
| 305 | +# request_path = "sounds/request.mp3" # overrides only needs-attention notifications |
| 306 | + |
| 307 | +# Per-agent overrides: default | on | off |
| 308 | +# By default, droid is muted. |
| 309 | +# [ui.sound.agents] |
| 310 | +# droid = "off" |
| 311 | + |
| 312 | +[session] |
| 313 | +# Resume supported AI-agent panes into their native conversation sessions after |
| 314 | +# a Herdr server restart. Requires official integrations that report session refs. |
| 315 | +# resume_agents_on_restore = true |
| 316 | + |
| 317 | +[remote] |
| 318 | +# Whether herdr manages the ssh config used for `herdr --remote`. |
| 319 | +# When true (default), herdr runs remote ssh through a generated config that |
| 320 | +# includes your ~/.ssh/config first and adds ServerAliveInterval/ |
| 321 | +# ServerAliveCountMax as fallbacks (so any keepalive values you set yourself |
| 322 | +# still win) to survive idle network/NAT timeouts. Herdr also uses a private |
| 323 | +# per-attach OpenSSH control socket to reuse the first authenticated connection. |
| 324 | +# Set false to run plain ssh against your ssh config unchanged — this does not |
| 325 | +# force keepalive or multiplexing off, it only stops herdr from adding its own. |
| 326 | +# manage_ssh_config = true |
| 327 | + |
| 328 | +[experimental] |
| 329 | +# Allow launching herdr from inside a herdr-managed pane. |
| 330 | +# allow_nested = false |
| 331 | +# Experimental local Kitty graphics rendering for attached clients. |
| 332 | +# Requires a Kitty graphics-compatible outer terminal. |
| 333 | +# kitty_graphics = false |
| 334 | +# Save recent pane screen history across full server restarts. |
| 335 | +pane_history = false |
| 336 | +# While prefix mode is active, temporarily switch the host input source to |
| 337 | +# an ASCII-capable mode so prefix commands register even when an IME is |
| 338 | +# active, then restore the previous input source when prefix mode exits. On |
| 339 | +# macOS this selects the ASCII-capable keyboard layout; on Windows it toggles |
| 340 | +# a Korean IME between Hangul and English (other IME languages are left |
| 341 | +# unchanged). macOS and Windows only; best-effort. Default: false. |
| 342 | +# switch_ascii_input_source_in_prefix = false |
| 343 | +# Expose the focused pane's cursor to the outer terminal so macOS input |
| 344 | +# methods keep tracking the candidate window when TUIs paint their own |
| 345 | +# cursor (Claude Code, pi, codex). Trade-off: extra cursor visible for |
| 346 | +# apps that hide it without painting a replacement (vim normal mode, etc.). |
| 347 | +# reveal_hidden_cursor_for_cjk_ime = false |
| 348 | +# Optional allow-list: only reveal for focused panes whose detected agent |
| 349 | +# matches one of these names. Empty means apply to any focused pane. |
| 350 | +# If the list contains no valid names, the reveal does not apply. |
| 351 | +# Accepted: pi, claude, codex, gemini, cursor, devin, cline, opencode, |
| 352 | +# copilot, kimi, kiro, droid, amp, grok, hermes, kilo, qodercli, qoder, qwen, |
| 353 | +# qwen-code, maki. |
| 354 | +# cjk_ime_agents = [] |
| 355 | +# Cursor shape rendered when reveal_hidden_cursor_for_cjk_ime is true. |
| 356 | +# Values: block, steady_block (default), underline, steady_underline, bar, steady_bar. |
| 357 | +# cjk_ime_cursor_shape = "steady_block" |
| 358 | + |
| 359 | +[advanced] |
| 360 | +# Maximum scrollback buffer size in bytes retained per pane terminal. |
| 361 | +# Matches Ghostty's default scrollback-limit behavior. |
| 362 | +# scrollback_limit_bytes = 10000000 |
0 commit comments