provenance is a CLI that generates SBOMs and third-party notices for JavaScript and Rust repositories, and checks that committed outputs stay current.
It is designed to be deterministic, repo-friendly, and boring to operate.
The current baseline focuses on:
- JavaScript projects and workspaces
- Rust crates and workspaces
- Mixed JS/Rust repositories
- Optional container image SBOM generation via
syft
The workflow is file-based:
- one config file
- deterministic generated outputs
- no direct CI pushes to
main - repo-friendly
generate,check, anddiffflows
THIRD-PARTY-NOTICESis a generated inventory of detected third-party components and declared license identifiers. It is not legal advice, and some licenses may require additional attribution text at distribution time.- The safest canonical outputs come from a controlled CI or release environment, especially when your dependency graph includes platform-specific packages.
notice.internal_scopescan be used to exclude first-party scoped packages from generated notices and repo SBOM component inventories.- The JavaScript SBOM reflects whatever is present in
node_modulesat generation time. Install production dependencies only before running (for examplebun install --frozen-lockfile --production, ornpm ci --omit=dev) so the generated SBOM and notices describe the shipped closure and do not include development-only dependencies. For JavaScript projects the tool does not pass cdxgen--required-only, because for bun lockfiles that flag drops shipped transitive dependencies (and production dependencies imported only from type-declaration or test files) instead of dev dependencies. Non-JavaScript projects (for example Rust crates) keep--required-only; mixed JavaScript/Rust projects apply the equivalent required-scope filter only to Cargo components after generation. sbom.exclude_regexescan be used to exclude generated runtime artifacts such aswasm/dist/outputs or root-level*.wasi-browser.jsfiles from SBOM evidence so post-build checks stay deterministic.output_dirmust point to a dedicated directory such asprovenance; the tool refuses to write managed outputs directly into the repository root.
Download a pinned binary from GitHub Releases for CI and automation.
Example for Linux x64:
curl -fsSL -o /tmp/provenance.tar.gz \
https://github.com/stella/provenance/releases/download/v0.1.0/provenance-v0.1.0-x86_64-unknown-linux-gnu.tar.gz
tar -xzf /tmp/provenance.tar.gz -C /tmp
install /tmp/provenance-v0.1.0-x86_64-unknown-linux-gnu/provenance ~/.local/bin/provenanceTo build or install from source instead:
cargo install --git https://github.com/stella/provenance --lockedFor local development:
cargo install --path .The CLI itself is a single Rust binary. Analysis still depends on ecosystem tooling:
cdxgenfor JavaScript and Rust SBOM generation- supported discovery order:
cdxgen,bunx @cyclonedx/cdxgen,npx --yes @cyclonedx/cdxgen
- supported discovery order:
syftfor optional container SBOMs
You can also point the CLI at explicit binaries:
PROVENANCE_CDXGEN=/path/to/cdxgenPROVENANCE_SYFT=/path/to/syft
provenance init
provenance generateprovenance init discovers JavaScript and Rust projects under the current root
and writes .provenance.yml.
provenance generate writes deterministic compliance artifacts into the
configured output directory.
For ongoing verification:
provenance check
provenance diffFor a single-project repo:
provenance/sbom.cdx.jsonprovenance/THIRD-PARTY-NOTICES.txt
For multi-project repos:
provenance/projects/<id>/sbom.cdx.jsonprovenance/projects/<id>/THIRD-PARTY-NOTICES.txt
For each configured container:
provenance/containers/<name>/sbom.cdx.jsonprovenance/containers/<name>/THIRD-PARTY-NOTICES.txt
Repo-level outputs:
provenance/report.json
When there is more than one project or any configured containers:
provenance/THIRD-PARTY-NOTICES.repo.txt
The recommended flow is:
- run
provenance generatewhen dependency inputs change - commit the generated outputs
- run
provenance checkin CI
This repo follows that model directly in GitHub Actions.
cargo fmt -- --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test
cargo test --test integration_real -- --ignored
cargo doc --no-deps
cargo deny check
cargo package --locked