docs/reference

Configuration

The complete configuration, generated from code.

The build generates this reference from the source. Automated checks detect differences.

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]
View page source Documentation from this build