Configuration

Where Cusp's settings files live, how they combine, and every key they accept.

Cusp is configured with JSON settings files in the widely used settings.json format. You don't need any of them to get started. They exist for when you want to pin a model, pre-approve commands, add hooks or adjust the sandbox.

Settings files

ScopeFileShared?Use it for
ManagedSet by an administrator (see below)OrganizationPolicy that users can't override
Command line--allowedTools, --permission-mode, …This runOne-off overrides
Local.cusp/settings.local.jsonNo. Add it to .gitignoreYour personal settings for this project. "Always allow" choices are saved here
Project.cusp/settings.jsonYes. Commit itTeam settings for this project
User~/.cusp/settings.jsonNoYour defaults for every project

At each scope Cusp also reads the shared file (.claude/settings.local.json, .claude/settings.json, ~/.claude/settings.json). When both exist at the same scope, the .cusp/ file takes precedence.

Managed settings

PlatformPaths, highest precedence first
macOS/Library/Application Support/Cusp/managed-settings.json, /Library/Application Support/ClaudeCode/managed-settings.json
WindowsC:\Program Files\Cusp\managed-settings.json, C:\Program Files\ClaudeCode\managed-settings.json
Linux/etc/cusp/managed-settings.json, /etc/claude-code/managed-settings.json

How settings combine

Precedence, highest first: managed → command line → local → project → user.

  • Scalar values (model, effortLevel, …): the highest scope that sets the key wins.
  • Permission rules from every scope are combined, then evaluated deny → ask → allow. A deny anywhere wins.
  • Hooks from every scope all run.
  • env values are merged, with higher scopes winning per variable.

Settings are read leniently. Unknown keys are kept and ignored. A known key with an invalid value is dropped with a warning naming the file and key, and the rest of the file still applies. A file that isn't valid JSON is skipped with a warning.

What a project can't set

A repository's settings come from whoever wrote the repository, so some keys are limited:

  • Until you trust the workspace, project and local files can't set hooks, env, apiKeyHelper, statusLine, enableAllProjectMcpServers, enabledMcpjsonServers, permissions.allow or permissions.additionalDirectories. Deny and ask rules still apply, because they only narrow what the agent can do.
  • Ever: project and local files can't set permissions.defaultMode to auto or bypassPermissions, and can't set protected environment variables (HOME, TMPDIR, TMP, TEMP, XDG_*, OTEL_EXPORTER_OTLP_*, and the config directory variables of Cusp and of the agents whose files it reads). They also can't weaken the sandbox: turning it off, opening localhost or Unix sockets, or adding readable or writable paths only works from user, managed or --settings files.
  • Managed only: allowManagedHooksOnly and allowManagedPermissionRulesOnly take effect only in managed settings.

Example

.cusp/settings.json
{
  "model": "anthropic:claude-opus-5-5",
  "effortLevel": "medium",
  "permissions": {
    "allow": ["Bash(bun test *)", "Bash(bun run lint)", "Edit(src/**)"],
    "deny": ["Read(.env)", "Read(**/*.pem)"],
    "defaultMode": "acceptEdits"
  },
  "env": {
    "NODE_OPTIONS": "--max-old-space-size=8192"
  },
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|MultiEdit|Write|ApplyPatch",
        "hooks": [{ "type": "command", "command": "bunx biome format --write ." }]
      }
    ]
  }
}

Keys

Cusp parses the full settings.json schema. Keys for features that aren't in Cusp yet are accepted and ignored, never rejected, so a shared .claude/settings.json keeps working for every tool that reads it.

Model

KeyTypeMeaning
modelstringDefault model, as provider:model or a bare id
effortLevelstringDefault effort: none, minimal, low, medium, high, xhigh, max. effort is accepted as an alias
fallbackModelstring or string[]Model or models to try when the main model is unavailable
availableModelsstring[]Restrict the model picker to these models
outputStylestringName of an output style from .cusp/output-styles/ or .claude/output-styles/
languagestringPreferred response language

Permissions

KeyTypeMeaning
permissions.allowstring[]Rules that run without asking
permissions.askstring[]Rules that always ask
permissions.denystring[]Rules that are always denied
permissions.defaultModestringdefault, acceptEdits, plan, auto or bypassPermissions
permissions.additionalDirectoriesstring[]Extra directories the agent may work in, besides the workspace
permissions.disableBypassPermissionsMode"disable" or booleanPrevent bypass mode
permissions.disableAutoMode"disable" or booleanPrevent auto mode
permissions.blockReadsOutsideWorkingDirectoriesbooleanBlock reads outside the workspace and additional directories
allowManagedPermissionRulesOnlybooleanManaged only. Ignore rules from other scopes

