Skip to main content
IronBee works out of the box, and most projects never need to touch config. When you do want to fine-tune which files get verified, change retry limits, or point at a self-hosted collector, this page is the reference. You can edit settings two ways: the ironbee config command (recommended, since it validates and re-applies changes for you) or by editing the JSON files directly.

Config layers

Settings are read from three files and deep-merged. Higher layers override lower ones: Precedence is local > project > global. A key set in the local layer wins over the same key in the project layer, which wins over global. Secrets can also come from the environment: setting IRONBEE_SERVICE_API_KEY (or the legacy IRONBEE_API_KEY) supplies the account API key without committing it to any file.

Editing config from the CLI

Targeting a layer: set, unset, and the read commands accept -g/--global or --local to act on a specific layer (default is the project config). list and get also take --project to read one layer in isolation:
Type coercion: set parses values as JSON when it can (true, 42, [...], {...}) and falls back to a plain string otherwise. Pass --json to force strict JSON parsing. Automatic re-render: when you change a key that affects installed client artifacts (anything under verification, service, collector, browser, node, python, backend, android, terminal, telemetry, privacy, statusLine, otel, codex, runtime, integrations, or the *DevTools overrides), the CLI automatically re-renders your hooks, MCP entries, skill, rule, and permissions. Pass --no-rerender to skip. After a global write on an artifact-affecting key, the CLI offers to propagate it to every registered project. --apply-all accepts without prompting, --no-apply-all declines.
Restart your editor or agent session after changing an artifact-affecting key; it takes effect on the next session.

Core options

Test files are already excluded out of the box — ignoredVerifyPatterns is only for additional paths you want to skip on top of that built-in default.

Placeholders — ${param:}, ${env:}, built-ins

