Skip to content

paneflow.json Schema Reference

Every paneflow.json key with its type, default, apply timing, and runtime notes.

paneflow.json is a per-user JSON file. All keys are optional, and {} is a valid config. The Rust config loader and runtime resolvers are the source of behavior; the published JSON Schema mirrors the public keys for editor validation and autocomplete.

Unknown top-level keys are ignored by the runtime but flagged by the schema in editors. A valid save is reloaded by the config watcher. During hot reload, invalid JSON keeps the previous valid config instead of broadcasting defaults. Startup reads an invalid file as defaults and logs a warning.

File locations

PlatformPath
Linux~/.config/paneflow/paneflow.json
macOS~/Library/Application Support/paneflow/paneflow.json
Windows%APPDATA%\paneflow\paneflow.json

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:

paneflow.json
{
"$schema": "https://github.com/ArthurDEV44/paneflow/raw/main/schemas/paneflow.schema.json",
"$schemaVersion": "1.0.0"
}

Top-level keys

KeyTypeDefaultAppliedNotes
$schemastringnoneEditor onlyPoints editors to the published schema. Ignored by Paneflow.
$schemaVersionstring1.0.0Startup/reloadUnknown versions warn but do not block loading.
default_shellstring/nullPlatform shell fallbackNew terminalFalls back through configured executable, $SHELL, /bin/sh, then %COMSPEC% on Windows.
themestring/nullOne DarkHot reloadBuilt-ins: One Dark, PaneFlow Light. Runtime lookup is case-insensitive.
font_familystring/nullJetBrainsMono NFM if installed, else LilexHot reload cacheAccepts .PaneflowMono, .PaneflowSans, embedded font names, or installed monospace families.
font_fallbacksstring array/nullGPUI fallback stackHot reload cacheOrdered extra fallback families for glyphs missing from font_family.
font_sizenumber/null13.0Hot reload cachePoints, valid range 8.0 to 32.0; invalid values fall back to 13.0.
font_weightstring/nullnormalHot reload cacheOne of thin, extra_light, light, semi_light, normal, medium, semi_bold, bold, extra_bold, black, extra_black.
line_heightnumber/null1.2Hot reload cacheMultiplier, valid range 1.0 to 2.5; invalid values fall back to 1.2.
cell_widthnumber/null0.6Hot reload cacheMultiplier, valid range 0.3 to 2.0; invalid values fall back to 0.6.
window_decorationsstring/nullclientStartupclient draws Paneflow chrome; server delegates to the OS compositor.
window_backdropstring/nullautoStartupauto, mica, blurred, acrylic, transparent, opaque, or off. PANEFLOW_WINDOW_BACKDROP overrides for one launch.
windows_terminal_materialboolean/nullfalseWindow/terminal renderWindows-only terminal background material toggle. Ignored on other platforms.
windows_chrome_materialboolean/nullfalseWindow/chrome renderWindows-only sidebar and title-bar material toggle. Ignored on other platforms.
option_as_metaboolean/nulltrueNew terminalSends Alt/Option as ESC-prefix Meta. Set false on macOS when Option should type Unicode characters.
shell_integrationboolean/nulltrueNew terminalEnables Paneflow shell snippets for OSC 7 CWD and OSC 133 command marks.
agent_stall_detectionboolean/nulltrueRuntime sweepDetects Thinking agents with no hook activity past the threshold.
agent_stall_threshold_secsinteger/null60Runtime sweepRange 30 to 86400; checked by a 30 second sweep.
review_prefill_delay_msinteger/null2000Review launchDelay before auto-filling the review prompt into a fresh CLI. Range 250 to 10000.
submit_paste_delay_msinteger/null70IPC sendFloor delay between bracketed paste and Enter for paneflow send --submit. Range 10 to 5000.
external_editorstring/nullautoNext open actionauto, system, zed, cursor, windsurf, or code.
shortcutsobject{}Hot reloadMaps keystrokes to action names. See shortcuts and actions.
terminalobject/nulldefaults belowMixedNamespaced terminal renderer and PTY settings.
commandsarray[]Settings/RunCommand palette entries and workspace templates.
claude_code_bypass_permissionsboolean/nullfalseNext Claude launchAdds --permission-mode bypassPermissions to the Claude Code launcher. High-risk opt-in.
ai_unrestrictedboolean/nullfalsePer IPC callAllows trusted conductors to submit to peer panes without PANEFLOW_IPC_SCRIPTING. Every write is traced.
ai_injection_fenceboolean/nulltruePer read callWraps surface.read output in an untrusted-output fence by default.
rosetta_enabledboolean/nulltrueUI renderMaster switch for the in-app Rosetta card only.
rosetta_show_passiveboolean/nullfalseUI renderShows passive running-only Rosetta rows when enabled.
agent_panelobject/nulldefaults belowAgents UIAgents-view display, profiles, and notification preferences.
tool_permissionsobject{}Permission checksPer-tool always-allow and always-deny input patterns.
telemetryobject/null{ "enabled": null }Startup/consentDesktop 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.

