.openqodex.yaml at the root of the repository. Every key is optional. With no file, the defaults apply, and OpenQodex warns but never blocks.
--config <path> reads another file instead.
An unknown key prints a warning and is ignored. A value of the wrong type stops the run with exit 2 and names the key.
A full example
Severity
OpenQodex uses one scale:critical, major, minor, nitpick, info. Scanner severities map onto it:
- critical to
critical - high to
major - medium to
minor - low to
nitpick - info to
info
version
1, the only version. Optional.
review.block_on_severity
One ofcritical, major, minor, nitpick, info. The default is unset.
- Unset: OpenQodex warns and never blocks. No command exits 1. The push gate never denies a push.
- Set: the verdict is
blockedwhen a finding on a changed line is at or above this severity.scanandreviewexit 1. The push gate denies a push unless a finished review of the current change passed.
review.paths.exclude
A list of globs. The default is an empty list. A matching file is left out of the change. The brief does not show it, and no finding in it is kept. Scanners do not receive it as a changed file. A scanner that reads a whole project, such as brakeman or golangci-lint, may still read it. Globs match the path from the repository root, with forward slashes:*matches any characters except/.**matches any characters,/included.?matches one character except/.
**/ prefix does not match a file at the repository root. **/*.min.js matches web/app.min.js but not app.min.js. To match both, list **/*.min.js and *.min.js.
review.disabled_rules
A list of globs matched against a finding’s citation,<source>:<rule>. A matching finding is dropped. The default is an empty list.
gitleaks:generic-api-keydrops one gitleaks rule.semgrep:python.lang.*drops a family of semgrep rules.lens:react-*drops agent findings that cite a review pattern whose name starts withreact-.custom:trivy:*drops every finding of the custom scanner namedtrivy.
review.include_fixtures
true or false. The default is false.
With false, scanner findings in test fixtures, mocks, stubs, fakes and snapshots are dropped. A path counts when one of its folders is fixtures, __fixtures__, mocks, __mocks__, snapshots, __snapshots__, fakes, stubs or testdata. It also counts when the file name holds .fixture., .mock. or .stub. (or their plurals), or ends in .snap. Test files themselves are not dropped.
scanners.disable
A list of built-in scanner names to switch off. The names aresemgrep, gitleaks, sqllint, osv-scanner, actionlint, hadolint, shellcheck, ruff, brakeman, rubocop, bandit, oxlint and golangci. A disabled scanner is listed in the report as disabled.
scanners.custom
A list of custom scanners. Each one needs two keys:openqodex trust. custom-scanners explains the step.
source
The GitHub link of the scanner’s repository,https://github.com/<owner>/<repo>. Required.
run
The command line. Required. OpenQodex splits it into words and starts the first word as the program. It never runs the line through a shell, so pipes,&& and $VAR have no effect.
Three placeholders are filled in:
{report}: the file the scanner writes its report to.{target}: the files to scan. Seetarget.{repo}: the repository root.
name
The scanner’s name in the report, ascustom:<name>. The default is the repository name from source. Letters, digits, dot, dash and underscore only. Two entries cannot share a name.
version
The release to use, such as0.58.1. The default is the latest release at the time you run openqodex trust.
format
sarif or json-map. The default is sarif. json-map reads any JSON report through a map block.
map
Required whenformat is json-map. Each value is a dotted path into the report, with [n] for a list index.
items: the path to the list of results..means the report itself is the list. Required.file: the file path in one result. Required.line: the start line. Required.end_line: the end line. Optional.rule: the rule id. Required.severity: the scanner’s severity. Optional.message: the message. Required.reference: a link for the rule. Optional.severity_map: maps the scanner’s severity words tocritical,high,medium,loworinfo. A word not in the map reads asmedium.
custom-scanners has a worked example.
paths
A list of globs. The scanner runs only when a changed file matches one, and receives only matching files. The default is every changed file.target
changed or repo. The default is changed.
changed:{target}is the changed files.repo:{target}is the repository root.
timeout_seconds
A whole number of seconds. The default is120.
install
How OpenQodex gets the scanner. The default downloads the GitHub release asset that fits your machine. Use one of these forms instead:install: path: use the program already on yourPATH. Nothing is downloaded.install: { asset: <name> }: the release asset to download, when OpenQodex cannot pick one.install: { binary: <path> }: the program’s path inside the asset, when it is not at the top.install: { sha256: <hex> }: the expected sha256 of the asset, in lowercase hex.install: { npm: <package@version> }: install the scanner from npm.install: { uv: <package==version> }: install the scanner from PyPI through uv.
asset, binary and sha256 combine. npm and uv stand alone.