SBOM generation, recorded during the build
CRACI is an SBOM generation tool that records what each GitHub Actions build actually pulled in, instead of scanning files afterwards. Every SBOM says how complete it is.
In short: run your GitHub Actions jobs on CRACI runners and every job gets an SBOM of the packages it fetched, including transitive dependencies and packages restored from CI caches, exported in CycloneDX or SPDX. Each SBOM carries a completeness state and is monitored for new vulnerabilities after release. Scanning tools such as Syft and Trivy reconstruct an SBOM from files; CRACI records it from the build. Why build-time SBOMs differ.
Recorded During the Build, Not Scanned Afterwards
Most SBOM generators read files after the build and reconstruct what they think went in. CRACI generates the SBOM inside its own CI runner. A package-aware proxy observes each job's traffic to package sources, so the SBOM lists what the job actually pulled in, transitive dependencies included, rather than what a manifest says it should need. No lockfile, no installed tree and no extra scan step are needed for the record to exist.
Every Layer of Transitive Dependencies
Most of what a build pulls in is not a direct dependency. It is a dependency of a dependency, several layers down, and some of it never appears in a lockfile at all: prebuilt binaries a build script downloads, packages restored from a cache, operating system packages. CRACI records every package the job fetched, at every depth, so vulnerabilities are matched against the whole tree. In side-by-side comparisons with other SBOM tools, that more complete record has surfaced vulnerabilities the other tools did not report.
Packages Restored From CI Caches Stay in the SBOM
Caches are where build-time recording usually breaks: a package restored from a cache never touches a registry, so a proxy alone would miss it. CRACI carries dependency evidence with the cache, so packages restored from a CI cache stay in the SBOM of the job that restored them.
A Completeness State for Every Job
Vulnerability tracking can only match the components your SBOM lists. A package missing from the SBOM is a vulnerability nobody is alerted about. So instead of presenting every SBOM as complete, CRACI states completeness for each job and each cache: Complete, Complete with connections, Incomplete, Unavailable or Not recorded. You know which SBOMs you can rely on and which need a second look.
The Ecosystems and Formats You Ship
CRACI records packages from npm, PyPI, RubyGems, Cargo, Go, Nix, OCI, apt, apk and Git sources, plus Yocto and OpenEmbedded download presets, and treats JFrog Artifactory npm and PyPI mirrors as known sources. Maven and Java support is on the roadmap. SBOMs export in CycloneDX and SPDX, including transitive dependencies, ready to share with customers, partners and auditors.
Declared Licenses on Every Component
Every recorded package carries its declared license into the SBOM. You can see which dependencies are under a commercial or otherwise restrictive license before you ship, and copyleft licenses are caught before they end up in your product.
Provenance Through the API
The SBOM is one part of what CRACI records for each job. The public REST API returns SBOMs, network traces and provenance, all recorded from the same build.
Monitored After Release
An SBOM is how a company knows what is inside the software it ships, and customers and regulators increasingly ask for one: the Cyber Resilience Act requires manufacturers to draw one up for products sold in the EU. CRACI keeps re-evaluating monitored SBOMs as new vulnerabilities are published, aggregates findings across builds and repositories, and supports VEX. The SBOMs you collect from your own vendors are monitored alongside your builds.
A recorded SBOM next to a scanned one
Scanners are the right tool for software you did not build. For your own releases, this is what recording the build changes. A scanner reads the lockfile or the output and works out what went in. CRACI sees the traffic coming into the build, so the hidden dependencies that install hooks, build scripts and base images pull in end up in the SBOM too.
| Capability | CRACI | Scanner-based SBOM tool |
|---|---|---|
| How the component list is produced | Recorded from the build's own package traffic | Reconstructed from files after the fact |
| Needs a lockfile or installed dependencies | No | Usually one or the other |
| Packages restored from CI caches | Evidence travels with the cache | Only if the files are there when it scans |
| Completeness state per job | Five states, per job and per cache | |
| Signed link from artifact to build | No signed provenance | With a separate signing step |
| Software you did not build | Add the vendor's SBOM instead | |
| CI systems | GitHub Actions today; other CI systems on the roadmap | Runs in any CI |
- Included
- Partly
- Not included
- On the roadmap
Comparing specific tools? See SBOM tools compared for Syft, Trivy, cdxgen, the Microsoft SBOM Tool, Dependency-Track and more. For the wider picture, see software supply chain security tools compared.
SBOM basics: SPDX, CycloneDX and OpenVEX
What an SBOM records, how the SPDX and CycloneDX formats differ in practice, and what OpenVEX adds about whether a vulnerability actually affects a product.
Petteri Pulkkinen and Erika Marttinen at Kubernetes Community Days Helsinki 2026, 16:50 to 22:05 of SBOMbastic: Getting Ready for Upcoming EU Cybersecurity Regulation in Software Supply Chains.
SBOM generation: frequently asked questions
What is SBOM generation?
SBOM generation is producing a software bill of materials: a machine-readable list of the components and dependencies in a piece of software. It can be done from source files, during the build, or by analyzing a finished artifact such as a container image. CRACI generates the SBOM during the build, from what the build actually fetched.
How does CRACI generate an SBOM?
Your GitHub Actions jobs run on CRACI runners. As each job runs, a package-aware proxy observes its traffic to package sources and records the packages it pulls in, including transitive dependencies and packages restored from CI caches. Each job gets its own SBOM with a completeness state.
Do I have to change my workflows?
You change runs-on to craci. CRACI replaces the runner, not GitHub Actions, so your workflows and their runs stay in GitHub.
Which package ecosystems does CRACI record?
npm, PyPI, RubyGems, Cargo, Go, Nix, OCI, apt, apk and Git sources, plus Yocto and OpenEmbedded download presets. JFrog Artifactory npm and PyPI mirrors are treated as known sources. Maven and Java support is on the roadmap.
Which SBOM formats can I export?
CycloneDX and SPDX, including transitive dependencies and each component's declared license.
What does the completeness state mean?
Complete means CRACI observed complete job evidence and every restored cache was complete. Complete with connections means the job also used custom network connections worth reviewing. Incomplete means a condition could leave dependencies out. Unavailable means the evidence could not be evaluated, and Not recorded means the job predates completeness reporting.
Does CRACI find vulnerabilities in the SBOM?
Yes. CRACI keeps re-evaluating monitored SBOMs as new vulnerabilities are published, aggregates findings across builds and repositories, and supports VEX. Security teams triage what it finds and send it to the teams that own the fix.
Can CRACI generate an SBOM for software I did not build?
No. CRACI records the builds that run on its runners. For software you buy, add the vendor's SBOM and CRACI monitors it alongside your own builds. For a third-party image you did not build, a scanner is the practical choice; see SBOM tools compared.
See the SBOM of your own build
Book a demo, run one of your GitHub Actions workflows on CRACI and see what it actually pulled in
Book a demo