KeyAgent
claude_code_button_visibleClaude Code
codex_button_visibleCodex
opencode_button_visibleOpenCode
pi_button_visiblePi
hermes_agent_button_visibleHermes Agent
grok_button_visibleGrok
amp_button_visibleAmp
cursor_button_visibleCursor
gemini_button_visibleGemini
kiro_button_visibleKiro
antigravity_button_visibleAntigravity
copilot_button_visibleCopilot
codebuddy_button_visibleCodeBuddy
factory_button_visibleFactory
qoder_button_visibleQoder
openclaw_button_visibleOpenClaw

terminal

KeyTypeDefaultAppliedNotes
terminal.ligaturesboolean/nullfalseHot reload cacheEnables programming ligatures when the active font supports them.
terminal.integrated_glyphsboolean/nulltrueHot reloadDraws built-in block glyphs as filled quads.
terminal.color_emojiboolean/nulltrueHot reloadUses the platform color-emoji path.
terminal.cursor_colorstring/nulltheme cursorHot reload/new terminal#RRGGBB, RRGGBB, #RGB, or RGB.
terminal.scrollback_linesinteger/null10000New terminalRange 100 to 100000. Review terminals cap at 2000; cached terminals cap at 1000.
terminal.cursor_shapestring/nullblockNew terminalvintage, block, beam, underline, double_underline, or hollow.
terminal.cursor_blinkstring/nullterminal_controlledNew terminalon, off, or terminal_controlled.
terminal.envobject/nullnoneNew terminalEnvironment variables injected into every new terminal. Per-surface env wins.
terminal.scroll_multipliernumber/null1.0New terminal viewRange 0.1 to 10.0. Ignored in mouse-reporting and alternate-screen scroll paths.

agent_panel

KeyTypeDefaultNotes
agent_panel.max_content_widthinteger/null760Chat content width in pixels. Range 320 to 4000.
agent_panel.thinking_displaystring/nullAutoAuto, Preview, AlwaysExpanded, or AlwaysCollapsed.
agent_panel.profilesobject{}Named profile map. Keys are profile names.
agent_panel.default_profilestring/nullnoneProfile selected by default when present.
agent_panel.notify_when_agent_waitingstring/nullPrimaryScreenPrimaryScreen, AllScreens, or Never.

Profile entries under agent_panel.profiles use this shape:

KeyTypeDefaultNotes
agent_panel.profiles.*.agentstring/nullnonePreferred agent tag.
agent_panel.profiles.*.modelstring/nullnonePreferred model label.
agent_panel.profiles.*.modestring/nullnonePreferred mode label.
agent_panel.profiles.*.effortstring/nullnonePreferred reasoning-effort label.
agent_panel.profiles.*.toolsstring array[]Preferred tool-kind keys shown by the profile.

