Using a Configuration File

Set default options for Noir using a config.yaml file.

Put the options you use on every scan in a config.yaml file, so you don't have to retype them.

File Location

OS Path
macOS ~/.config/noir/
Linux ~/.config/noir/
Windows %APPDATA%\noir\

Set NOIR_HOME to use a different directory.

Settings in the config file are defaults; command-line flags override them. Use --config-file <path> to load a config from a non-default location:

noir scan . --config-file ./ci/noir.yaml

You can also manage the config file directly through noir config:

noir config init   # create the default config (idempotent)
noir config show   # print the active file
noir config edit   # open the file in $VISUAL / $EDITOR
noir config path   # print the resolved path

Directory Structure

~/.config/noir/
├── config.yaml          # Configuration file
├── cache/
│   └── ai/              # LLM response cache
└── passive_rules/       # Passive scan rules

Example config.yaml

---
# Default base path for scans
base: "/path/to/my/project"

# Always use color in the output
color: true

# Default output format
format: "json"

# Base URL for probing; also required by exclude_codes / status_codes / probe
url: "https://api.example.com"

# Exclude certain status codes (needs a target URL, so it pairs with `url` above)
exclude_codes: "404,500"

# Enable all taggers by default
all_taggers: true

# Attach 1-hop handler callees to each endpoint
include_callee: true

# Attach AI review context (guards, callee, sources, sinks, validators, signals)
ai_context: true

# Default AI provider and model
ai_provider: "openai"
ai_model: "gpt-5.5"

# Passive security scan (equivalent to -P / --passive-scan)
passive_scan: false
passive_scan_severity: "high"

# Exit with code 2 if any analyzer failed or skipped a file
strict: false

# Disable loading spinner animations
no_spinner: false

# Fire HTTP probes at discovered endpoints (needs `url`)
probe: false

# Skip TLS certificate verification for probe/export (insecure)
tls_skip_verify: false

This is equivalent to running:

noir scan /path/to/my/project -f json -u https://api.example.com --exclude-codes "404,500" -T \
  --include callee --ai-context \
  --ai-provider openai --ai-model gpt-5.5

Key reference

noir config init writes a fully commented file with every supported key. The example above shows only some of them. CLI flags always override the file. The keys below match the generated file. Legacy v0 names such as send_es / send_proxy still load, but migrate to the v1 names.

Scan paths and scope

Key Type CLI equivalent Notes
base string or list positional paths / -b Default path(s) to scan
url string -u / --url Base URL for paths; required by status/probe options
exclude_path CSV globs --exclude-path Skip matching files
techs CSV -t / --techs Add techs to the analyzer set (on top of auto-detect)
only_techs CSV --only-techs Restrict which tech detectors run
exclude_techs CSV --exclude-techs Drop techs from the final set after detection
concurrency int --concurrency / NOIR_CONCURRENCY Worker count (default: CPU count clamped to 4-32). Precedence: flag > NOIR_CONCURRENCY > config > default

Output

Key Type CLI equivalent Notes
format string -f / --format plain, json, yaml, oas3, curl, …
output string -o / --output Write results to this file
color bool inverse of --no-color ANSI color in plain output
nolog bool --no-log Show results only
no_spinner bool --no-spinner Disable spinner animations
strict bool --strict Exit 2 when an analyzer fails or skips a file
status_codes bool --status-codes Probe and attach HTTP status codes (needs url)
exclude_codes CSV --exclude-codes Drop these statuses; probes on its own (needs url)
include_path bool --include path Legacy boolean form of --include
include_techs bool --include techs Legacy boolean form of --include
include_callee bool --include callee Attach 1-hop handler callees
ai_context bool --ai-context Attach AI review context
ai_context_features CSV --ai-context LIST Subset: guards, callee, sources, sinks, validators, signals

Parameter values

Key Type CLI equivalent Notes
set_pvalue list --pvalue any=… Fill values for every param type
set_pvalue_header list --pvalue header=… Header values
set_pvalue_cookie list --pvalue cookie=… Cookie values
set_pvalue_query list --pvalue query=… Query values
set_pvalue_form list --pvalue form=… Form values
set_pvalue_json list --pvalue json=… JSON body values
set_pvalue_path list --pvalue path=… Path values

Passive scan and taggers

Key Type CLI equivalent Notes
passive_scan bool -P / --passive-scan Enable passive scan
passive_scan_path list --passive-scan-path Custom rule directories (replaces bundled rules)
passive_scan_severity string --passive-scan-severity critical / high / medium / low
passive_scan_auto_update bool --passive-scan-auto-update Update rules at startup
passive_scan_no_update_check bool --passive-scan-no-update-check Skip update check
all_taggers bool -T / --use-all-taggers Enable every tagger
use_taggers CSV --use-taggers Enable selected taggers
tagger_rules_path list --tagger-rules Custom YAML tag rule files or directories (always run)

Probe and export

Key Type CLI equivalent Notes
probe bool --probe Send HTTP requests to discovered endpoints (needs url)
probe_via string --probe-via Proxy URL for probes
probe_header list --probe-header Extra probe headers
probe_match list --probe-match Only probe matching endpoints
probe_skip list --probe-skip Skip matching endpoints
tls_skip_verify bool --tls-skip-verify Skip TLS verify for probe/export/webhook
export_es string --export-es / --export-opensearch Elasticsearch or OpenSearch URL (both flags write this key)
export_webhook string --export-webhook POST catalog JSON to this URL

AI and cache

Key Type CLI equivalent Notes
ai_provider string --ai-provider Provider prefix or full URL
ai_model string --ai-model Model name
ai_key string --ai-key / NOIR_AI_KEY In shared configs, use NOIR_AI_KEY or --ai-key-file instead
ai_agent bool --ai-agent Enable the agentic tool-calling loop
ai_agent_max_steps int --ai-agent-max-steps Agent loop cap
ai_no_optimize bool --ai-no-optimize Skip the LLM optimizer pass
ai_dry_run bool --ai-dry-run Show what would be sent to the provider; send nothing
ai_include_sensitive bool --ai-include-sensitive Also send credentials files to the provider
ai_native_tools_allowlist CSV --ai-native-tools-allowlist Providers allowed to use native tools
ai_max_token int --ai-max-token Max tokens per request (0 = provider default)
ai_max_requests int --ai-max-requests Max AI HTTP requests per run, retries included (0 = unlimited)
ai_stream bool --ai-stream Stream endpoint-extraction replies from OpenAI-compatible providers (SSE)
ai_scope string --ai-scope Files sent to the AI analyzer (all or unmatched)
ai_temperature number --ai-temperature Sampling temperature, 0-2 ("" = 0.3)
ai_seed number --ai-seed Sampling seed where supported ("" = none)
cache_disable bool --cache-disable Disable the LLM response cache
cache_clear bool --cache-clear Clear the cache before the run

Diff and diagnostics

Key Type CLI equivalent Notes
diff string --diff-path Prior code path for diff output
diff_ref string --diff-ref Git revision to diff against
fail_on string --fail-on Diff findings that make the scan exit 3 (comma-separated)
config_file string --config-file Usually set only via CLI
debug bool -d / --debug Debug logging
verbose bool --verbose Verbose logging (--include path + all taggers)