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
| Scope | File | Shared? | Use it for |
|---|---|---|---|
| Managed | Set by an administrator (see below) | Organization | Policy that users can't override |
| Command line | --allowedTools, --permission-mode, … | This run | One-off overrides |
| Local | .cusp/settings.local.json | No. Add it to .gitignore | Your personal settings for this project. "Always allow" choices are saved here |
| Project | .cusp/settings.json | Yes. Commit it | Team settings for this project |
| User | ~/.cusp/settings.json | No | Your 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
| Platform | Paths, highest precedence first |
|---|---|
| macOS | /Library/Application Support/Cusp/managed-settings.json, /Library/Application Support/ClaudeCode/managed-settings.json |
| Windows | C:\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.
envvalues 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.alloworpermissions.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.defaultModetoautoorbypassPermissions, 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--settingsfiles. - Managed only:
allowManagedHooksOnlyandallowManagedPermissionRulesOnlytake effect only in managed settings.
Example
{
"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
| Key | Type | Meaning |
|---|---|---|
model | string | Default model, as provider:model or a bare id |
effortLevel | string | Default effort: none, minimal, low, medium, high, xhigh, max. effort is accepted as an alias |
fallbackModel | string or string[] | Model or models to try when the main model is unavailable |
availableModels | string[] | Restrict the model picker to these models |
outputStyle | string | Name of an output style from .cusp/output-styles/ or .claude/output-styles/ |
language | string | Preferred response language |
Permissions
| Key | Type | Meaning |
|---|---|---|
permissions.allow | string[] | Rules that run without asking |
permissions.ask | string[] | Rules that always ask |
permissions.deny | string[] | Rules that are always denied |
permissions.defaultMode | string | default, acceptEdits, plan, auto or bypassPermissions |
permissions.additionalDirectories | string[] | Extra directories the agent may work in, besides the workspace |
permissions.disableBypassPermissionsMode | "disable" or boolean | Prevent bypass mode |
permissions.disableAutoMode | "disable" or boolean | Prevent auto mode |
permissions.blockReadsOutsideWorkingDirectories | boolean | Block reads outside the workspace and additional directories |
allowManagedPermissionRulesOnly | boolean | Managed only. Ignore rules from other scopes |
Rule syntax is described in Permissions.
Hooks
| Key | Type | Meaning |
|---|---|---|
hooks | object | Hook configuration. See Hooks |
disableAllHooks | boolean | Turn off hooks |
allowManagedHooksOnly | boolean | Managed only. Run only managed hooks |
allowedHttpHookUrls | string[] | URLs that http hooks may call |
httpHookAllowedEnvVars | string[] | Environment variables http hooks may interpolate into headers |
Sandbox
| Key | Type | Meaning |
|---|---|---|
sandbox.enabled | boolean | Run shell commands in the OS sandbox. Default true |
sandbox.failIfUnavailable | boolean | Refuse to run commands when the sandbox can't be applied. Default true |
sandbox.filesystem.allowWrite, allowRead, denyRead | string[] | Filesystem adjustments |
sandbox.network.allowedDomains, deniedDomains | string[] | Hosts reachable through the filtering proxy, and hosts always refused. Advisory on Linux |
sandbox.network.allowLocalPorts | number[] | Localhost ports commands may use |
sandbox.network.allowLocalBinding | boolean | Open localhost entirely. Default false |
sandbox.network.allowUnixSockets | string[] | 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
| Key | Type | Meaning |
|---|---|---|
mcpServers | object | Server definitions, in the same format as .mcp.json |
enabledMcpjsonServers | string[] | Approve these project servers |
disabledMcpjsonServers | string[] | Reject these project servers |
enableAllProjectMcpServers | boolean | Approve all project servers |
See MCP servers.
Instructions, skills and agents
| Key | Type | Meaning |
|---|---|---|
claudeMdExcludes | string[] | Globs of instruction files to skip. See Memory |
skillOverrides | object | Per-skill on, name-only, user-invocable-only or off |
disableSkills | boolean | Turn off all skills |
disableSkillShellExecution | boolean | Don't run !`command` in skills |
disableAgents | boolean | Turn off custom subagents |
agent | string | Run the main session as this agent definition |
Environment and tools
| Key | Type | Meaning |
|---|---|---|
env | object | Environment variables for shell commands and hooks. Numbers and booleans are converted to strings |
apiKeyHelper | string | A command that prints an API key, for keys that rotate |
statusLine | object | { "type": "command", "command": "…" }: a command whose output is shown in the status line |
Git
| Key | Type | Meaning |
|---|---|---|
attribution.commit | string | Trailer added to commits the agent makes. attribution: false turns it off |
attribution.pr | string | Text added to pull request descriptions |
includeCoAuthoredBy | boolean | Older form of the commit attribution switch |
Housekeeping
| Key | Type | Meaning |
|---|---|---|
cleanupPeriodDays | integer | How long to keep inactive sessions |
Other files Cusp reads
| File | Purpose |
|---|---|
CUSP.md, AGENTS.md, CLAUDE.md, … | Instructions. See Memory |
.cusp/rules/*.md | Instruction rules, optionally path-scoped |
.cusp/skills/<name>/SKILL.md | Skills |
.cusp/agents/*.md | Subagents |
.cusp/mcp.json, .mcp.json | MCP servers |
.cusp/output-styles/*.md | Output 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.
| Variable | Default | Meaning |
|---|---|---|
CUSP_DATA_DIR | ~/.cusp | Database, checkpoint blobs and worktrees |
CUSP_HOST | 127.0.0.1 | Interface to bind. Non-loopback addresses are refused unless CUSP_ALLOW_REMOTE is set |
CUSP_ALLOW_REMOTE | false | Permit a non-loopback interface. Intended for cloud sandboxes behind an authenticated proxy |
CUSP_PORT | 0 (random) | TCP port |
CUSP_TOKEN | Generated per launch | Bearer token, at least 16 characters |
CUSP_ALLOWED_ORIGINS | The desktop app's origins | Browser origins allowed by CORS and on WebSocket connections |
CUSP_LOG_LEVEL | info | fatal, error, warn, info, debug, trace or silent |
CUSP_PARENT_PID | — | Exit when this process exits |