Skip to content

Configuration

This is the full configuration reference. For a friendlier overview, see Settings & Customization.

Kangentic resolves settings in three layers:

  1. Built-in defaults - sensible defaults for all settings
  2. Global user config - your personal defaults for all projects
  3. Project overrides - per-repository settings

Effective config = deep-merge(defaults, global config, project config).

When you create a new project, Kangentic seeds its .kangentic/config.json with only a subset of your most recently configured project’s settings: theme, terminal.*, agent.permissionMode, and git.*. Everything else falls back to the built-in defaults. Project-specific data - notably browser.* (including browser.defaultUrl) and saved backlog import sources - is stored per-project and is never copied into a new project, so one repository’s dev-server URL or issue-tracker connections cannot leak into another.

Global: %APPDATA%/kangentic/config.json

Project: <project>/.kangentic/config.json

Project settings override global settings when both are present.

KeyTypeDefaultScopeDescription
themestring"dark"BothUI theme: dark, light, moon, forest, ocean, ember, sand, mint, sky, peach
sidebarVisiblebooleantrueGlobal onlyShow/hide the sidebar
boardLayoutstring"horizontal"Global onlyBoard scroll direction: horizontal or vertical
cardDensitystring"default"Global onlyTask card density: compact, default, or comfortable
columnWidthstring"default"Global onlyColumn width: narrow, default, or wide
terminalPanelVisiblebooleantrueGlobal onlyShow the bottom terminal panel
statusBarVisiblebooleantrueGlobal onlyShow the status bar at the bottom of the window
animationsEnabledbooleantrueGlobal onlyEnable transition animations across the UI
skipDeleteConfirmbooleanfalseGlobal onlySkip confirmation dialog on task delete
skipBoardConfigConfirmbooleanfalseGlobal onlySkip confirmation when applying board config changes
autoFocusIdleSessionbooleanfalseGlobal onlyAuto-switch to session tab when agent goes idle
skipDoneWorktreeConfirmbooleanfalseGlobal onlySkip the confirmation dialog when a task moves to Done. Written by the Done-move dialog’s “don’t ask again” checkbox (not surfaced in the Settings panel)
restoreWindowPositionbooleantrueGlobal onlyRestore window position and size from last session
statusBarPeriodstring"live"Global onlyDefault time period for usage stats: live, today, week, month, all
KeyTypeDefaultScopeDescription
backlog.prioritiesarraySee belowBothCustomizable priority levels with labels and colors
backlog.labelColorsobject{}BothDefault color mappings for backlog labels ({ "label-name": "#hex" })

Default priorities:

IndexLabelColor
0None#6b7280
1Low#3b82f6
2Medium#eab308
3High#f97316
4Urgent#ef4444
KeyTypeDefaultScopeDescription
terminal.shellstring | nullnullBothShell executable path. null = auto-detect
terminal.fontFamilystring"Menlo, Consolas, \"Courier New\", monospace"BothTerminal font family
terminal.fontSizenumber14BothTerminal font size (px)
terminal.scrollbackLinesnumber5000BothTerminal scrollback buffer size (lines)
terminal.cursorStylestring"block"BothCursor style: block, underline, or bar
terminal.showPreviewbooleanfalseGlobal onlyShow terminal preview in task cards
terminal.panelHeightnumber250Global onlyBottom panel height (px)
terminal.panelCollapsedbooleanfalseGlobal onlyPersisted collapsed state of the bottom terminal panel

Agent settings are unified across all supported agents: Claude Code, Codex CLI, Gemini CLI, Qwen Code, Kimi Code, OpenCode, Factory Droid, Cursor CLI, GitHub Copilot CLI, Aider, and Warp/Oz CLI.

KeyTypeDefaultScopeDescription
agent.permissionModestring"acceptEdits"BothDefault permission mode for spawned agents
agent.cliPathsobject{}Global onlyPer-agent CLI path overrides, keyed by agent name (claude, codex, gemini, qwen, kimi, opencode, droid, aider, cursor, copilot, warp). null = auto-detect. Example: { "claude": null, "codex": "/usr/local/bin/codex", "kimi": "/Users/me/.local/bin/kimi" }
agent.maxConcurrentSessionsnumber8Global onlyMax concurrent PTY sessions across all agents
agent.queueOverflowstring"queue"Global onlyOverflow behavior: queue or reject
agent.idleTimeoutMinutesnumber0Global onlyAuto-suspend sessions after N minutes idle. 0 = disabled
agent.autoResumeSessionsOnRestartbooleantrueGlobal onlyWhen true, agent sessions that were running at last close auto-resume when Kangentic restarts. When false, sessions stay paused and require a manual Resume click on each task. Turn off if auto-resuming many agents at once overwhelms your machine.

