What is an SBOM?

A Software Bill of Materials (SBOM) is a complete, machine-readable inventory of all components in a software artifact — direct dependencies, transitive dependencies, and their metadata. Think of it as an ingredient list for your software.

boring.tools generates SBOMs in the following industry-standard formats:

FormatVersionsOutput
CycloneDX1.5, 1.6JSON, XML
SPDX2.3JSON

All outputs are compliant with NTIA minimum elements and EU CRA requirements.

Supported package ecosystems

boring.tools detects the package manager automatically from your project’s lockfile:

LockfilePackage manager
bun.lockBun
package-lock.jsonnpm
pnpm-lock.yamlpnpm
go.sumGo modules
poetry.lock / requirements.txtPython (PyPI)
Cargo.lockRust
pom.xmlJava (Maven)

Ways to generate an SBOM

Connect a Git repository to a project and boring.tools generates an SBOM automatically on every new commit. Scans run approximately every 30 minutes by polling for new commits. You can also trigger a manual scan at any time.

See Git Integration for setup.

2. Manual upload

Upload an existing SBOM file directly in the UI:

  1. Open your project
  2. Click Upload SBOM
  3. Select a CycloneDX (JSON or XML) or SPDX (JSON) file
  4. Click Upload

SBOM detail view

Click any SBOM in the project’s SBOM list to open its detail page. The page has three main sections:

Shows the SBOM name, version, format (e.g. CycloneDX 1.6), scan status, upload date, and the time of the last scan. A Re-scan button lets you re-run vulnerability matching at any time.

While a scan is in progress, a live progress bar shows how many packages have been checked (X / Y).

Vulnerability summary

Six stat tiles (Critical, High, Medium, Low, Unknown, Total) show the current vulnerability counts for this specific SBOM.

Vulnerabilities table

The full list of detected CVEs with the following columns:

ColumnDescription
IDCVE ID or OSV ID, links to the CVE detail page
SeverityColor-coded badge: Critical / High / Medium / Low
ComponentThe affected package name and version
CVSSNumeric CVSS score (sortable)
Fixed InVersion where the vulnerability is patched, if known
LatestLatest available version in the package registry (links to registry page)
EcosystemPackage ecosystem (npm, Go, PyPI, etc.)
AnalysisYour triage status for this CVE (see below)
PublishedDate the CVE was published (sortable)
LinksDirect links to OSV.dev and NVD/NIST

You can search across all columns using the search box (fuzzy matching by CVE ID, component name, severity, etc.) and sort by Severity, CVSS, or Published date.

If you have suppressed vulnerabilities, a Show suppressed (N) button appears to toggle their visibility.

Components table

A searchable, sortable list of every package in the SBOM:

ColumnDescription
NamePackage name
VersionInstalled version
TypeComponent type (library, framework, etc.)
SupplierVendor or maintainer if available
PURLPackage URL — the unique identifier for the package

Search by name, version, supplier, or PURL.

Scan history

A paginated table of every vulnerability scan run for this SBOM:

ColumnDescription
TriggerHow the scan was started (Upload, Manual, Scheduled)
UserWho triggered it (for manual scans)
StartedTimestamp when the scan started
CompletedTimestamp when it finished
Statuscompleted / failed (with error message on hover for failures)
FoundTotal vulnerabilities found
NewNewly introduced CVEs compared to the previous scan
ResolvedCVEs no longer present compared to the previous scan

Vulnerability analysis (triage)

For each vulnerability in an SBOM, you can record a triage decision. Click the + Add link in the Analysis column (or click an existing analysis badge) to open the analysis panel.

Analysis state

StateMeaning
Not setNo decision recorded yet
In triageUnder investigation
ExploitableConfirmed as exploitable in your environment
Not affectedThe vulnerability does not affect your usage
False positiveIncorrectly identified
FixedA fix has been applied

Justification (for “Not affected”)

When marking a vulnerability as Not affected, you must provide a justification:

  • Code not reachable
  • Code not present
  • Inline mitigations
  • Protected at perimeter
  • Protected by compiler
  • Requires configuration
  • Requires dependency
  • Requires environment
  • Requires other component
  • Not in affected subset

Responses

Select one or more response actions that have been taken:

  • Can’t fix
  • Rollback
  • Update
  • Will not fix
  • Workaround available

Detail / Notes

A free-text field to explain the analysis decision. Supports any notes you want to keep alongside the triage record.

Suppressing a vulnerability

Toggle Suppress vulnerability to hide it from the default view. Suppressed vulnerabilities are excluded from counts and hidden in the table unless you explicitly click Show suppressed. Use this for vulnerabilities you’ve assessed as not actionable in your context.

Click Save Analysis to persist your triage. Click Reset to clear the analysis entirely.

Last updated: May 28, 2025