SpyBara
Go Premium

settings-example.md 2026-09-24 22:57 UTC to 2026-09-25 23:58 UTC

This page contains 2 additions and 14 deletions.

2026
Wed 2 04:58 Sat 5 14:59 Wed 9 22:58 Tue 15 23:58 Tue 22 23:59 Fri 25 23:58

Example settings files

Realistic settings.json files for a developer, a team, and an organization: copy one, keep the keys you want, and change the values.

This page holds three example settings.json files, one for each place you save a setting:

  • A developer's ~/.claude/settings.json
  • A team's .claude/settings.json, committed to the repository
  • An organization's managed-settings.json

Each one is a plausible file for that reader, so you can see the shape and copy the parts you want. None of them is a recommended baseline. Every value comes from the key's entry on the settings reference, which has its type, default, and where it can be set.

Each example has two tabs. Copyable settings file is the file as you'd save it. What each key does is the same file with a comment above each key; Claude Code doesn't accept comments in a settings file, so copy from the first tab.

Your own settings

One developer's personal settings. It picks a model and effort, adjusts the terminal, and pre-approves a read-only command and one file read. Everything not listed keeps its default. A file like this goes in ~/.claude/settings.json, where it applies to every project you open.

Save this as ~/.claude/settings.json. It's valid JSON with no comments, so you can paste it as is and delete the keys you don't want.

{
"model": "claude-sonnet-5",
"modelSettings": {
"claude-sonnet-5": { "effortLevel": "xhigh" }
},
"editorMode": "vim",
"theme": "light-daltonized",
"statusLine": {
"type": "command",
"command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'",
"padding": 2
},
"spinnerTipsEnabled": false,
"preferredNotifChannel": "terminal_bell",
"permissions": {
"allow": [
"Bash(git diff *)",
"Read(~/.zshrc)"
]
},
"autoUpdatesChannel": "stable",
"cleanupPeriodDays": 20
}

A team's shared settings

One team's shared settings, committed to the repository so everyone who clones it gets the same permissions, hooks, and plugin marketplace. Save a file like this at .claude/settings.json at the top of the repository. What to know before you commit one:

  • Cloud sessions read it too. A cloud session starts from a clone of the repository, so the committed file applies there as well.
  • Telemetry goes in managed or personal settings. Claude Code ignores the OpenTelemetry exporter variables in a repository's settings files, apart from some values that turn telemetry off. Set them in managed settings for your organization, or in each person's ~/.claude/settings.json.
  • Allow rules wait for trust. Allow rules and extraKnownMarketplaces entries take effect after each person trusts this folder itself, not only a parent folder; deny and ask rules apply in every session, trusted or not.
  • The hook is a script in the repo. This file's hook runs .claude/hooks/block-rm.sh; How a hook resolves walks through writing it.
  • Rules match the command and path as written. Bash(git push *) doesn't match git -C . push. Read(./.env) on its own stops the file tools and commands that name the file, such as cat .env, but not grep -r run over the directory; the sandbox block in this file closes that gap, because the sandbox adds your Read deny paths to what every sandboxed command can't read.

Save this as .claude/settings.json at the top of the repository and commit it. It's valid JSON with no comments, so you can paste it as is and delete the keys you don't want.

{
"permissions": {
"allow": [
"Bash(npm run *)"
],
"ask": [
"Bash(git push *)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)"
]
},
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh"
}
]
}
]
},
"extraKnownMarketplaces": {
"acme-tools": {
"source": {
"source": "github",
"repo": "acme-corp/claude-plugins"
}
}
},
"enabledPlugins": {
"code-formatter@acme-tools": true
},
"sandbox": {
"enabled": true,
"filesystem": {
"allowWrite": [
"/tmp/build"
]
},
"network": {
"allowedDomains": [
"registry.npmjs.org",
"*.example.com"
]
}
},
"plansDirectory": "./plans"
}

An organization's managed settings

A managed-settings.json file that shows the shape of the managed keys, with one plausible value for each. It isn't a recommended policy: pick the keys that match your own requirements and set your own values. The example sets these keys:

  • forceLoginMethod and forceLoginOrgUUID pin the login method and organization
  • availableModels and enforceAvailableModels restrict which models sessions can use
  • permissions.deny denies two file reads and curl commands as Claude writes them, and disableBypassPermissionsMode removes the bypass permission mode
  • allowManagedPermissionRulesOnly and allowManagedMcpServersOnly make the managed permission and MCP allowlists the only ones that apply
  • allowedMcpServers pins the MCP server by URL
  • strictKnownMarketplaces allows one plugin marketplace
  • sandbox sandboxes commands with a fixed network allowlist and no unsandboxed retry
  • requiredMinimumVersion sets a minimum Claude Code version
  • cleanupPeriodDays shortens retention of session transcripts and other local data to seven days
  • companyAnnouncements shows a message at startup

Administrators deploy a file like this as managed-settings.json, or the same JSON through MDM or server-managed settings. One deployed file applies to every machine or account it reaches. To give a group different values, deploy a different file or profile to that group, since server-managed settings don't support per-group policy yet.

Deploy this as managed-settings.json, or the same JSON through MDM or the claude.ai console. It's valid JSON with no comments; replace the example organization UUID, server URL, and marketplace with your own and delete the keys you don't want.

{
"forceLoginMethod": "claudeai",
"forceLoginOrgUUID": [
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
],
"availableModels": [
"opus",
"sonnet"
],
"enforceAvailableModels": true,
"permissions": {
"deny": [
"Bash(curl *)",
"Read(./.env)",
"Read(./secrets/**)"
],
"disableBypassPermissionsMode": "disable"
},
"allowManagedPermissionRulesOnly": true,
"allowedMcpServers": [
{
"serverUrl": "https://api.githubcopilot.com/*"
}
],
"allowManagedMcpServersOnly": true,
"strictKnownMarketplaces": [
{
"source": "github",
"repo": "acme-corp/approved-plugins"
}
],
"sandbox": {
"enabled": true,
"failIfUnavailable": true,
"allowUnsandboxedCommands": false,
"network": {
"allowedDomains": [
"registry.npmjs.org",
"github.com"
],
"allowManagedDomainsOnly": true
}
},
"requiredMinimumVersion": "2.1.150",
"cleanupPeriodDays": 7,
"companyAnnouncements": [
"Welcome to Acme Corp! Review our code guidelines at docs.example.com"
]
}