Config string values can interpolate placeholders that IronBee resolves at read time, so one committed config can carry per-developer or per-environment values without hand-editing. Three forms are supported: Each ${param:} / ${env:} reference takes an optional bash-style default after :- (e.g. ${env:staging_url:-http://localhost:3000}), and resolves in this order:
  • ${param:api_url}IRONBEE_PARAM_API_URL env → the params block (local → project → global) → the :- default → the literal text (with a warning).
  • ${env:staging_url}IRONBEE_ENV_STAGING_URL env → the :- default → the literal text.
The env: / param: prefix is implied and never written${env:staging_url} can only read IRONBEE_ENV_STAGING_URL, so arbitrary environment variables (AWS_SECRET_ACCESS_KEY, tokens, …) are structurally unreachable from config text. Write a literal ${ as $${. Upper-case shell forms like ${HOME} in check arguments are left untouched.
Placeholders resolve for runtime consumers (checks, context injection, the collector). Values baked into committed client artifacts are read raw and kept as literal references, so a resolved value never lands in a shared artifact — the supported keys are the runtime-read ones (verification.checks[] command/args/env/cwd and verification.context.message). ironbee config get <key> (merged) prints the resolved value with a provenance note on stderr; a layer-scoped read (--project / --global / --local) shows the raw on-disk text.

Runtime

Switching runtime.location doesn’t move existing session data — it changes where new sessions are written. Old per-session folders under the previous location are left in place; you can delete them by hand if you don’t need them.

Verification


Verification cycles

The six cycles: browser, node, python, backend, android, and terminal, share the same set of keys (replace <cycle> with browser, node, python, backend, android, or terminal): Defaults differ per cycle: The exact default patterns each cycle uses when verifyPatterns is unset:
Matches code and markup files by extension (project-wide):
Targets typical Node.js server entry points and API routes (applies once the cycle is enabled):
Targets typical Python server entry points, web-framework modules, and WSGI/ASGI apps (applies once the cycle is enabled):
Multi-language coverage of common server-side directories (applies once the cycle is enabled). The {...} extension set is ts,js,mjs,cjs,py,go,java,rb,cs,rs,kt,scala,ex,exs,php,clj:
Covers standard Android project layouts Gradle modules, Kotlin/Java source trees, and resources (applies once the cycle is enabled):
Covers CLI entrypoints, command trees, and shell scripts (applies once the cycle is enabled):
These defaults are defined in the CLI (not written into config.json) and may grow with new CLI versions. Setting verifyPatterns replaces the list for that cycle; additionalVerifyPatterns appends to it. The only built-in skip list is the always-on test-file exclusion baked into ignoredVerifyPatterns (**/*.spec.*, **/*.test.*, **/__tests__/**, **/__mocks__/**); anything you add to ignoredVerifyPatterns is unioned on top. Non-code files simply don’t match the patterns above.
Prefer the ironbee browser / node / python / backend / android / terminal commands for turning cycles on and off; they write <cycle>.enable and re-render artifacts for you. Reach for verifyPatterns only when you need to change which files a cycle covers.

Verification context

Controls the path-scoped verification guidance IronBee injects from .ironbee/VERIFICATION.md files. On by default; these keys are read live at verification time, so changes take effect on the next session without re-rendering artifacts.
Earlier CLI versions used a top-level verificationContext.* namespace. These keys now live under verification.context.*; update any scripts or committed config that still reference the old names.

Service identity

The service section is the CLI’s shared identity: one credential and one stage selector that every IronBee service — the event-ingest collector, the read-side API (used by ironbee verify and the o11y trace tools), and the Console links — resolves from. ironbee login writes it for you; you’d only set it by hand to self-host or to run in CI. See Authentication for the difference between the two credentials.
Older configs kept the credential under collector.oauthToken / collector.apiKey. Those keys (and their IRONBEE_OAUTH_TOKEN / IRONBEE_API_KEY env vars) still work as read fallbacks, so nothing breaks — but new logins write service.*, and the service.* keys win when both are present.

Collector

The collector is what ships your session data to the IronBee Console. Its endpoint and credential come from the service section above; the keys here tune delivery (and carry the legacy credential fallbacks).

Telemetry


Privacy

DevTools env overrides are applied after the privacy flags, so set ironbeeDevTools.env.COLLECTOR_ARTIFACTS_ENABLE / COLLECTOR_EVENTS_TOOL_DETAILS_ENABLE back to "true" to let one channel through while privacy mode is on.

Issue-tracker integrations

Connect Jira, Linear, or GitHub Issues — see the Issue Tracking guide for the setup flows (ironbee integrations <provider> setup) and what the integration does. A provider activates by configuration presence (a configured credential turns it on; GitHub is on whenever the gh CLI is authenticated); its enable key is an opt-out kill-switch.
Secrets belong in the global config (~/.ironbee/config.json) — setup writes them there for you. Installed artifacts carry only a ${file:…} reference to the global config, so no token is ever baked into a committed file. In CI, supply them via the credential env vars instead.

Jira

Linear

GitHub Issues


VCS linkage

Links each session to the pull request it produced and the issues that PR closes — the join key behind the Console’s per-issue cost and verification views. A sub-feature of analytics: the effective switch is analytics.enable and vcs.enable, and it runs in every mode (enforce / assist / monitoring-only). See Issue Tracking → VCS linkage.

Web console


File change capture


Import


Statusline (Claude Code only)

Integrates session status into Claude Code’s statusline while preserving any statusline you already have. Manage it with ironbee claude statusline enable / disable.

Claude OAuth access (Claude Code only)

Controls whether IronBee may read your Claude Code OAuth token to fill statusline rate-limits for plans whose statusline JSON omits them (team / enterprise). Manage with ironbee claude oauth-access enable / disable / status. See Claude Code → Claude OAuth access.

Codex (Codex CLI only)

Controls how the Codex verification cycle is driven. Manage with ironbee codex verifier mode <sub-agent|main-agent>. See Codex → How verification is delivered.

Cursor (Cursor only)

Controls whether IronBee may read your local Cursor session token and call Cursor’s per-user usage API to enrich Cursor analytics with exact per-request tokens and cost. Manage with ironbee cursor api-access enable / disable / status.

OTEL collector

IronBee runs a local OTEL collector daemon that turns Claude Code’s OTLP export into session_context (context-usage) events. One daemon per machine, started and reaped automatically. Manage it with ironbee claude otel.

Devtools MCP overrides

All cycles are served by a single ironbee-devtools compose MCP server, customized via the ironbeeDevTools keys:
IronBee always sets its own invariants (PLATFORM=compose, COMPOSE_PLATFORMS, metadata flags) last; these can’t be overridden.
The legacy per-cycle keys (browserDevTools, nodeDevTools, pythonDevTools, backendDevTools, androidDevTools, terminalDevTools) still exist for back-compat but no longer feed the compose server — use ironbeeDevTools to customize the one server that serves every cycle.

Automatic pipeline keys

These sections auto-enable when a collector is configured and rarely need manual tuning. Browse them with ironbee config list or the TUI Configuration area:
  • recording: session recording for the browser and Android cycles (recording.enable); the node, python, backend, and terminal cycles never trigger it.
  • jobQueue: the file-backed background queue that feeds the collector (jobQueue.enable, flush thresholds).
  • analytics: per-session structural analytics and how often they emit (analytics.enable, analytics.emitOnStop, and per-event opt-in/opt-out flags).

Common setups

Ignore extra files

Test files (**/*.spec.*, **/*.test.*, **/__tests__/**, **/__mocks__/**) are excluded by default — you don’t need to list them. Add ignoredVerifyPatterns only to skip more paths (e.g. generated code, fixtures); your entries are unioned with the built-in test-file defaults:

Backend-only project (no browser cycle)

Or use the CLI: ironbee browser disable && ironbee backend enable.

Monitoring only (no enforcement)

Assist mode (verify on demand, never gated)

Or use the CLI: ironbee verification auto disable.

Capture code diffs in analytics


What’s next?

Environment variables

Overrides that take precedence over the config files.

Runtime files

Where these config files live and what else IronBee writes to disk.