Rule syntax is described in Permissions.

Hooks

KeyTypeMeaning
hooksobjectHook configuration. See Hooks
disableAllHooksbooleanTurn off hooks
allowManagedHooksOnlybooleanManaged only. Run only managed hooks
allowedHttpHookUrlsstring[]URLs that http hooks may call
httpHookAllowedEnvVarsstring[]Environment variables http hooks may interpolate into headers

Sandbox

KeyTypeMeaning
sandbox.enabledbooleanRun shell commands in the OS sandbox. Default true
sandbox.failIfUnavailablebooleanRefuse to run commands when the sandbox can't be applied. Default true
sandbox.filesystem.allowWrite, allowRead, denyReadstring[]Filesystem adjustments
sandbox.network.allowedDomains, deniedDomainsstring[]Hosts reachable through the filtering proxy, and hosts always refused. Advisory on Linux
sandbox.network.allowLocalPortsnumber[]Localhost ports commands may use
sandbox.network.allowLocalBindingbooleanOpen localhost entirely. Default false
sandbox.network.allowUnixSocketsstring[]Unix sockets commands may connect to

autoAllowBashIfSandboxed, allowUnsandboxedCommands, excludedCommands, filesystem.denyWrite and network.allowAllUnixSockets are accepted so existing settings load, but not applied yet. Settings that weaken the sandbox are ignored in project settings. See Sandbox.

MCP

KeyTypeMeaning
mcpServersobjectServer definitions, in the same format as .mcp.json
enabledMcpjsonServersstring[]Approve these project servers
disabledMcpjsonServersstring[]Reject these project servers
enableAllProjectMcpServersbooleanApprove all project servers

See MCP servers.

Instructions, skills and agents

KeyTypeMeaning
claudeMdExcludesstring[]Globs of instruction files to skip. See Memory
skillOverridesobjectPer-skill on, name-only, user-invocable-only or off
disableSkillsbooleanTurn off all skills
disableSkillShellExecutionbooleanDon't run !`command` in skills
disableAgentsbooleanTurn off custom subagents
agentstringRun the main session as this agent definition

Environment and tools

KeyTypeMeaning
envobjectEnvironment variables for shell commands and hooks. Numbers and booleans are converted to strings
apiKeyHelperstringA command that prints an API key, for keys that rotate
statusLineobject{ "type": "command", "command": "…" }: a command whose output is shown in the status line

Git

KeyTypeMeaning
attribution.commitstringTrailer added to commits the agent makes. attribution: false turns it off
attribution.prstringText added to pull request descriptions
includeCoAuthoredBybooleanOlder form of the commit attribution switch

Housekeeping

KeyTypeMeaning
cleanupPeriodDaysintegerHow long to keep inactive sessions

Other files Cusp reads

FilePurpose
CUSP.md, AGENTS.md, CLAUDE.md, …Instructions. See Memory
.cusp/rules/*.mdInstruction rules, optionally path-scoped
.cusp/skills/<name>/SKILL.mdSkills
.cusp/agents/*.mdSubagents
.cusp/mcp.json, .mcp.jsonMCP servers
.cusp/output-styles/*.mdOutput styles

Every .cusp/ path has a ~/.cusp/ user-level counterpart, and a .claude/ equivalent that Cusp also reads.

Daemon configuration

The daemon takes its own configuration from flags and CUSP_* environment variables. You rarely need these; the desktop app and CLI set them for you.

VariableDefaultMeaning
CUSP_DATA_DIR~/.cuspDatabase, checkpoint blobs and worktrees
CUSP_HOST127.0.0.1Interface to bind. Non-loopback addresses are refused unless CUSP_ALLOW_REMOTE is set
CUSP_ALLOW_REMOTEfalsePermit a non-loopback interface. Intended for cloud sandboxes behind an authenticated proxy
CUSP_PORT0 (random)TCP port
CUSP_TOKENGenerated per launchBearer token, at least 16 characters
CUSP_ALLOWED_ORIGINSThe desktop app's originsBrowser origins allowed by CORS and on WebSocket connections
CUSP_LOG_LEVELinfofatal, error, warn, info, debug, trace or silent
CUSP_PARENT_PID—Exit when this process exits

On this page