Configuration
Configure Kitten without guessing.
Start with a small JSON delta, then add providers, sessions, preferences, and local MCP servers when you need them.
File location and validation
Config is optional. Kitten first checks KITTEN_CONFIG, then$XDG_CONFIG_HOME/kitten/config.json, then~/.config/kitten/config.json.
Every field is a delta over Kitten's defaults. Existing files are strict JSON: unknown keys, malformed JSON, and invalid values stop startup instead of falling back silently.
Choose the sessions Kitten opens
With no sessions array, Kitten seeds one session for each configured provider in the directory where you launch it. Add an array when you need a specific order, title, task, or working directory.
{
"theme": "dark",
"sessions": [
{ "provider": "codex", "cwd": ".", "title": "Implementation" },
{ "provider": "claude-code", "cwd": ".", "title": "Review" },
{ "provider": "cursor", "cwd": ".", "title": "Explore" }
]
}provider- One of
claude-code,codex, orcursor. cwd- Required. Relative paths resolve from the directory where you launch Kitten and must exist.
title- Optional. The directory name is used when it is omitted.
task- Optional initial task text for the session.
Override a provider or set model defaults
Provider overrides merge by field, so changing one command, argument list, display name, or environment value leaves the rest of the recipe in place. The deprecatedagents alias still loads, but use providers for new files.
Kitten currently recognizes Claude Code, Codex, and Cursor. More Agent Client Protocol (ACP) connections are planned, but a config file cannot invent an unsupported provider key.
{
"providers": {
"codex": {
"displayName": "Codex implementation",
"env": {
"INITIAL_AGENT_MODE": "agent-full-access"
}
}
},
"providerDefaults": {
"codex": { "model": "gpt-5.4", "effort": "high" },
"claude-code": { "model": "claude-opus-4-1", "effort": "high" }
}
}providerDefaults accepts only model and effort. They are personal preferences, not a command to change a running session. Kitten applies them through the intentional provider-selection flow and never writes a manual live choice back into this block.
Set cockpit preferences
themeauto,light,dark,catppuccin-mocha, orcatppuccin-latte.welcomeBannerauto,always, oroff.clarificationTimeoutSeconds- An integer from 1 to 3600. The default is 300 seconds.
persistenceEnabled- Controls local session persistence. It is on by default.
telemetryEnabled- Opt in to local, content-free JSONL counters. It is off by default.
transcriptWindowingEnabled- Opt in to the bounded transcript presentation experiment. It is off by default.
statusline- Requires
llmDisclosureAcknowledged;separatorandlinemust be supplied together.
Add local MCP servers and editor tools
mcpServers is a name-keyed map of stdio commands. Remote HTTP and SSE transports are rejected. Kitten already adds its own kitten-ask-userserver; do not add that server to this map.
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}Set each referenced environment variable before starting Kitten. If a variable cannot be resolved, Kitten skips that declared server and shows a warning.
{
"editor": {
"kind": "custom",
"executable": "code",
"args": ["--goto", "{file}"]
},
"shell": {
"enabled": true,
"scrollback": 5000
}
}A custom editor's args must include exactly one complete{file} placeholder. Shell scrollback accepts an integer from 0 through 100000.
Know what changes immediately
Kitten watches a valid config file. While the cockpit is open, it updates the theme, statusline, and provider-default snapshot. Change providers, sessions, MCP servers, shell settings, persistence, telemetry, or transcript windowing before the next launch.
A file that exists but cannot be read or validated is a configuration error. Fix the named field and restart; Kitten does not quietly replace a broken file with defaults.