317 lines
13 KiB
TOML
317 lines
13 KiB
TOML
# herdr configuration
|
|
# Place this file at ~/.config/herdr/config.toml
|
|
|
|
# Show first-run notification setup on startup.
|
|
# Missing also shows onboarding; set false after you've chosen.
|
|
# onboarding = true
|
|
|
|
[theme]
|
|
# Built-in themes: catppuccin, terminal, tokyo-night, dracula, nord,
|
|
# gruvbox, one-dark, solarized, kanagawa, rose-pine,
|
|
# vesper
|
|
name = "catppuccin"
|
|
|
|
# Follow host terminal light/dark appearance and switch Herdr UI themes.
|
|
# Existing manual behavior is unchanged unless this is true.
|
|
# auto_switch = false
|
|
# dark_name = "catppuccin"
|
|
# light_name = "catppuccin-latte"
|
|
|
|
# Override individual color tokens on top of the base theme.
|
|
# Accepts: hex (#rrggbb), named colors, rgb(r,g,b), or panel_bg = "reset"
|
|
# [theme.custom]
|
|
# panel_bg = "reset"
|
|
# accent = "#f5c2e7"
|
|
# red = "#ff6188"
|
|
# green = "#a6e3a1"
|
|
|
|
auto_switch = false
|
|
[terminal]
|
|
# Executable used for new interactive panes.
|
|
# Empty means $SHELL, then /bin/sh.
|
|
# default_shell = ""
|
|
|
|
# Startup mode for new interactive pane shells: "auto", "login", or "non_login".
|
|
# "auto" uses login shells on macOS and keeps the current behavior elsewhere.
|
|
# shell_mode = "auto"
|
|
|
|
# CWD policy for new panes, tabs, and workspaces when no explicit --cwd is provided.
|
|
# Use "follow" to inherit the source pane/workspace, "home" for $HOME,
|
|
# "current" for Herdr's process directory, or a fixed path such as "~/Projects".
|
|
# new_cwd = "follow"
|
|
|
|
[update]
|
|
# Update channel used by background version checks and `herdr update`.
|
|
# Defaults to "stable" on Linux/macOS and "preview" on Windows.
|
|
# Set explicitly to choose stable releases or opt-in preview builds.
|
|
# channel = "stable"
|
|
|
|
# Check herdr.dev for new Herdr versions in the background.
|
|
# version_check = true
|
|
|
|
# Check herdr.dev for remote agent-detection manifest updates in the background.
|
|
# manifest_check = true
|
|
|
|
[keys]
|
|
# Prefix key to enter prefix mode (default: "ctrl+b")
|
|
# Examples: "ctrl+b", "f12", "esc", "-"
|
|
# Action bindings use explicit syntax: "prefix+n" requires the prefix;
|
|
# "ctrl+alt+n" is a direct terminal-mode shortcut.
|
|
# Accepted key syntax: plain keys, ctrl/shift/alt/cmd/super modifiers, and special keys like enter/tab/esc/left/right/up/down.
|
|
# Named punctuation such as minus, comma, ampersand, plus, and backtick is also accepted.
|
|
# Most reliable direct bindings are ctrl+letter, function keys, and explicit modified chords.
|
|
# alt+..., cmd/super, and punctuation-with-modifiers may depend on your terminal/tmux setup.
|
|
prefix = "ctrl+space"
|
|
|
|
# Prefix-mode actions
|
|
# help = "prefix+?"
|
|
# settings = "prefix+s"
|
|
# detach = "prefix+q"
|
|
# reload_config = "prefix+shift+r"
|
|
# open_notification_target = "prefix+o"
|
|
# workspace_picker = "prefix+w"
|
|
# goto = "prefix+g"
|
|
# new_workspace = "prefix+shift+n"
|
|
# new_worktree = "prefix+shift+g"
|
|
# open_worktree = "" # optional, unset by default
|
|
# remove_worktree = "" # optional, unset by default; opens confirmation
|
|
# rename_workspace = "prefix+shift+w"
|
|
# close_workspace = "prefix+shift+d"
|
|
# previous_workspace = "" # optional, unset by default
|
|
# next_workspace = "" # optional, unset by default
|
|
# previous_agent = "" # optional, unset by default
|
|
# next_agent = "" # optional, unset by default
|
|
# focus_agent = "" # optional indexed binding, e.g. "prefix+alt+1..9"
|
|
# remote_image_paste = "ctrl+v" # only active in herdr --remote; empty disables raw-key image paste
|
|
# new_tab = "prefix+c"
|
|
# rename_tab = "prefix+shift+t"
|
|
# previous_tab = "prefix+p"
|
|
# next_tab = "prefix+n"
|
|
# switch_tab = "prefix+1..9"
|
|
# switch_workspace = "" # optional indexed binding, e.g. "prefix+shift+1..9"
|
|
# close_tab = "prefix+shift+x"
|
|
# rename_pane = "prefix+shift+p"
|
|
# edit_scrollback = "prefix+e"
|
|
# focus_pane_left = "prefix+h"
|
|
# focus_pane_down = "prefix+j"
|
|
# focus_pane_up = "prefix+k"
|
|
# focus_pane_right = "prefix+l"
|
|
# cycle_pane_next = "prefix+tab"
|
|
# cycle_pane_previous = "prefix+shift+tab"
|
|
# last_pane = "" # optional, unset by default; bind e.g. "prefix+tab" for global back-and-forth
|
|
# split_vertical = "prefix+v"
|
|
# split_horizontal = "prefix+minus"
|
|
# close_pane = "prefix+x"
|
|
# zoom = "prefix+z" # legacy alias: fullscreen
|
|
# resize_mode = "prefix+r"
|
|
# toggle_sidebar = "prefix+b"
|
|
|
|
# Navigate-mode movement. These local shortcuts win while navigate mode is open.
|
|
# They are independent from focus_pane_*. Do not include prefix+, esc, enter, tab, or 1..9 here.
|
|
# navigate_workspace_up = "up"
|
|
# navigate_workspace_down = "down"
|
|
# navigate_pane_left = "h" # left arrow always focuses the pane to the left
|
|
# navigate_pane_down = "j"
|
|
# navigate_pane_up = "k"
|
|
# navigate_pane_right = "l" # right arrow always focuses the pane to the right
|
|
|
|
# Custom commands use the same binding syntax.
|
|
# type = "shell" runs detached in the background.
|
|
# type = "pane" opens a temporary pane and closes it when the command exits.
|
|
# type = "popup" opens a session-modal terminal without changing the tab layout.
|
|
# Popup width and height accept terminal cells or percentages such as "80%".
|
|
# On Windows, command strings run through cmd.exe /d /c.
|
|
# [[keys.command]]
|
|
# key = "prefix+alt+g"
|
|
# type = "popup"
|
|
# command = "lazygit"
|
|
# width = "80%"
|
|
# height = "80%"
|
|
|
|
# Legacy indexed shortcut config is still parsed for compatibility.
|
|
# Prefer switch_tab, switch_workspace, and focus_agent for new configs.
|
|
# [keys.indexed]
|
|
# tabs = "" # e.g. "ctrl" makes ctrl+1..9 switch tabs directly
|
|
# workspaces = "" # e.g. "ctrl+shift" makes ctrl+shift+1..9 switch workspaces directly
|
|
# agents = "" # e.g. "alt" makes alt+1..9 focus agent rows directly
|
|
|
|
# [worktrees]
|
|
# directory = "~/.herdr/worktrees"
|
|
|
|
[ui]
|
|
# Sidebar width (auto-scaled based on workspace names, this sets the default)
|
|
# sidebar_width = 26
|
|
|
|
# Minimum sidebar width when expanded (columns)
|
|
# sidebar_min_width = 18
|
|
|
|
# Maximum sidebar width when expanded (columns)
|
|
# sidebar_max_width = 36
|
|
|
|
# Start with the sidebar collapsed. Changes take effect on the next launch.
|
|
# sidebar_start_collapsed = false
|
|
|
|
# Collapsed sidebar presentation: "compact" keeps the narrow status rail, "hidden" uses zero width.
|
|
# sidebar_collapsed_mode = "compact"
|
|
|
|
# Terminal width at or below which Herdr uses the mobile single-column layout.
|
|
# Increase this for foldables, tablets, or wide phone terminals.
|
|
# mobile_width_threshold = 64
|
|
|
|
# Capture mouse input for Herdr's mouse UI.
|
|
# Set false to let the terminal handle normal clicks, such as Cmd-clicking URLs.
|
|
# Pane apps like lazygit and btop can still receive mouse when they request it.
|
|
mouse_capture = true
|
|
|
|
# Automatically copy text selected by mouse drag.
|
|
# Set false to keep drag selection visible without copying; double-click still copies a word.
|
|
copy_on_select = true
|
|
|
|
# Host cursor policy: "auto", "native", or "drawn".
|
|
# "auto" draws Herdr's own cursor on native Windows builds and WSL to avoid ConPTY cursor flicker, and uses the native terminal cursor elsewhere.
|
|
# "native" always uses the outer terminal cursor. "drawn" always draws Herdr's cursor as terminal cell content.
|
|
# host_cursor = "auto"
|
|
|
|
# Optional modifier that forwards right-click hold/drag gestures to pane apps instead of opening Herdr's pane menu.
|
|
# Empty/off disables this. Shift is intentionally unsupported because terminals commonly reserve Shift+mouse.
|
|
right_click_passthrough_modifier = "ctrl+alt"
|
|
|
|
# Force a full redraw when the outer terminal regains focus.
|
|
# Set false to reduce visible flashing when switching back to Herdr.
|
|
# Trade-off: rare host terminal surface corruption may persist until the next full redraw.
|
|
# redraw_on_focus_gained = true
|
|
|
|
# Pane scrollback lines to scroll per mouse wheel notch.
|
|
# mouse_scroll_lines = 3
|
|
|
|
# Ask for confirmation before closing a workspace
|
|
# confirm_close = true
|
|
|
|
# Ask for a tab name before creating a new tab.
|
|
# Set false to create tabs immediately with generated names.
|
|
prompt_new_tab_name = false
|
|
|
|
# Ask for a workspace name before interactive creation.
|
|
# prompt_new_workspace_name = false
|
|
|
|
# Draw borders around split panes.
|
|
pane_borders = true
|
|
|
|
# Keep split panes visually separated instead of sharing divider borders.
|
|
pane_gaps = true
|
|
|
|
# Show detected/reported agent labels in split pane borders when no manual pane name is set.
|
|
# show_agent_labels_on_pane_borders = false
|
|
|
|
# Hide the tab row when a workspace has exactly one tab.
|
|
# New tabs can still be created with the configured keybinding.
|
|
# hide_tab_bar_when_single_tab = false
|
|
|
|
# Agent panel ordering: "spaces" (grouped by space) or "priority" (attention queue).
|
|
# "workspaces" is accepted as an alias for "spaces".
|
|
# agent_panel_sort = "spaces"
|
|
|
|
# Expanded agent rows. Built-ins are state_icon, state_text, workspace, tab, pane, agent,
|
|
# terminal_title, and terminal_title_stripped.
|
|
# Custom values reported through pane metadata use a $name token.
|
|
# A token occurrence may be styled with { token = "workspace", fg = "#89b4fa", bold = true, dim = false }.
|
|
# Omitted style fields preserve the contextual default.
|
|
# [ui.sidebar.agents]
|
|
# Blank rows between agent entries. Set to 1 to restore the previous spacing.
|
|
# row_gap = 0
|
|
# rows = [["state_icon", "workspace", "tab"], ["agent"]]
|
|
# Optional canonical agent IDs replace the default rows for matching agents.
|
|
# [ui.sidebar.agents.rows_by_agent]
|
|
# claude = [["state_icon", "workspace", "tab"], ["terminal_title_stripped"], ["agent"]]
|
|
|
|
# Expanded space rows. Built-ins are state_icon, state_text, workspace, branch, and git_status.
|
|
# Custom values reported through workspace metadata use a $name token, for example $jj_status.
|
|
# Inline token styles accept strict #RGB/#RRGGBB foregrounds plus bold and dim booleans.
|
|
# [ui.sidebar.spaces]
|
|
# Blank rows between space entries. Set to 1 to restore the previous spacing.
|
|
# row_gap = 0
|
|
# rows = [["state_icon", "workspace"], ["branch", "git_status"]]
|
|
|
|
# Accent color for highlights, borders, and navigation UI.
|
|
# Accepts: hex (#89b4fa), named colors (cyan, blue, magenta), or rgb(r,g,b)
|
|
# accent = "cyan"
|
|
|
|
# Background notification popup delivery
|
|
agent_panel_sort = "spaces"
|
|
[ui.toast]
|
|
# off = disable pop-up notifications
|
|
# herdr = show in-app toasts
|
|
# terminal = ask the outer terminal to show a desktop notification
|
|
# system = ask the OS notification service directly
|
|
# delivery = "off"
|
|
# delay_seconds = 1
|
|
|
|
[ui.toast.herdr]
|
|
position = "top-right"
|
|
|
|
[ui.toast.clipboard]
|
|
enabled = true
|
|
position = "top-center"
|
|
|
|
# Play sounds when agents change state in background workspaces
|
|
[ui.sound]
|
|
# enabled = true
|
|
# Optional custom mp3 sound files. Relative paths are resolved from this config file's directory.
|
|
# path = "sounds/notification.mp3" # one mp3 file for all sound notifications
|
|
# done_path = "sounds/done.mp3" # overrides only finished notifications
|
|
# request_path = "sounds/request.mp3" # overrides only needs-attention notifications
|
|
|
|
# Per-agent overrides: default | on | off
|
|
# By default, droid is muted.
|
|
# [ui.sound.agents]
|
|
# droid = "off"
|
|
|
|
[session]
|
|
# Resume supported AI-agent panes into their native conversation sessions after
|
|
# a Herdr server restart. Requires official integrations that report session refs.
|
|
# resume_agents_on_restore = true
|
|
|
|
[remote]
|
|
# Whether herdr manages the ssh config used for `herdr --remote`.
|
|
# When true (default), herdr runs remote ssh through a generated config that
|
|
# includes your ~/.ssh/config first and adds ServerAliveInterval/
|
|
# ServerAliveCountMax as fallbacks (so any keepalive values you set yourself
|
|
# still win) to survive idle network/NAT timeouts. Herdr also uses a private
|
|
# per-attach OpenSSH control socket to reuse the first authenticated connection.
|
|
# Set false to run plain ssh against your ssh config unchanged — this does not
|
|
# force keepalive or multiplexing off, it only stops herdr from adding its own.
|
|
manage_ssh_config = true
|
|
|
|
[experimental]
|
|
# Allow launching herdr from inside a herdr-managed pane.
|
|
allow_nested = true
|
|
# Experimental local Kitty graphics rendering for attached clients.
|
|
# Requires a Kitty graphics-compatible outer terminal.
|
|
kitty_graphics = true
|
|
# Save recent pane screen history across full server restarts.
|
|
pane_history = false
|
|
# While prefix mode is active, temporarily switch the macOS host input
|
|
# source to an ASCII-capable keyboard layout so prefix commands register
|
|
# even when a CJK IME is active, then restore the previous input source
|
|
# when prefix mode exits. macOS only; best-effort. Default: false.
|
|
# switch_ascii_input_source_in_prefix = false
|
|
# Expose the focused pane's cursor to the outer terminal so macOS input
|
|
# methods keep tracking the candidate window when TUIs paint their own
|
|
# cursor (Claude Code, pi, codex). Trade-off: extra cursor visible for
|
|
# apps that hide it without painting a replacement (vim normal mode, etc.).
|
|
# reveal_hidden_cursor_for_cjk_ime = false
|
|
# Optional allow-list: only reveal for focused panes whose detected agent
|
|
# matches one of these names. Empty means apply to any focused pane.
|
|
# If the list contains no valid names, the reveal does not apply.
|
|
# Accepted: pi, claude, codex, gemini, cursor, devin, cline, opencode,
|
|
# copilot, kimi, kiro, droid, amp, grok, hermes, kilo, qodercli, qoder.
|
|
# cjk_ime_agents = []
|
|
# Cursor shape rendered when reveal_hidden_cursor_for_cjk_ime is true.
|
|
# Values: block, steady_block (default), underline, steady_underline, bar, steady_bar.
|
|
# cjk_ime_cursor_shape = "steady_block"
|
|
|
|
[advanced]
|
|
# Maximum scrollback buffer size in bytes retained per pane terminal.
|
|
# Matches Ghostty's default scrollback-limit behavior.
|
|
# scrollback_limit_bytes = 10000000
|