tool_permissions

tool_permissions is keyed by tool kind, for example read, edit, or execute.

KeyTypeDefaultNotes
tool_permissions.*.always_allowstring array[]Substring patterns that auto-allow matching tool inputs.
tool_permissions.*.always_denystring array[]Substring patterns that auto-deny matching tool inputs.

commands

commands entries back both simple shell commands and Settings > Workspaces templates. A command entry must have name; workspace and command are mutually exclusive.

KeyTypeDefaultNotes
commands[].namestringrequiredDisplay name. Must not be blank.
commands[].descriptionstring/nullnoneHuman-readable description.
commands[].keywordsstring array[]Fuzzy-search keywords.
commands[].workspaceobject/nullnoneWorkspace template.
commands[].commandstring/nullnoneSimple shell command string.

Workspace template keys:

KeyTypeDefaultNotes
commands[].workspace.namestring/nullcommand nameWorkspace display name.
commands[].workspace.cwdstring/nullcurrent cwdDefault workspace directory.
commands[].workspace.layout_presetstring/nullnoneeven_h, even_v, main_vertical, or tiled.
commands[].workspace.colorstring/nullnoneSix-digit hex accent color, no leading #.
commands[].workspace.layoutobject/nullpreset layoutLayout tree root.

Layout keys:

KeyTypeNotes
commands[].workspace.layout.typestringpane or split.
commands[].workspace.layout.surfacesarrayRequired for pane nodes.
commands[].workspace.layout.directionstringRequired for split: horizontal or vertical.
commands[].workspace.layout.rationumber/nullLegacy binary split ratio, range 0.1 to 0.9. Ignored when ratios exists.
commands[].workspace.layout.ratiosnumber array/nullPer-child ratios for N-ary layouts. Must match child count and sum near 1.0.
commands[].workspace.layout.childrenarrayRequired for split; minimum two layout nodes.

Surface keys inside a pane:

KeyTypeDefaultNotes
commands[].workspace.layout.surfaces[].surface_typestring/nullterminalCurrently only terminal surfaces render.
commands[].workspace.layout.surfaces[].namestring/nullderivedSurface tab name.
commands[].workspace.layout.surfaces[].custom_namestring/nullnoneUser-assigned name that survives restart.
commands[].workspace.layout.surfaces[].commandstring/nullshellCommand to run when the surface is created.
commands[].workspace.layout.surfaces[].promptstring/nullnonePrompt to prefill after launching an agent command.
commands[].workspace.layout.surfaces[].cwdstring/nullworkspace cwdPer-surface working directory. Relative paths resolve against workspace cwd.
commands[].workspace.layout.surfaces[].envobject/nullnoneExtra environment variables. Wins over terminal.env on collision.
commands[].workspace.layout.surfaces[].focusboolean/nullfalseGives this surface initial focus.
commands[].workspace.layout.surfaces[].scrollbackstring/nullnoneSaved plain-text scrollback restored with the surface.
commands[].workspace.layout.surfaces[].agentstring/nullnoneStable tag of the agent CLI last detected in the surface.
commands[].workspace.layout.surfaces[].font_sizenumber/nullglobal font_sizePer-surface font-size override, range 8.0 to 32.0.

telemetry

KeyTypeDefaultNotes
telemetry.enabledboolean/nullnullnull means unanswered, true means opted in, false means opted out.

Complete example

paneflow.json
{
"$schema": "https://github.com/ArthurDEV44/paneflow/raw/main/schemas/paneflow.schema.json",
"$schemaVersion": "1.0.0",
"theme": "One Dark",
"font_family": "Lilex",
"font_size": 13,
"line_height": 1.2,
"cell_width": 0.6,
"terminal": {
  "ligatures": false,
  "scrollback_lines": 10000,
  "cursor_shape": "block"
},
"agent_panel": {
  "thinking_display": "Auto",
  "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"
          }
        ]
      }
    }
  }
]
}