Configuration
Where Nib's settings files live, how they combine, and every key they accept.
Nib 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 | .nib/settings.local.json | No. Add it to .gitignore | Your personal settings for this project. "Always allow" choices are saved here |
| Project | .nib/settings.json | Yes. Commit it | Team settings for this project |
| User | ~/.nib/settings.json | No | Your defaults for every project |
At each scope Nib also reads the shared file (.claude/settings.local.json, .claude/settings.json, ~/.claude/settings.json). When both exist at the same scope, the .nib/ file takes precedence.
Managed settings
| Platform | Paths, highest precedence first |
|---|---|
| macOS | /Library/Application Support/Nib/managed-settings.json, /Library/Application Support/ClaudeCode/managed-settings.json |
| Windows | C:\Program Files\Nib\managed-settings.json, C:\Program Files\ClaudeCode\managed-settings.json |
| Linux | /etc/nib/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,subagentStatusLine,permissions.allow,permissions.additionalDirectoriesorsandbox.network.allowedDomains. 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 Nib 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. Nor can they define MCP servers (mcpServers), approve the project's own servers (enableAllProjectMcpServers,enabledMcpjsonServers) or switch plugins on or off (enabledPlugins): a repository's servers go in.mcp.json, where each asks for your approval. Nor can they move auto memory (autoMemoryDirectory), a folder the agent writes in without asking. - 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|Write|ApplyPatch",
"hooks": [{ "type": "command", "command": "bunx biome format --write ." }]
}
]
}
}Keys
Nib parses the full settings.json schema. Keys for features that aren't in Nib 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 | The effort a session runs at when none was picked for it: none, minimal, low, medium, high, xhigh, max |
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 .nib/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, dontAsk or bypassPermissions |
permissions.additionalDirectories | string[] | Extra directories the agent may work in, besides the workspace |
permissions.disableBypassPermissionsMode | "disable" or boolean | Managed only. Prevent bypass mode |
permissions.disableAutoMode | "disable" or boolean | Managed only. Prevent auto mode |
permissions.blockReadsOutsideWorkingDirectories | boolean | Accepted so existing settings load, but not applied yet |
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: every hook from managed settings, all but managed hooks from anywhere else |
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 | true refuses shell commands when the sandbox can't be applied; false runs them unsandboxed. Unset: unsandboxed on Windows and on Linux without bubblewrap, refused elsewhere |
sandbox.filesystem.allowWrite, allowRead, denyRead, denyWrite | string[] | Filesystem adjustments |
sandbox.network.allowedDomains, deniedDomains | string[] | Hosts reachable through the filtering proxy, and hosts always refused. Advisory on Linux |
sandbox.allowUnsandboxedCommands | boolean | false: strict mode. Bash refuses dangerouslyDisableSandbox, and the sandbox stays on in bypass mode |
sandbox.network.allowLocalBinding | boolean | Let commands connect to localhost services, except the daemon's ports. Default true |
sandbox.network.allowLocalPorts | number[] | With allowLocalBinding off, the localhost ports commands may connect to |
sandbox.network.allowUnixSockets | string[] | Unix sockets commands may connect to |
Package registries and toolchain downloads are reachable without listing them, unless deniedDomains lists them. autoAllowBashIfSandboxed, excludedCommands, filesystem.disabled, network.allowAllUnixSockets, network.httpProxyPort and network.socksProxyPort are accepted so existing settings load, but not applied yet. Settings that could 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. User, managed and --settings only: project settings files can't define servers |
enabledMcpjsonServers | string[] | Approve these project servers |
disabledMcpjsonServers | string[] | Reject these project servers |
enableAllProjectMcpServers | boolean | Approve all project servers |
disabledMcpServers | string[] | Servers turned off by name, whichever file defines them, except managed ones. The app's on/off switch for a server writes here |
See MCP servers. The organization policy keys allowedMcpServers, deniedMcpServers, strictKnownMarketplaces and allowedExtensions are described under Managed settings.
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 |
disableSkillShellExecution | boolean | Don't run !`command` in skills |
agent | string | Run the main session as this agent definition |
agents | object | Subagents defined inline: { "name": { "description": "…", "prompt": "…", … } }, with the same fields as an agent file |
autoMemoryEnabled | boolean | Notes the agent keeps about a repository between sessions. Default true; false turns them off |
autoMemoryDirectory | string | Folder for those notes, as an absolute path or ~/…. User, managed and --settings only. A folder that is or holds your home folder or the filesystem root, is a protected path, or is, holds or sits in a secret store is refused: auto memory stays off, with a warning that names the reason. Default: a folder per repository in the user-level folder that holds your user settings, which --data-dir doesn't move |
enabledPlugins | object | Plugins switched on or off by id: { "name@marketplace": true }. Wins over the list of installed plugins |
disableWorkflows | boolean | Turn off the Workflow tool |
workflowSizeGuideline | string | How many agents a workflow should stay under: small (5), medium (10, the default), large (50) or unrestricted |
disableBundledSkills | boolean | Turn off the commands and workflows that come with Nib (/init, /security-review, /simplify, /recap, /statusline and /loop) |
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. Its key is reused for 5 minutes, or for NIB_API_KEY_HELPER_TTL_MS milliseconds, and fetched again after an authentication error |
statusLine | object | { "type": "command", "command": "…" }: a command whose output is shown in the status line. padding adds up to 20 spaces before it; refreshInterval re-runs the command every that many seconds (at least 1) while the session is open somewhere |
subagentStatusLine | object | The same, for subagent rows. The command's input also names the agent |
eagerTools | string[] | Tool names, or patterns ending in * such as mcp__github__*, to load up front instead of deferring. See Deferred tools |
askUserQuestionTimeout | string | 60s, 5m or 10m: a question nobody answers in that time closes, and the agent continues on its own assumptions. Unset, questions wait. Plan approvals always wait |
promptSuggestionEnabled | boolean | Suggest a next prompt after each turn, written by the small model. Default true |
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 |
Other files Nib reads
| File | Purpose |
|---|---|
NIB.md, AGENTS.md, CLAUDE.md, … | Instructions. See Memory |
.nib/rules/*.md | Instruction rules, optionally path-scoped |
.nib/skills/<name>/SKILL.md | Skills |
.nib/agents/*.md | Subagents |
.nib/mcp.json, .mcp.json | MCP servers |
.nib/output-styles/*.md | Output styles |
Every .nib/ path has a ~/.nib/ user-level counterpart, and a .claude/ equivalent that Nib also reads. The exception is the project's MCP server file, whose counterpart is .mcp.json at the project root.
Daemon configuration
The daemon takes its own configuration from flags and NIB_* environment variables. You rarely need these; the desktop app and CLI set them for you.
| Variable | Default | Meaning |
|---|---|---|
NIB_DATA_DIR | ~/.nib | Database, checkpoint blobs and worktrees |
NIB_HOST | 127.0.0.1 | Interface to bind. Non-loopback addresses are refused unless NIB_ALLOW_REMOTE is set |
NIB_ALLOW_REMOTE | false | Permit a non-loopback interface. Intended for cloud sandboxes behind an authenticated proxy |
NIB_PORT | 0 (random) | TCP port |
NIB_TOKEN | Generated per launch | Bearer token, at least 16 characters |
NIB_ALLOWED_ORIGINS | The desktop app's origins | Browser origins allowed by CORS and on WebSocket connections |
NIB_LOG_LEVEL | info | fatal, error, warn, info, debug, trace or silent |
NIB_PARENT_PID | — | Exit when this process exits |