The default file is ~/.config/vibeke/config.toml. Set VIBEKE_CONFIG to use another file.
Vibeke reloads the file after a change. If parsing fails, it keeps the previous configuration. Unknown keys produce warnings.
vibeke --default-config prints the template below. Each setting shows its default value. Settings marked for new panes do not change existing panes.
## Vibeke configuration — ~/.config/vibeke/config.toml (override with VIBEKE_CONFIG).
## Each setting shows its default. Remove the comment marker to change it.
## Unknown keys produce warnings. If parsing fails, Vibeke keeps the previous configuration.
## Sizes: "200MiB", "8G". Durations: "30m", "14d". Port ranges: "20000-29999".
## Show the setup guide on the next start.
## onboarding = false
## [config]
## Reload automatically when this file changes.
## watch = true
## [theme]
## Built-ins: catppuccin, catppuccin-latte, terminal, tokyo-night, dracula, nord, gruvbox,
## one-dark, solarized, kanagawa, rose-pine, vesper, plus any themes/*.toml.
## mode = "auto" # auto (follow the host terminal's light/dark) | light | dark
## name = "catppuccin"
## auto_switch = true
## dark_name = "catppuccin"
## light_name = "catppuccin-latte"
## Token overrides: panel_bg, fg, muted, accent, red, yellow, green, blue, border, selection…
## [theme.custom]
## accent = "#f5c2e7"
## Default pane palette overrides: ansi0..ansi15, fg, bg, cursor.
## [theme.pane]
## bg = "reset"
## [terminal]
## default_shell = "" # "" -> $SHELL -> /bin/sh
## shell_mode = "auto" # auto | login | non_login
## new_cwd = "follow" # follow | home | current | <path>
## term = "xterm-256color"
## scrollback_lines = 10000
## archive_scrollback = true
## archive_styles = false
## archive_max_per_pane = "200MiB"
## archive_days = 30
## grapheme_width = "auto" # auto | unicode | legacy
## allow_passthrough = false
## Override incorrect host reports. Example: host_overrides = { kitty_graphics = false }
## host_overrides = {}
## Additional environment variables for each pane.
## [terminal.env]
## EDITOR = "nvim"
## [clipboard]
## osc52_write = "allow" # allow | deny
## osc52_read = "deny" # deny | ask | allow
## copy_on_select = true # a mouse selection is copied on release (false: stays in copy mode for y)
## primary_selection = false
## mouse_select_in_apps = "modifier" # modifier (shift/alt+drag selects over mouse-reporting apps) | always (every drag selects. Apps receive clicks and wheel events)
## remote_write = "ask_once" # ask_once | allow | deny
## remote_write_max_bytes = "1MiB" # larger OSC 52 writes are dropped
## remote_write_min_interval = "5s" # per-pane gap between clipboard prompts
## [paste]
## translate = "paths_only" # paths_only | embedded (upload automatically) | ask (confirm first) | off
## max_auto_bytes = "50MiB"
## inbox_retention = "2w"
## [keys]
## prefix = "ctrl+b"
## prefix_timeout_ms = 1500
## prefix_passthrough = true
## altgr_mode = "auto" # auto | text | chord
## shift_enter_legacy = "cr" # cr | lf
## Action bindings. "prefix+x" needs the prefix. A chord without it is a direct binding.
## "" unbinds. Ranges: "prefix+1..9".
## help = "prefix+?"
## settings = "prefix+s"
## detach = "prefix+q"
## reload_config = "prefix+shift+r"
## open_notification_target = "prefix+o"
## cancel_transfer = "prefix+shift+c"
## review_clipboard = "prefix+y"
## workspace_picker = "prefix+w"
## goto = "prefix+g"
## new_workspace = "prefix+shift+n"
## new_worktree = "prefix+shift+g"
## open_worktree = ""
## remove_worktree = ""
## rename_workspace = "prefix+shift+w"
## close_workspace = "prefix+shift+d"
## previous_workspace = ""
## next_workspace = ""
## previous_agent = ""
## next_agent = ""
## focus_agent = ""
## switch_workspace = ""
## new_tab = "prefix+c"
## rename_tab = "prefix+shift+t"
## previous_tab = "prefix+p"
## next_tab = "prefix+n"
## switch_tab = "prefix+1..9"
## close_tab = "prefix+shift+x"
## rename_pane = "prefix+shift+p"
## remote_image_paste = "ctrl+v"
## split_vertical = "prefix+v"
## split_horizontal = "prefix+minus"
## close_pane = "prefix+x"
## zoom = "prefix+z"
## resize_mode = "prefix+r"
## toggle_sidebar = "prefix+b"
## 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 = ""
## edit_scrollback = "prefix+e"
## enter_copy_mode = "prefix+["
## paste_buffer = "prefix+]"
## command_palette = "prefix+:"
## search_scrollback = "prefix+/"
## next_attention = "prefix+a"
## next_attention_focus = "prefix+shift+a"
## inbox = "prefix+i"
## mark_unread = "prefix+u"
## pin_pane = "prefix+alt+p"
## float_new = "prefix+f"
## toggle_floats = "prefix+shift+f"
## sync_input = "prefix+shift+s"
## new_task = "prefix+shift+k"
## preview_list = "prefix+shift+o"
## last_workspace = "prefix+shift+l" # toggle to the previously focused workspace
## url_hints = "prefix+shift+u" # label URLs/IDs in the focused pane: open or copy
## [keys.copy_mode]
## mode = "vi" # vi | emacs
## per-key overrides (key = "action", "" unbinds), e.g. y = "copy", "ctrl+e" = "edit_scrollback".
## Actions: exit cancel left right up down half_page_up half_page_down page_up page_down
## line_start line_end top bottom view_top view_middle view_bottom word_next word_prev word_end
## select_char select_line select_block search_forward search_backward search_next search_prev
## copy edit_scrollback prompt_prev prompt_next select_output
## Mode-local keymaps: [keys.navigate], [keys.resize], [keys.card].
## Custom commands (type = shell | pane | popup | float. Other fields: cwd, env, title, when):
## [[keys.command]]
## key = "prefix+alt+g"
## type = "popup"
## command = "lazygit"
## width = "80%"
## height = "80%"
## [ui]
## interaction_overlay = "unfocused" # off | unfocused | always
## max_fps = 120
## background_animation_fps = 4
## animate = true
## focus_follows_mouse = false
## focus_follows_mouse_delay_ms = 120
## confirm_close = "running" # running | always | never
## marked_unread_clears_on_focus = false
## title_sync = true # set the outer terminal title (OSC 2)
## title_format = "{workspace} · {pane}" # also {tab}, {machine}, {session}
## [ui.sidebar]
## attention_section = true
## position = "left" # left | right
## width = 28
## min_width = 18
## max_width = 48
## auto_width = true
## collapsed = false
## show_shell_panes = false
## nest_tasks = true
## preview_thumbnails = false # tiny latest-screenshot thumbnail per preview row (kitty graphics)
## show_state_source = "inferred-only" # inferred-only | always | never
## [ui.sidebar.isolation_glyphs]
## host = ""
## sandbox = "sb"
## container = "ct"
## vm = "vm"
## Token rules: match by harness, state or regex, then rename, recolor, or hide.
## [[ui.sidebar.token]]
## match = { harness = "codex" }
## label = "cx"
## [ui.tabs]
## position = "top" # top | bottom | hidden
## show_numbers = true
## [ui.status_bar]
## enabled = false
## position = "bottom" # top | bottom
## left = ["machine", "task", "branch"]
## center = ["attention"]
## right = ["agents_summary", "clock"]
## [ui.sync_input]
## include_agents = false
## [ui.interactions]
## batch = true
## [ui.fleet]
## tile_view = "terminal" # terminal | timeline
## [notifications]
## channel = "native" # native | osc | both | none
## sound = "default" # default | none | <path>
## suppress_when_focused = true
## coalesce_ms = 3000
## quiet_hours = "" # "22:00-07:00"
## channels = [] # toast | native | osc | sound | bell. [] uses `channel`
## [notifications.on]
## needs_approval = true
## needs_answer = true
## done = true
## error = true
## bell = false
## osc = true
## remote_disconnected = true
## [agents]
## auto_detect = true
## shims = true
## resume_on_restart = "ask" # ask | always | never
## name_from_task = true
## [agents.harness.claude]
## enabled = true
## integration = "hooks" # hooks | stream-json | screen
## extra_args = []
## [agents.harness.pi]
## integration = "extension" # extension | rpc | screen
## [agents.harness.codex]
## shim = true
## headless_shared = false
## Policy rules (the first matching rule applies. See the policy documentation):
## [[policy.rule]]
## match = { tool = "Bash", command_regex = '^(pnpm|npm) (test|run lint)( |$)' }
## effect = "allow"
## [tasks]
## root = "~/.vibeke/worktrees" # or "sibling" -> ../<repo>-<slug>
## vcs = "auto" # auto | git
## checkout = "auto" # auto | worktree | clone | none
## branch_template = "{user}/{slug}"
## fetch_before_create = true
## default_agent = "claude"
## port_pool = "20000-29999"
## port_block = 10
## setup_script = ".vibeke/setup.sh"
## copy_files = [".env", ".env.local"]
## [tasks.cleanup]
## on_finish = "keep" # keep | archive | remove
## stale_after = "2w"
## auto_gc = false
## protect_dirty = true
## [tasks.best_of_n]
## suffix = ""
## Per-repo overrides of the repo's .vibeke/task.toml, keyed by origin URL or repo path.
## The same tables as task.toml; commands set here run without the repo-trust prompt.
## [tasks.repos."github.com/acme/app"]
## files = { clone = ["node_modules"] }
## deps = { strategy = "auto" }
## setup = { run = ["pnpm db:migrate"], timeout = "10m" }
## env = { DATABASE_URL = "postgres://localhost:5432/app_{slug_underscored}" }
## [remote]
## input_when_offline = "drop" # drop | ask
## predictive_echo = "auto" # auto | always | never
## Saved machines:
## [[remote.machine]]
## label = "devbox"
## address = "me@devbox.tailnet"
## transport = "ssh"
## keybindings = "local" # local | server
## auto_connect = true
## auto_upgrade = false
## bootstrap = "push" # push | remote-download
## [pane]
## size_policy = "latest" # latest | smallest | pinned
## [render]
## max_unacked = 2
## [compat]
## herdr_env = true
## herdr_socket = false
## [compat.herdr] # Herdr-compatible socket (M5, partial): $RUNTIME/<session>/herdr-compat/herdr.sock
## enabled = false
## [update]
## channel = "stable" # stable | preview
## version_check = true
## manifest_check = true
## Named layouts for `vibeke layout apply <name>` / `workspace create --layout <name>` (07 §2.14):
## [layouts.dev]
## cwd = "~/code/app"
## [[layouts.dev.tab]]
## title = "edit"
## pane = { split = "right", children = [{ run = "nvim ." }, { run = "npm run dev" }] }
## Sections owned by other components and documented with them:
## [collision], [isolation], [preview], [security], [plugins]