Each agent advertises its own supported permission modes, and the Edit Column and Settings dropdowns update dynamically when you switch agents. The full set of modes is:

ModeBehaviorSupported by
planRead-only tools auto-approved; edits require approvalClaude, Codex, Gemini, Qwen, Kimi, OpenCode (Plan agent), Aider, Copilot, Warp
defaultUses the agent’s built-in defaults (e.g., Claude Code’s .claude/settings.json allowlist)Claude, Codex, Gemini, Qwen, Kimi, Droid, Aider, Cursor, Copilot, Warp
acceptEditsFile edits auto-approved; other actions prompt (OpenCode: maps to its Build agent)Claude, Codex, Gemini, Qwen, OpenCode, Aider, Copilot
bypassPermissionsFull autonomy, no permission prompts at allClaude, Codex, Gemini, Qwen, Kimi, Aider, Cursor, Copilot, Warp
dontAskDeny everything not already allowed, no interactive promptsClaude, Codex, Copilot
autoClassifier-driven auto-approvalClaude, Copilot

Per-agent defaults:

AgentDefault permission modeNotes
Claude CodeacceptEdits
Codex CLIacceptEdits
Gemini CLIacceptEdits
Qwen CodeacceptEditsLabeled “Auto Edit” - soft fork of Gemini CLI
Kimi CodedefaultLabels: Plan, Default (Confirm Actions), YOLO
OpenCodeacceptEditsLabels surface OpenCode’s native Plan and Build agents - selecting Plan maps to OpenCode’s read-only built-in agent
Factory DroiddefaultSingle “Default” entry; autonomy is controlled in the Droid TUI (Shift+Tab cycles low/medium/high)
GitHub Copilot CLIacceptEdits
AiderbypassPermissionsAider is an edit-first CLI that expects broad file-write access
Cursor CLIbypassPermissionsNon-interactive mode is the default so the stream-JSON init event fires and the ContextBar model pill resolves
Warp (Oz CLI)defaultPermission-mode labels are informational only; Warp manages permissions via agent profiles (--profile)

Permission mode is resolved in priority order:

  1. Column’s permission_mode (if set)
  2. agent.permissionMode from config
KeyTypeDefaultScopeDescription
git.worktreesEnabledbooleantrueBothCreate isolated git worktrees per task
git.autoCleanupbooleantrueBothDelete branches when worktrees are removed
git.defaultBaseBranchstring"main"BothDefault base branch for worktrees
git.copyFilesstring[][]BothFiles to copy from repo root into new worktrees
git.initScriptstring | nullnullBothShell script to run after worktree creation
KeyTypeDefaultScopeDescription
contextBar.showShellbooleantrueGlobal onlyShow shell name in context bar
contextBar.showVersionbooleantrueGlobal onlyShow agent CLI version
contextBar.showCostbooleantrueGlobal onlyShow session cost
contextBar.showTokensbooleantrueGlobal onlyShow token usage
contextBar.showContextFractionbooleantrueGlobal onlyShow context window fraction
contextBar.showProgressBarbooleantrueGlobal onlyShow context window progress bar
contextBar.showRateLimitsbooleantrueGlobal onlyShow adapter-reported rate-limit bars (Claude reports 5-hour session and 7-day weekly windows; hidden for adapters that don’t report rate limits)

The model and effort pills are always visible when the adapter reports them. Both pills double as click-targets for the per-task model/effort picker popover, so they no longer have show/hide toggles. Effort levels are surfaced for adapters whose discoverCapabilities reports a non-empty effortLevels list (Claude Code in particular).

KeyTypeDefaultScopeDescription
sidebar.widthnumber400Global onlySidebar width in pixels

Settings for the embedded browser pane.

KeyTypeDefaultScopeDescription
browser.enabledbooleantrueBothWhen false, the Browser pill is hidden in the task detail dialog header
browser.defaultUrlstring | undefinedundefinedBothProject-default URL used when a task has no per-task override. Auto-saved on first navigation in a project. Stored per-project; never seeded into new projects
KeyTypeDefaultScopeDescription
notifications.desktop.onAgentIdlebooleantrueGlobal onlyDesktop notification when agent goes idle
notifications.desktop.onAgentCrashbooleantrueGlobal onlyDesktop notification when agent crashes
notifications.desktop.onPlanCompletebooleantrueGlobal onlyDesktop notification when planning completes
notifications.toasts.onAgentIdlebooleantrueGlobal onlyIn-app toast when agent goes idle
notifications.toasts.onAgentCrashbooleantrueGlobal onlyIn-app toast when agent crashes
notifications.toasts.onPlanCompletebooleantrueGlobal onlyIn-app toast when planning completes
notifications.toasts.durationSecondsnumber4BothHow long toasts display
notifications.toasts.maxCountnumber5Global onlyMaximum simultaneous toasts on screen
notifications.cooldownSecondsnumber10Global onlyMinimum seconds between repeated notifications

