Skip to content

settings.json and local overrides

.claude/settings.json holds configuration Claude Code enforces — unlike CLAUDE.md, which is guidance Claude reads. Common keys: permissions (allow/deny/ask rules), hooks (scripts on events), statusLine, model, env, and outputStyle.

.claude/settings.json
{
"permissions": {
"allow": [
"Bash(npm test *)",
"Bash(npm run *)"
],
"deny": [
"Bash(rm -rf *)"
]
},
"hooks": {
"PostToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
}]
}]
}
}

settings.local.json is your personal, gitignored override for one project — same schema, higher precedence. The full precedence order: managed settings > CLI flags > settings.local.json > project settings.json > global ~/.claude/settings.json. Array settings like permissions.allow combine across scopes; scalar settings like model use the most specific value.

Question 1CLAUDE.md vs settings.json — the key difference?

Question 2How do array settings like permissions.allow behave across scopes?