1

Install

AIROM is a single static binary. The wheel bundles it, so pip gives you the CLI without a Go toolchain:
Install
Prefer Go? go install github.com/airomhq/airom/cmd/airom@latest works too, but the binary lands in $(go env GOPATH)/bin and the next step fails with command not found if that directory is not on your PATH. See Installation for every method and for the PATH fix.
2

Verify

Verify
A pip install reports the exact release it came from. A plain go install prints dev / none / unknown instead, because the version, commit, and date are stamped in at build time with ldflags and go install does not set them. The scanner is fully functional either way.
This is the same ToolInfo that gets embedded in every AIBOM AIROM writes, so a document can always be traced back to the build that produced it.
3

Scan

Point it at your project. scan auto-detects what the target is: an existing local path, then a git URL, then an image reference.
Scan the current directory
The default output is a table on stdout:
The scan exited 0. Findings are not failures: AIROM inventories, it does not judge. To make CI fail, opt in with --fail-on.
4

Cut the noise

Extension-only dataset detection and keyword-only ai-config matching emit low-confidence rows (the 0.5 ai-config entries above). Filter them at the presentation layer:
Only high-confidence components
0.8 is the practical threshold on a general-purpose directory. See Confidence for how the scores are assigned and combined.
5

Emit real documents

The table is for humans. -o takes fmt[=path] and is repeatable, so one scan can produce every artifact you need:
CycloneDX + SARIF in one pass
That writes a CycloneDX 1.6 ML-BOM with evidence.occurrences[] intact, a SARIF file for code-review annotations, and still prints the table.
Need CycloneDX 1.7? --cdx-version 1.7. The default is 1.6.

Where the evidence lives

The table’s LOCATION column points at the primary sighting and EVIDENCE counts how many back a component. The structured outputs carry the full file:line provenance for every occurrence, along with the matched snippet, the enclosing symbol, the detector that fired, and a per-occurrence confidence. --wide expands the same detail under each table row.
Inspect the occurrences
The gpt-4.1 row in the table is not an assertion. It is src/rag.py:8, columns 9 to 24, matched by rules/openai/model-literal through source-code analysis, with the literal text that triggered it.

Wire it into CI

Use a --fail-on policy expression. & (AND) binds tighter than | (OR), and all terms in a clause must hold for a single component.
Fail the build on high-confidence hosted models
Want to report matches without failing? --exit-code 0 alongside your --fail-on policy.

Next

Installation

pip, Go install, prebuilt binaries, and building from source.

CLI reference

Every command, flag, and exit code.

Evidence model

Occurrences, detection methods, and identity claims.

Scan a container image

Tarballs and OCI layouts, offline.