Each column (swimlane) can override settings individually:

FieldTypeDefaultDescription
permission_modestring | nullnullPermission mode override for this column
auto_spawnbooleantrueWhether moving a task here spawns an agent
auto_commandstring | nullnullCommand injected into running sessions on task arrival
plan_exit_target_idstring | nullnullTarget column when plan-mode agent exits
agent_overridestring | nullnullUse a specific agent for sessions in this column (one of "claude", "codex", "gemini", "qwen", "kimi", "opencode", "droid", "aider", "cursor", "copilot", "warp"). null inherits the project default agent
model_overridestring | nullnullAdapter-specific model identifier passed at spawn (e.g. Claude --model opus, Codex --model gpt-5-codex). Live-applied via the agent’s /model slash on column transition when supported
effort_overridestring | nullnullAdapter-specific effort/reasoning level passed at spawn (e.g. Claude --effort xhigh). Live-applied via the agent’s /effort slash on column transition when supported
handoff_contextbooleanfalseWhen enabled, hand the prior agent’s native session history file to the next agent when a task moves into this column. Supported in both directions for Claude, Codex, Gemini, Qwen, Kimi, and OpenCode; no-op for Cursor, Copilot, Droid, Aider, and Warp

The available models and effort levels are surfaced from each adapter’s discoverCapabilities probe - the Edit Column dropdown shows only what the active CLI supports. See Custom Workflows for details on how these interact.

Kangentic includes 10 built-in themes:

  • Dark - Default dark theme
  • Moon - Cool-toned dark theme
  • Forest - Green-accented dark theme
  • Ocean - Blue-accented dark theme
  • Ember - Warm orange-accented dark theme

Set the theme in the settings panel or in your global config file.

These settings cannot be overridden per-project:

  • agent.maxConcurrentSessions
  • agent.queueOverflow
  • agent.cliPaths
  • agent.idleTimeoutMinutes
  • agent.autoResumeSessionsOnRestart
  • sidebarVisible
  • skipDeleteConfirm
  • skipDoneWorktreeConfirm
  • skipBoardConfigConfirm
  • autoFocusIdleSession
  • boardLayout
  • cardDensity
  • columnWidth
  • terminalPanelVisible
  • statusBarVisible
  • animationsEnabled
  • sidebar.width
  • terminal.panelHeight
  • terminal.panelCollapsed
  • terminal.showPreview
  • restoreWindowPosition
  • statusBarPeriod
  • notifications.* (all notification settings)
  • contextBar.* (all context bar settings)
  • developer.* (all developer settings)
KeyTypeDefaultScopeDescription
mcpServer.enabledbooleantrueBothEnable/disable the MCP server that lets agents interact with the board

When enabled, each agent session gets access to MCP tools for creating tasks, searching the board, browsing the backlog, and reading session transcripts. As of v0.15.0 the MCP server runs as an in-process streamable HTTP transport (replacing the earlier file-bridge). Disable this if you don’t want agents to be able to modify the board.

Power-user toggles for diagnosing the activity engine and other internal subsystems. All are global-only and default to off. Toggle the whole panel from anywhere with Ctrl+Shift+D.

KeyTypeDefaultDescription
developer.activityDebugOverlaybooleanfalseShow the floating activity-engine debug overlay (live counters, current activity reason, and recent transitions per running session). Also writes a per-session JSON snapshot under .kangentic/debug/ on each state change
developer.persistConsoleLogsbooleanfalsePersist info/debug/log console output to .kangentic/logs/<date>.log (errors and warnings are always persisted). Read via the kangentic_tail_logs MCP tool
developer.recordIpcTrafficbooleanfalseRecord every IPC handler call (channel, args, result, duration) to .kangentic/logs/ipc-<date>.jsonl. Sensitive channels are redacted. Off by default - non-trivial disk impact
developer.previewInspectionServerbooleandev: true, prod: falseBind a localhost-only HTTP inspection bridge powering the dev-only devtools MCP tools. The UI affordance is excluded from production builds; the key persists for type compatibility but has no effect in shipped binaries
developer.previewEvalEnabledbooleanfalseStricter gate on top of previewInspectionServer that enables high-risk inspection endpoints (eval, synthetic session events, raw PTY input). Off by default even in dev
VariableDescription
KANGENTIC_DATA_DIROverride the config/data directory path
KANGENTIC_LOG_LEVELSet log verbosity: debug, info, warn, error
KANGENTIC_TELEMETRYSet to off to disable anonymous usage analytics

Kangentic collects anonymous usage analytics via Aptabase. No personal data, code, or file paths are collected. Opt out by setting KANGENTIC_TELEMETRY=0.

See Privacy & Analytics for full details on what is collected and how to opt out.