Claude Settings
Scopes (Highest Wins)
| Scope | File | Shared? |
|---|---|---|
| Managed | system managed-settings.json / plist / registry / server | Org-wide, IT |
| User | ~/.claude/settings.json | Just you, all projects |
| Project | <repo>/.claude/settings.json | Team (git) |
| Local | <repo>/.claude/settings.local.json | Just you; Claude keeps it out of git (adds to global excludes) |
Precedence, highest first: Managed → command line (--settings) → project local → shared project → user. Lists (like permissions.allow) merge across files instead of overriding. A few restrictive keys honor the stricter value from any scope. ~/.claude.json holds MCP servers and per-project state (written by Claude, don't edit).
Verify with /status (shows "Setting sources") and claude doctor. Edits to most keys reload live. Full key list: code.claude.com/docs/en/settings-reference.
Key Reference
| Area | Keys |
|---|---|
| Auth | apiKeyHelper, awsAuthRefresh, awsCredentialExport, forceLoginMethod (claudeai/console), forceLoginOrgUUID |
| Storage | cleanupPeriodDays (default 30, min 1, 0 is rejected), autoMemoryDirectory, autoMemoryEnabled, plansDirectory (default ~/.claude/plans) |
| Env | "env": { "NODE_ENV": "development" } applied every session |
| Model | model, availableModels (doesn't affect "Default"), deniedModels, fallbackModel, modelOverrides (e.g. Bedrock ARNs), effortLevel, maxEffortLevel, alwaysThinkingEnabled, fastMode, fastModePerSessionOptIn |
| Output | outputStyle, language, includeGitInstructions (env CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS wins) |
| Git | attribution.commit / .pr / .sessionUrl (or false to hide all); includeCoAuthoredBy deprecated |
| Updates | autoUpdatesChannel: stable (~1 week old) or latest; companyAnnouncements |
| UI | showTurnDuration, spinnerVerbs (append/replace), spinnerTipsEnabled, spinnerTipsOverride, terminalProgressBarEnabled, prefersReducedMotion |
| Teams | teammateMode: in-process (default) / auto / tmux / iterm2 |
| Permissions | see Claude Permissions |
| MCP | enableAllProjectMcpServers, enabledMcpjsonServers, disabledMcpjsonServers; managed only: allowedMcpServers, deniedMcpServers |
| Plugins (managed only) | strictKnownMarketplaces, blockedMarketplaces, pluginTrustMessage |
| Lockdown (managed only) | allowManagedPermissionRulesOnly, allowManagedMcpServersOnly, allowManagedHooksOnly |
| Hooks | hooks, disableAllHooks, allowedHttpHookUrls, httpHookAllowedEnvVars (see Claude Hooks and Automation) |
| Misc | otelHeadersHelper, statusLine, fileSuggestion, respectGitignore, editorMode (normal/vim), fastMode, sandbox.* (see Claude Permissions) |
| Removed/deprecated | teammateDefaultModel (removed v2.1.234), taskOutputMaxChars (v2.1.277), permissionExplainerEnabled (v2.1.257), disableArtifact → enableArtifact, includeCoAuthoredBy → attribution |
| CLAUDE.md | claudeMdExcludes (see Claude Memory) |
Snippets
{
"model": "opus",
"outputStyle": "Explanatory",
"attribution": { "commit": "", "pr": "" },
"autoUpdatesChannel": "stable",
"cleanupPeriodDays": 14,
"env": { "LOG_LEVEL": "info" },
"spinnerVerbs": { "mode": "append", "verbs": ["Pondering", "Brewing"] }
}
Status line
Bottom bar driven by a script; receives session JSON on stdin.
{ "statusLine": { "type": "command", "command": "~/.claude/statusline.sh", "padding": 2, "refreshInterval": 10, "hideVimModeIndicator": false } }
/statusline <natural language>generates the script (/statusline clearremoves it).refreshIntervalre-runs it every N seconds (min 1);subagentStatusLinestyles subagent rows.- stdin fields:
model.id|display_name,workspace.current_dir|project_dir|repo.*,cost.total_cost_usd|total_duration_ms|total_lines_*,context_window.used_percentage|remaining_percentage|context_window_size|current_usage,rate_limits.five_hour|seven_day.used_percentage|resets_at,effort.level,fast_mode,thinking.enabled,session_id|session_name,version,output_style.name,vim.mode,agent.name,pr.number|url|review_state,worktree.*,prompt_cache.*. - Typical script: read stdin →
jqfields →printfprogress bar → git branch/staged/modified. - A status line replaces most footer hints;
disableAllHooksalso disables it.
Output Styles
| Style | Behavior |
|---|---|
| Default | Standard software-engineering instructions |
| Proactive | Starts work immediately, assumes on routine decisions, no plan mode unless asked |
| Concise | Leads with the result, no preamble/recap (v2.1.237+) |
| Explanatory | Adds Insight blocks explaining choices |
| Learning | Insights plus TODO(human) bits for you to write |
Switch with /output-style <name> (case-insensitive), /config → Output style, or "outputStyle": "Explanatory" (case-sensitive; a wrong case gives Default). The command saves to .claude/settings.local.json; applies from your next message.
Custom styles: Markdown files in ~/.claude/output-styles/, .claude/output-styles/ or the managed dir. Frontmatter: name, description, keep-coding-instructions (default false: a custom style drops Claude Code's built-in software-engineering instructions), force-for-plugin (plugin styles). Styles are instructions, not guarantees; use hooks for must-happen behavior. They affect the main conversation and forks, not other subagents.
Related: Claude Permissions, Claude Memory, Claude Hooks and Automation