Skip to content

nimblebrain.json

NimbleBrain reads its configuration from a single nimblebrain.json file. This page documents every field, the resolution order, and validation behavior.

NimbleBrain looks for the config file in this order, stopping at the first match:

  1. --config <path> — Explicit path passed as a CLI flag
  2. --workdir <dir>/nimblebrain.json — Inside the working directory (flag or NB_WORK_DIR env var)
  3. ./nimblebrain.json — Current working directory

If no config file exists at the resolved path, NimbleBrain auto-creates a default one (empty bundles and skills) as long as the parent directory exists.

{
"$schema": "https://schemas.nimblebrain.ai/nimblebrain.json",
"version": "1",
"model": {
"provider": "anthropic",
"apiKey": "sk-ant-..."
},
"defaultModel": "claude-sonnet-4-5-20250929",
"maxIterations": 10,
"maxInputTokens": 500000,
"maxOutputTokens": 16384,
"bundles": [
{ "name": "@nimblebraininc/tasks" },
{ "path": "../mcp-servers/hello" },
{
"url": "https://mcp.example.com/mcp",
"serverName": "example",
"transport": {
"type": "streamable-http",
"auth": { "type": "bearer", "token": "sk-..." }
}
}
],
"noDefaultBundles": false,
"skillDirs": ["./skills", "/opt/nimblebrain/skills"],
"skills": [],
"store": {
"type": "jsonl",
"dir": "~/.nimblebrain/conversations"
},
"logging": {
"dir": "~/.nimblebrain/logs",
"disabled": false
},
"http": {
"port": 3000,
"host": "127.0.0.1"
},
"agents": {
"researcher": {
"description": "Deep research agent with search tools",
"systemPrompt": "You are a research agent. Use search tools to find information.",
"tools": ["rfpsearch__*", "nb__*"],
"maxIterations": 8,
"model": "claude-sonnet-4-5-20250929"
}
},
"workDir": "~/.nimblebrain",
"telemetry": {
"enabled": true
},
"home": {
"enabled": true,
"userName": "Mat",
"timezone": "Pacific/Honolulu",
"cacheTtlMinutes": 30,
"model": null
}
}
FieldTypeDefaultDescription
$schemastringJSON Schema URI. Set to "https://schemas.nimblebrain.ai/nimblebrain.json" for editor autocompletion.
versionstringConfig file version. Must be "1".
modelobject{ "provider": "anthropic" }Model provider configuration. See model.
defaultModelstring"claude-sonnet-4-5-20250929"Default model ID for agent requests.
maxIterationsinteger10Max agentic iterations per request. Range: 1—25.
maxInputTokensinteger500000Max input tokens per request. The engine stops when this budget is exceeded.
maxOutputTokensinteger16384Max output tokens per LLM call.
bundlesarray[]MCP bundles to spawn. See Bundle Configuration.
noDefaultBundlesbooleanfalseSkip default bundles (e.g., @nimblebraininc/bash).
skillDirsstring[][]Directories to scan for skill markdown files.
skillsarray[]Inline skill definitions.
storeobject{ "type": "memory" }Conversation storage backend. See store.
loggingobject{ "disabled": false }Structured logging config. See Logging.
httpobject{ "port": 3000, "host": "127.0.0.1" }HTTP server config. Omit for programmatic-only use.
agentsobject{}Named agent profiles for delegation. See Agent Profiles.
workDirstring"~/.nimblebrain"Working directory for runtime state (conversations, logs, cache).
telemetryobject{ "enabled": true }Anonymous usage telemetry. See telemetry.
homeobject{ "enabled": true }Home dashboard configuration. See home.

Configure the LLM provider. Only "anthropic" is supported in the config file.

{
"model": {
"provider": "anthropic",
"apiKey": "sk-ant-..."
}
}
FieldTypeRequiredDescription
providerstringYesMust be "anthropic".
apiKeystringNoAnthropic API key. Falls back to the ANTHROPIC_API_KEY environment variable.

Choose where conversations are persisted.

{
"store": {
"type": "jsonl",
"dir": "~/.nimblebrain/conversations"
}
}

The CLI defaults to JSONL storage with conversations in {workDir}/conversations/.

FieldTypeRequiredDescription
type"jsonl" | "memory"YesStorage backend.
dirstringJSONL onlyDirectory for conversation JSONL files.

Control anonymous usage telemetry. NimbleBrain collects anonymized, aggregate usage data with no PII — no bundle names, tool names, error messages, or file paths are sent.

{
"telemetry": {
"enabled": false
}
}

You can also disable telemetry with the NB_TELEMETRY_DISABLED=1 or DO_NOT_TRACK=1 environment variables, or with nb telemetry off. Any of these methods takes effect immediately.

Configure the Home dashboard — a personalized activity briefing shown on the landing page.

{
"home": {
"enabled": true,
"userName": "Mat",
"timezone": "Pacific/Honolulu",
"cacheTtlMinutes": 30,
"model": null
}
}
FieldTypeDefaultDescription
enabledbooleantrueEnable the Home dashboard. When false, / redirects to /chat.
userNamestring"there"Your first name for the greeting (e.g., “Good morning, Mat”).
timezonestring"" (system)IANA timezone for time-aware greetings (e.g., "Pacific/Honolulu"). Empty string uses the system timezone.
cacheTtlMinutesnumber30How long to cache the briefing before regenerating. Minimum: 1.
modelstring | nullnullModel override for briefing generation. null uses the workspace default.

NimbleBrain validates nimblebrain.json at startup against a JSON Schema (draft-07) using AJV.

  • Unknown keys produce a warning to stderr and are ignored.
  • Structural errors (wrong types, missing required fields) throw an error and prevent startup.
[config] Warning: unknown key "foo" in /home/user/.nimblebrain/nimblebrain.json (ignored)
Error: Invalid config in /home/user/.nimblebrain/nimblebrain.json:
- /maxIterations: must be integer

CLI flags take precedence over values in the config file:

FlagOverrides
--config <path>Config file location
--workdir <dir>workDir field and config file location
--model <id>defaultModel field
--port <n>http.port field
--debugEnables verbose debug event logging

The smallest valid config file:

{
"$schema": "https://schemas.nimblebrain.ai/nimblebrain.json",
"version": "1",
"bundles": [],
"skills": []
}

This uses all defaults: Anthropic provider (key from ANTHROPIC_API_KEY), default model, the @nimblebraininc/bash default bundle, in-memory conversation storage, and structured logging enabled.