paneflow.json es un archivo JSON por usuario. Todas las claves son
opcionales, y {} es una configuración válida. El loader Rust y los
resolvers de runtime son la fuente del comportamiento; el JSON Schema
publicado refleja las claves públicas para validación de editor y
autocompletado.
Las claves top-level desconocidas se ignoran en runtime, pero el schema las marca en los editores. Un guardado válido se recarga con el watcher de configuración. Durante hot reload, un JSON inválido conserva la última configuración válida en vez de difundir defaults. En arranque, un archivo inválido cae a defaults y registra un warning.
File locations
| Platform | Path |
|---|---|
| Linux y macOS | ~/.paneflow/paneflow.json |
| Windows | %USERPROFILE%\.paneflow\paneflow.json |
PANEFLOW_HOME mueve todo el directorio (configuración, sesión, worktrees,
caché, binarios auxiliares). La configuración encontrada en las ubicaciones
anteriores (~/.config/paneflow, ~/Library/Application Support/paneflow,
%APPDATA%\paneflow) se copia en ~/.paneflow en el primer arranque.
Editor schema
Add this at the top of the file for autocomplete in VS Code, Zed, JetBrains IDEs, Helix, and other JSON Schema-aware editors:
{
"$schema": "https://github.com/arthjean/paneflow/raw/main/schemas/paneflow.schema.json",
"$schemaVersion": "1.0.0"
}Top-level keys
| Key | Type | Default | Applied | Notes |
|---|---|---|---|---|
$schema | string | none | Editor only | Points editors to the published schema. Ignored by Paneflow. |
$schemaVersion | string | 1.0.0 | Startup/reload | Unknown versions warn but do not block loading. |
default_shell | string/null | Platform shell fallback | New terminal | Unix: configured -> $SHELL -> /bin/sh. Windows: configured -> pwsh.exe -> powershell.exe -> %ComSpec% -> C:\Windows\System32\cmd.exe -> cmd.exe. |
theme | string/null | Paneflow Dark | Hot reload | The light or dark variant of one preset: Paneflow, Vercel, Claude, Cursor, Tailwind. Pre-preset names (One Dark, PaneFlow Light, Vercel, Claude, Cursor) still resolve. Runtime lookup is case-insensitive. |
theme_mode | string/null | dark | Hot reload | light and dark force the matching bundled theme; system follows the OS window appearance. |
font_family | string/null | bundled JetBrainsMono Nerd Font | Hot reload cache | Accepts .PaneflowMono, JetBrainsMono NF, JetBrainsMono NFM, .PaneflowSans, embedded font names, or installed monospace families. |
font_fallbacks | string array/null | GPUI fallback stack | Hot reload cache | Ordered extra fallback families for glyphs missing from font_family. |
font_size | number/null | 13.0 | Hot reload cache | Points, valid range 8.0 to 32.0; invalid values fall back to 13.0. |
font_weight | string/null | normal | Hot reload cache | One of thin, extra_light, light, semi_light, normal, medium, semi_bold, bold, extra_bold, black, extra_black. |
line_height | number/null | 1.0 | Hot reload cache | Multiplier of the font's own line height (ascent, descent, and line gap), valid range 0.8 to 2.5. The cell is rounded to whole device pixels. |
cell_width | number/null | 1.0 | Hot reload cache | Multiplier of the font's advance, valid range 0.8 to 2.0. The cell is rounded to whole device pixels. |
unfocused_pane_opacity | number/null | 1.0 | Hot reload | Opacity of panes that do not hold focus, when a workspace has more than one pane. Range 0.15 to 1.0; 1.0 disables the dim. |
reduce_motion | boolean/null | false | Hot reload | Minimizes non-essential interface motion: hover transitions settle instantly and decorative animations render a static frame. Trackpad scrolling in a terminal moves by whole lines instead of following the gesture by the pixel. |
sidebar_show | object/null | all off | Hot reload | What a session tab row shows beyond its name: branch adds its git branch, diffstat adds its insertion and deletion counts, pr turns the branch icon into a pull-request glyph colored by the request's state when one exists, indent_guide draws a hairline under a workspace's folder icon down its tab rows. The first two read the tab's bound worktree, or its workspace's checkout when the tab is unbound; pr needs the gh CLI and answers for GitHub remotes only. Toggled from the rail's Customize Sidebar menu. |
worktrees | object/null | ver abajo | Recarga en caliente | Dónde guarda Paneflow los worktrees git que crea para las ramas y cómo los limpia: dir, auto_remove, keep_limit, for_new_branches. Settings > Worktrees edita las mismas claves. |
window_decorations | string/null | client | Startup | client draws Paneflow chrome; server delegates to the OS compositor. |
window_backdrop | string/null | auto | Startup | auto, mica, blurred, acrylic, transparent, opaque, or off. On Windows, blurred and acrylic set in the config resolve to auto; only PANEFLOW_WINDOW_BACKDROP applies blur there. PANEFLOW_WINDOW_BACKDROP overrides for one launch. |
windows_terminal_material | boolean/null | false | Window/terminal render | Windows-only terminal background material toggle. The Blended interface style sets it to true, Themed to false. Ignored on other platforms. |
windows_chrome_material | boolean/null | false | Window/chrome render | Windows-only native material in the primary navigation card. The Blended interface style sets it to true, Themed to false. Ignored on other platforms. |
macos_chrome_material | boolean/null | false | Window/chrome render | macOS-only native Sidebar material in the primary navigation card. The Blended interface style sets it to true, Themed to false. Ignored on other platforms. |
linux_terminal_material | boolean/null | false | Window/terminal render | Linux-only translucent terminal card over the window veil, so a compositor blur shows through. The Blended interface style sets it to true, Themed to false. Ignored on other platforms. |
linux_chrome_material | boolean/null | false | Window/chrome render | Linux-only translucent veil behind the sidebar and the title bar, so a compositor blur shows through. The Blended interface style sets it to true, Themed to false. Ignored on other platforms. |
option_as_meta | boolean/null | true on Linux and Windows, false on macOS | Hot reload | Sends Alt/Option as ESC-prefix Meta. On macOS, true makes Option plus a letter send Meta instead of composing a character; keep false when Option should type Unicode characters. A config reload applies it to open terminals. |
shell_integration | boolean/null | true | New terminal | Enables Paneflow shell snippets for OSC 7 CWD and OSC 133 command marks. |
editor | object/null | minimap apagado, scrollbar encendida | Recarga en caliente | Lo que el editor de código dibuja junto al texto: minimap añade un minimapa en el borde derecho, scrollbar conserva la barra de desplazamiento vertical. Se alterna desde el menú de controles del editor; la elección se aplica a todos los archivos abiertos. |
automation | object/null | todo apagado | Recarga en caliente | Trabajo en segundo plano tras un turno del agente: tab_auto_naming resume el intercambio reciente de la sesión en un nombre de pestaña de 2 a 5 palabras mediante la CLI del agente (claude -p, codex exec, opencode run, pi --print) sin herramientas, como máximo una vez cada tres minutos por sesión y solo si la conversación creció. Un nombre que escribiste nunca se reemplaza; "Reset name" reabre la pestaña con él. |
submit_paste_delay_ms | integer/null | 70 | IPC send | Floor delay between bracketed paste and Enter for paneflow send --submit. Range 10 to 5000. |
external_editor | string/null | auto | Next open action | Editor that opens file links, including terminal file links: auto, system, zed, cursor, windsurf, code, or visual_studio. auto uses $VISUAL, then $EDITOR, then the first known editor on PATH; system always uses the OS opener. A named editor that is not on PATH falls back to auto. |
shortcuts | object | {} | Hot reload | Maps keystrokes to action names. See shortcuts and actions. |
terminal | object/null | defaults below | Mixed | Namespaced terminal renderer and PTY settings. |
commands | array | [] | Settings/Run | Command palette entries and workspace templates. |
agent_profiles | array | [] | Recarga en caliente | Entradas de lanzamiento personalizadas que ejecutan un agente integrado con variables de entorno y argumentos extra, por ejemplo una segunda cuenta de Claude Code mediante CLAUDE_CONFIG_DIR. Settings > Agents > Profiles edita la misma lista. |
claude_code_bypass_permissions | boolean/null | false | Next Claude launch | Adds --permission-mode bypassPermissions to the Claude Code launcher. High-risk opt-in. |
ai_unrestricted | boolean/null | false | Per IPC call | Allows trusted conductors to submit to peer panes without PANEFLOW_IPC_SCRIPTING. |
ai_injection_fence | boolean/null | true | Per read call | Wraps surface.read output in an untrusted-output fence by default. |
on_quit | ask, keep, stop, null | ask | At quit | What quitting does while hosted sessions run: ask opens the quit dialog, keep leaves every session running, stop stops them all and shuts the host down. With no live session the app exits and shuts the idle host down. |
sidebar_ended_sessions | 0, 3, 5, 10, null | 5 | Next sidebar render | How many ended sessions a workspace previews in the sidebar before the rest collapse under one "N more ended sessions" row. Nothing is pruned; the cap only controls the preview. |
agent_panel | object/null | defaults below | Agents UI | Agents-view notification preferences. |
agents | object/null | defaults below | Restore and next launch | Agent conversation restore and Claude Code session-id preassignment. |
telemetry | object/null | { "enabled": null } | Startup/consent | Desktop telemetry consent. PANEFLOW_NO_TELEMETRY=1 overrides it. |
Agent launcher buttons
Each button key is boolean/null. null or omission auto-detects the
CLI binary. false hides the button. true forces it visible.
On Windows, the pane palette, the New pane menu, and the welcome screen offer
only Claude Code, Codex, Amp, Gemini, and Copilot, the runtimes that declare
Windows support, and hide agent_profiles entries based on the others. Linux
and macOS keep every agent below.
| Key | Agent |
|---|---|
claude_code_button_visible | Claude Code |
codex_button_visible | Codex |
opencode_button_visible | OpenCode |
pi_button_visible | Pi |
hermes_agent_button_visible | Hermes Agent |
grok_button_visible | Grok |
amp_button_visible | Amp |
gemini_button_visible | Gemini |
copilot_button_visible | Copilot |
factory_button_visible | Factory |
openclaw_button_visible | OpenClaw |
muse_button_visible | Muse Code |
fx_button_visible | fx (Linux and macOS) |
terminal
| Key | Type | Default | Applied | Notes |
|---|---|---|---|---|
terminal.ligatures | boolean/null | true | Hot reload cache | Enables programming ligatures when the active font supports them. |
terminal.integrated_glyphs | boolean/null | true | Hot reload | Draws built-in block glyphs as filled quads. |
terminal.color_emoji | boolean/null | true | Hot reload | Uses the platform color-emoji path. |
terminal.cursor_color | string/null | theme cursor | Hot reload/new terminal | #RRGGBB, RRGGBB, #RGB, or RGB. |
terminal.scrollbar | boolean/null | true | New terminal view | Overlay scrollbar shown while scrolling or hovering the right edge of a pane. |
terminal.scrollback_lines | integer/null | 10000 | New terminal | Range 100 to 100000. Cached terminals cap at 1000. |
terminal.cursor_shape | string/null | block | New terminal | vintage, block, beam, underline, double_underline, or hollow. |
terminal.osc52_clipboard | string/null | copy | Nueva vista de terminal | Disponible desde v0.17.5. copy permite al terminal enfocado escribir en el portapapeles del sistema mediante OSC 52; off rechaza todas las escrituras OSC 52. Las lecturas del portapapeles mediante OSC 52 siempre se rechazan. Las vistas de terminal existentes conservan su configuración hasta que se vuelven a crear. |
terminal.xt_checksum_report | boolean/null | false | Nueva sesión | Disponible desde v0.17.7. Responde a las solicitudes de checksum DECRQCRA (CSI Pi ; Pg ; Pt ; Pl ; Pb ; Pr * y), de las que dependen suites de conformidad como vttest y esctest. Desactivado por defecto porque un programa en ejecución puede calcular el checksum de la pantalla celda a celda y así volver a leer todo lo que muestra, incluida la salida de otros programas. Mientras está desactivado, XTCHECKSUM (CSI Ps # y) también se ignora. El host de sesiones lo lee cada vez que inicia una sesión. |
terminal.xt_checksum_extension | integer/null | 0 | Nueva sesión | Disponible desde v0.17.7. Cómo se calcula el checksum DECRQCRA, con los bits de XTCHECKSUM y del checksumExtension de xterm: 1 mantiene el resultado positivo, 2 omite los atributos de vídeo de las celdas, 4 cuenta los espacios en blanco, 8 cuenta como espacios las celdas nunca escritas, 16 usa puntos de código completos en lugar de valores DEC de 8 bits. 0 es el cálculo de un terminal DEC real. Rango 0 a 31. Un valor fuera de rango, como 32, -1, 1.5 o "4", solo descarta esta clave: vuelve a 0 con una advertencia que nombra la clave y el rango, y el resto del archivo se sigue aplicando, al iniciar y al recargar. Un reinicio completo (ESC c) vuelve a este valor. |
terminal.cursor_blink | string/null | terminal_controlled | New terminal | on, off, or terminal_controlled. |
terminal.env | object/null | none | New terminal | Environment variables injected into every new terminal. Per-surface env wins. Values are passed through verbatim: no ~ and no $NAME expansion, unlike agent_profiles.*.env. Keys Paneflow sets for every terminal, such as TERM, ZDOTDIR, and the PANEFLOW_* variables, are ignored and logged once. LANG defaults to en_US.UTF-8 only when LANG, LC_ALL, and LC_CTYPE are all unset. |
terminal.scroll_multiplier | number/null | 1.0 | New terminal view | Range 0.1 to 10.0. Ignored in mouse-reporting and alternate-screen scroll paths. |
terminal.minimum_contrast | number/null | Auto (60) | Hot reload | Minimum APCA lightness contrast (Lc) enforced between text and its cell background, on the colors a program chose (truecolor and palette indices 16 to 255). The theme's sixteen ANSI colors, foreground, and background are never corrected. Unset means Auto, which is 60 on every theme; 0 turns the correction off; a negative or non-numeric value means Auto. Range 0 to 90. |
agent_panel
| Key | Type | Default | Notes |
|---|---|---|---|
agent_panel.notify_when_agent_waiting | string/null | Never | PrimaryScreen, AllScreens, or Never. Also governs desktop notifications that terminal programs send with OSC 9 or OSC 777. |
agents
| Key | Type | Default | Notes |
|---|---|---|---|
agents.restore_conversations | boolean/null | true | When a pane's hosted session did not survive, for instance after a reboot, Paneflow opens a shell in the recorded folder and types the runtime's resume command for the conversation last started in that pane. Set to false to only reopen the shell. |
agents.claude_preassign_session_id | boolean/null | false | The Claude Code shim adds --session-id <uuid> to a fresh interactive claude launch, so Paneflow knows the conversation before any hook arrives. Read by panes started after the change. |
worktrees
Paneflow crea un worktree git cuando abres una rama desde la paleta "New
pane", el menú contextual de una pestaña o paneflow up. No se escribe nada dentro del checkout:
el marcador de propiedad vive en el git dir propio del worktree
(.git/worktrees/<name>/ en el repositorio principal), así que git status
sigue limpio y el marcador desaparece con el worktree. Settings > Worktrees
edita las mismas claves y lista los worktrees que Paneflow gestiona.
Dejar vacío el nombre de rama en la paleta crea un checkout detached en la base
elegida, llamado <base>-<sha7>; "Create branch here…" en el menú contextual
de la pestaña lo convierte en rama más tarde, conservando los cambios sin
commit.
Un archivo .worktreeinclude en la raíz del repositorio lista los archivos y
directorios ignorados por git que se copian en cada worktree nuevo, una ruta
por línea relativa a la raíz, # para comentarios, / final opcional en
directorios. Sin el archivo, Paneflow copia los .env* de primer nivel y
AGENTS.override.md si existen. Un archivo que ya existe en el worktree nunca
se sobrescribe.
Antes de eliminar un worktree gestionado, automáticamente o a mano, Paneflow
guarda sus cambios sin commit en un commit de snapshot bajo
refs/paneflow/snapshots/ en el repositorio principal: ediciones de archivos
rastreados, archivos nuevos y la rama actual. Settings > Worktrees lista los
snapshots; Restore recrea el worktree con esos cambios sin commit en la misma
rama, Delete descarta la ref. Un worktree limpio no deja snapshot.
| Clave | Tipo | Predeterminado | Notas |
|---|---|---|---|
worktrees.dir | string/null | ~/.paneflow/worktrees | Directorio raíz de los worktrees gestionados. Cada repositorio recibe un subdirectorio <repo>-<hash>, cada rama un directorio dentro. El valor predeterminado es ~/.paneflow/worktrees en todas las plataformas (%USERPROFILE%\.paneflow\worktrees en Windows). ~ es el directorio home. Los worktrees creados bajo una raíz anterior, incluido el antiguo vecino <repo>.worktrees/, siguen funcionando donde están. |
worktrees.auto_remove | boolean/null | true | Elimina un worktree gestionado al cerrar su workspace y recorta los más antiguos por encima de keep_limit. Los cambios sin commit se guardan antes en un snapshot, y la rama nunca se borra. false conserva cada worktree hasta que lo elimines desde Settings > Worktrees o el menú de la pestaña. |
worktrees.keep_limit | integer/null | 15 | Número de worktrees gestionados a conservar antes de eliminar los más antiguos que ninguna pestaña abierta usa. De 0 a 200. |
worktrees.for_new_branches | boolean/null | true | Estado inicial del interruptor Worktree del formulario New branch. true crea un worktree para la rama; false cambia el checkout del workspace a ella, y el pane se abre en la raíz del repositorio. El interruptor reescribe esta clave, y el cambio se rechaza mientras un agente trabaje en ese checkout. |
{
"worktrees": {
"dir": "~/worktrees",
"auto_remove": true,
"keep_limit": 15
}
}agent_profiles
agent_profiles es una lista. Cada entrada añade un elemento de lanzamiento
que ejecuta uno de los agentes integrados con variables de entorno y
argumentos extra. Los perfiles aparecen en la paleta de paneles junto a
los agentes integrados, y conservan el seguimiento de estado, los
hooks y las sesiones del agente base. Settings > Agents > Profiles
edita la misma lista.
| Clave | Tipo | Predeterminado | Notas |
|---|---|---|---|
agent_profiles.*.name | string | requerido | Etiqueta mostrada en el lanzador. |
agent_profiles.*.agent | string | requerido | Tag del agente base: claude_code, codex, opencode, pi, hermes, grok, amp, gemini, copilot, factory u openclaw. |
agent_profiles.*.env | object | {} | Variables de entorno fijadas en el proceso del agente. Un ~ inicial se expande al directorio home, y $NAME, ${NAME} o %NAME% en cualquier punto del valor toma esa variable del propio entorno de Paneflow. Un $ o % que no nombra nada queda literal; un nombre que el entorno no define es rechazado por el editor de Settings y, en una configuración escrita a mano, deja el valor completo intacto con un aviso en el log. |
agent_profiles.*.args | string array | [] | Argumentos extra añadidos tras las propias opciones del agente base. Cada token debe ser una palabra simple: letras, dígitos, -, _, ., =. |
Una entrada con un tag de agente desconocido, un nombre vacío o un token inseguro se omite con un aviso; los demás perfiles se cargan igualmente.
{
"agent_profiles": [
{
"name": "Claude perso",
"agent": "claude_code",
"env": { "CLAUDE_CONFIG_DIR": "~/.claude-perso" },
"args": ["--model", "opus"]
}
]
}commands
commands entries back both simple shell commands and Settings >
Workspaces templates. A command entry must have name; workspace and
command are mutually exclusive.
| Key | Type | Default | Notes |
|---|---|---|---|
commands[].name | string | required | Display name. Must not be blank. |
commands[].description | string/null | none | Human-readable description. |
commands[].keywords | string array | [] | Fuzzy-search keywords. |
commands[].workspace | object/null | none | Workspace template. |
commands[].command | string/null | none | Simple shell command string. |
Workspace template keys:
| Key | Type | Default | Notes |
|---|---|---|---|
commands[].workspace.name | string/null | command name | Workspace display name. |
commands[].workspace.cwd | string/null | current cwd | Default workspace directory. |
commands[].workspace.layout_preset | string/null | none | even_h, even_v, main_vertical, or tiled. |
commands[].workspace.color | string/null | none | Six-digit hex accent color, no leading #. |
commands[].workspace.layout | object/null | preset layout | Layout tree root. |
Layout keys:
| Key | Type | Notes |
|---|---|---|
commands[].workspace.layout.type | string | pane or split. |
commands[].workspace.layout.surfaces | array | Required for pane nodes. |
commands[].workspace.layout.direction | string | Required for split: horizontal or vertical. |
commands[].workspace.layout.ratio | number/null | Legacy binary split ratio, range 0.1 to 0.9. Ignored when ratios exists. |
commands[].workspace.layout.ratios | number array/null | Per-child ratios for N-ary layouts. Must match child count and sum near 1.0. |
commands[].workspace.layout.children | array | Required for split; minimum two layout nodes. |
Surface keys inside a pane:
| Key | Type | Default | Notes |
|---|---|---|---|
commands[].workspace.layout.surfaces[].surface_type | string/null | terminal | Currently only terminal surfaces render. |
commands[].workspace.layout.surfaces[].name | string/null | derived | Surface tab name. |
commands[].workspace.layout.surfaces[].custom_name | string/null | none | User-assigned name that survives restart. |
commands[].workspace.layout.surfaces[].command | string/null | shell | Command to run when the surface is created. |
commands[].workspace.layout.surfaces[].prompt | string/null | none | Prompt to prefill after launching an agent command. |
commands[].workspace.layout.surfaces[].cwd | string/null | workspace cwd | Per-surface working directory. Relative paths resolve against workspace cwd. |
commands[].workspace.layout.surfaces[].path | string/null | none | File opened by a markdown surface. Ignored by terminal surfaces. |
commands[].workspace.layout.surfaces[].env | object/null | none | Extra environment variables. Wins over terminal.env on collision. |
commands[].workspace.layout.surfaces[].focus | boolean/null | false | Gives this surface initial focus. |
commands[].workspace.layout.surfaces[].scrollback | string/null | none | Saved plain-text scrollback restored with the surface. |
commands[].workspace.layout.surfaces[].agent | string/null | none | Stable tag of the agent CLI last detected in the surface. |
commands[].workspace.layout.surfaces[].font_size | number/null | global font_size | Per-surface font-size override, range 8.0 to 32.0. |
commands[].workspace.layout.surfaces[].session | string/null | none | UUID of the persistent host session the terminal reattaches to on restore. Written by Paneflow. |
commands[].workspace.layout.surfaces[].agent_session | object/null | none | Agent conversation last started in the surface: runtime (catalog id), id (provider session id), and cwd. Paneflow reopens it when the host session did not survive. Written by Paneflow. |
telemetry
| Key | Type | Default | Notes |
|---|---|---|---|
telemetry.enabled | boolean/null | null | null means unanswered, true means opted in, false means opted out. |
Complete example
{
"$schema": "https://github.com/arthjean/paneflow/raw/main/schemas/paneflow.schema.json",
"$schemaVersion": "1.0.0",
"theme": "One Dark",
"font_family": "JetBrainsMono Nerd Font",
"font_size": 13,
"line_height": 1.0,
"cell_width": 1.0,
"windows_chrome_material": false,
"macos_chrome_material": false,
"terminal": {
"ligatures": true,
"scrollback_lines": 10000,
"cursor_shape": "block"
},
"agent_panel": {
"notify_when_agent_waiting": "PrimaryScreen"
},
"commands": [
{
"name": "API + Claude",
"description": "Open the API project with Claude and tests",
"workspace": {
"name": "API",
"cwd": "~/projects/api",
"layout_preset": "even_h",
"layout": {
"type": "pane",
"surfaces": [
{
"name": "Claude",
"agent": "claude_code",
"command": "claude",
"prompt": "Review the API changes"
}
]
}
}
}
]
}