SBOM Generator

Generate Software Bill of Materials in SPDX and CycloneDX formats. Document dependencies for supply chain security.

Advertisement

Generate an SPDX or CycloneDX SBOM from a manifest or lockfile

Paste a package.json, package-lock.json, requirements.txt, go.mod, pom.xml or one of five other dependency files — or upload it — and get back a software bill of materials in CycloneDX or SPDX. Both standards are supported, in two serialisations each, so whichever format your customer, auditor or scanner asked for is one dropdown away. The file format is detected automatically from the filename or the content, so in practice you paste and read the result.

Everything runs in your browser. The manifest is parsed, the components are assembled and the document is serialised locally; nothing is uploaded and no registry is contacted. For a file that lists every internal package name in your product, that is not a small detail.

What an SBOM is for

An SBOM is an inventory of the third-party components inside a piece of software. The argument for having one is best made by the mornings after a Log4Shell or an xz-utils backdoor, when the only question that matters is “are we running it, and where?”. Organisations with a current SBOM per artefact answer that with a query. Organisations without one answer it by asking every team to go and look, which takes days they do not have.

The regulatory pressure follows the same logic. US Executive Order 14028 pushed SBOMs into federal software procurement, NTIA published the minimum elements a bill of materials has to carry, and the EU Cyber Resilience Act now requires manufacturers of products with digital elements to identify and document the components they ship. The practical consequence for most teams is that an SBOM has quietly become a contractual deliverable — something a customer’s security questionnaire asks for by name, in a named format.

SPDX or CycloneDX? The difference that matters

There are two mainstream standards and they were built for different jobs. Both are widely supported and neither is going away, which is why this tool emits both.

SPDXCycloneDX
StewardLinux Foundation; an ISO/IEC standard (5962)OWASP
Original purposeLicence compliance — who owns what, under what termsApplication security — what is vulnerable, and where
ModelDocuments, packages, files and typed relationships between them (DESCRIBES, CONTAINS, DEPENDS_ON)Components, services, dependencies, and first-class vulnerability and pedigree extensions
Serialisations hereJSON and tag-valueJSON and XML
Version emittedSPDX 2.3CycloneDX 1.5

In practice: if the request came from legal, procurement or an open-source compliance programme, they almost certainly want SPDX — its licence fields are richer and its tag-value serialisation is the one humans read. If it came from a security team, a scanner or a vulnerability-management platform, they want CycloneDX, because the tooling around VEX and vulnerability exchange grew up there. If nobody specified, CycloneDX JSON is the safer default for a modern pipeline; it is what most scanners ingest without configuration.

Both are convertible to a degree, but conversion is lossy in the areas each format was designed for, so generating natively in the format you actually need beats round-tripping.

What goes into the document

For each dependency the tool records the component name, the version, the ecosystem, whether it is a runtime or development dependency, a package URL, and a licence where one is available. The package URL (purl) is the part that does the real work: pkg:npm/express@4.18.2, pkg:pypi/requests@2.31.0, pkg:golang/github.com/gin-gonic/gin@1.9.1. It is an unambiguous, ecosystem-aware identifier, and it is what lets a downstream scanner match your component against a vulnerability database without guessing. Both output formats carry it — CycloneDX in the component’s purl field, SPDX as an ExternalRef of type purl.

SPDX output is emitted with a generated document namespace UUID, a creation timestamp, a DESCRIBES relationship per package, and NOASSERTION in the fields the tool genuinely cannot determine from a manifest — download location, copyright text, and licence where the source file does not state one. CycloneDX output carries a urn:uuid serial number, a metadata block naming the tool, and the top-level application component when the manifest declares a project name and version. NOASSERTION is not a defect; it is the correct value, and inventing a licence would make the document worse.

Supported inputs

FileEcosystempurl type
package.jsonnpmpkg:npm
package-lock.jsonnpmpkg:npm
requirements.txtPythonpkg:pypi
Pipfile.lockPythonpkg:pypi
go.modGopkg:golang
Cargo.tomlRustpkg:cargo
pom.xmlMavenpkg:maven
Gemfile.lockRubypkg:gem
composer.jsonPHPpkg:composer

Detection works from the filename when you upload, and from the content when you paste — a lockfileVersion key marks a package-lock, a _meta key marks a Pipfile.lock, and so on. Dependencies are grouped by scope, so development and optional dependencies are labelled rather than silently mixed in with the ones you actually ship.

Manifest or lockfile? Use the lockfile

This is the choice that decides whether your SBOM is useful, and it is worth being blunt about it.

  • A manifest lists what you asked for. package.json says ^4.18.0. The tool strips the range operator and records 4.18.0, which is the floor of the range, not necessarily what is installed. And package.json carries no licence information about your dependencies at all, so every licence comes out as NOASSERTION.
  • A lockfile lists what you got. package-lock.json pins exact resolved versions and, for most packages, records the declared licence — so this is the one input where the licence breakdown is populated from real data rather than left unasserted.
  • A manifest lists direct dependencies only. The transitive tree is where the interesting vulnerabilities live; Log4Shell reached most of its victims transitively. A lockfile includes them.

If you feed it a package.json you will get a valid, well-formed SBOM of your direct dependencies with unasserted licences. That is fine for a quick inventory and it is not what you should send a customer. Paste the lockfile.

Reading the output before you ship it

Alongside the generated document, the results are broken out into a few views. The dependency tree is searchable, which is the fastest way to answer “do we have X anywhere”. The licence view groups components as permissive, copyleft, proprietary or unknown — the copyleft bucket is the one to read first if you distribute a binary, because AGPL and GPL obligations on shipped software are the ones that generate legal conversations. Anything the tool cannot classify lands in unknown rather than being guessed at.

There is also a vulnerability view, and it is important to understand exactly how small it is: it checks component names against a short built-in list of well-known advisories (lodash, axios, minimist, requests, urllib3, flask, django, rails and a handful of others) using a simplified version comparison. It is an illustration, not a scanner. It does not query the NVD, OSV or GitHub Advisories, it has no network access at all, and “no known vulnerabilities detected” here means nothing beyond “nothing matched a very short list”. The correct workflow is to generate the SBOM here and feed it to a real scanner — that is what the format is for, and it is why the vulnerability data is deliberately not written into the CycloneDX or SPDX output.

Honest limits

  • No hashes. The generated documents do not include component checksums. A manifest does not contain them and the tool makes no network calls to fetch them. If your recipient requires hashes as part of NTIA minimum elements, generate from a build-time tool that has the artefacts on disk.
  • Declared, not resolved. Everything comes from the file you pasted. A manifest-derived SBOM reflects intent; only a lockfile reflects a real dependency graph, and neither reflects what is actually inside a built container image.
  • One ecosystem per run. A polyglot repository needs a pass per manifest, and merging the results is a manual step.
  • Licence text is not verified. Where a licence is recorded it is the string the package declared. Declared licences are wrong often enough that compliance programmes scan the source rather than trusting the metadata.

Within those limits the output is standards-conformant and ready to hand over: CycloneDX 1.5 as JSON or XML, SPDX 2.3 as JSON or tag-value, plus a CSV of the component table for the spreadsheet somebody inevitably asks for. Each downloads with the conventional extension — .cdx.json, .cdx.xml, .spdx.json, .spdx — so tooling that sniffs filenames recognises it without renaming.

Common questions

  • Is my dependency file uploaded anywhere? No. Parsing and generation happen entirely in the browser, and no package registry is queried. Nothing about your dependency graph leaves the machine.
  • Which format should I send if the request just said “an SBOM”? CycloneDX JSON. It is the format most security tooling ingests without configuration. If the request came from legal rather than security, send SPDX.
  • Why are all my licences NOASSERTION? You almost certainly pasted a manifest rather than a lockfile. package-lock.json is the input that carries declared licence data; a plain package.json does not contain it.
  • Why are the versions missing their ^ and ~? Range operators are stripped so the document holds a concrete version string, which is what both standards expect. That resolved version is the range floor, not the installed version — another reason to use the lockfile.
  • Can I use the output for a customer questionnaire? The document is well-formed for both standards. Check whether the questionnaire demands component hashes or supplier fields, which a manifest cannot supply.

Where this fits in a real process

An SBOM generated by hand once, for a questionnaire, is a compliance artefact and nothing more. The version that earns its keep is generated per build, stored with the artefact it describes, and re-scanned when new advisories land — so that the next time a component everybody depends on turns out to be compromised, the answer to “are we affected” is a lookup rather than a fire drill. Use this tool to produce the document you need right now, to see what the two formats actually look like side by side before choosing one, or to check what your dependency file will yield before wiring generation into CI.

What Is an SBOM (Software Bill of Materials)

A Software Bill of Materials (SBOM) is a formal, machine-readable inventory of all components, libraries, and dependencies that make up a software application. Just as a physical product has a bill of materials listing every part and sub-assembly, an SBOM catalogs every open-source library, commercial component, and internally developed module in your software.

SBOMs have become essential for software supply chain security. The 2021 Executive Order on Improving the Nation's Cybersecurity (EO 14028) mandated SBOMs for software sold to the U.S. federal government, and industry adoption is accelerating as organizations seek to manage the risk posed by vulnerabilities in third-party components (as demonstrated by Log4Shell, Spring4Shell, and the xz Utils backdoor).

SBOM Formats

FormatMaintained ByStrengthsCommon Use
SPDXLinux FoundationISO standard (ISO/IEC 5962), comprehensive licensingOpen-source compliance, government
CycloneDXOWASPSecurity-focused, supports VEX, lightweightApplication security, DevSecOps
SWID TagsISO/IEC 19770-2Software identification, asset managementEnterprise IT asset management

What an SBOM Contains

FieldDescriptionExample
Component namePackage or library nameexpress
VersionSpecific version used4.18.2
SupplierWho provides the componentnpm/expressjs
LicenseSoftware licenseMIT
HashCryptographic hash for integritySHA-256: a1b2c3...
DependenciesComponents this component depends onaccepts, body-parser, ...
CPE/PURLStandard identifier for vulnerability matchingpkg:npm/express@4.18.2

Common Use Cases

  • Vulnerability management: When a new CVE is published, search your SBOMs to instantly determine which applications are affected and need patching
  • License compliance: Identify all open-source licenses in your software to ensure compliance with license obligations (GPL, LGPL, AGPL reciprocal requirements)
  • Supply chain security: Monitor components for known vulnerabilities, malicious packages, and end-of-life status across your entire software portfolio
  • Government compliance: Meet SBOM requirements for federal software procurement under EO 14028 and CISA guidance
  • Vendor risk assessment: Request SBOMs from software vendors to evaluate the security and licensing risk of their products before procurement

Best Practices

  1. Generate SBOMs automatically in CI/CD — Manual SBOM creation is unsustainable and error-prone. Use tools like Syft, Trivy, or CycloneDX plugins in your build pipeline to generate SBOMs automatically.
  2. Include transitive dependencies — Your application may directly use 20 packages, but those packages depend on hundreds more. A complete SBOM includes the entire dependency tree.
  3. Update SBOMs with every release — SBOMs are snapshots. Generate a new SBOM for every software release and store it alongside the release artifacts.
  4. Monitor for new vulnerabilities continuously — Generate the SBOM once, but monitor it continuously. New CVEs are published daily for existing components.
  5. Use VEX for vulnerability status — Vulnerability Exploitability eXchange (VEX) documents supplement SBOMs by indicating whether a known vulnerability actually affects your specific usage of a component.

Frequently Asked Questions

What is an SBOM and why do I need one?+

A Software Bill of Materials (SBOM) is a comprehensive inventory of all components, libraries, and dependencies that make up a software application. SBOMs are essential for software supply chain security, enabling organizations to quickly identify vulnerable components, meet regulatory requirements, and manage licensing compliance.

What input formats does the SBOM generator support?+

The tool supports common dependency file formats including package.json and package-lock.json for Node.js/JavaScript projects, requirements.txt and Pipfile for Python projects, go.mod for Go projects, pom.xml for Java/Maven projects, and Cargo.toml for Rust projects. Simply paste or upload your dependency file to get started.

What SBOM output formats are available?+

The tool generates SBOMs in industry-standard formats including CycloneDX (JSON and XML) and SPDX (JSON and tag-value). CycloneDX is widely used in DevSecOps pipelines, while SPDX is an ISO standard commonly used for license compliance. Choose the format that matches your tooling and compliance requirements.

How does the vulnerability scanning feature work?+

The tool cross-references your dependencies against known vulnerability databases to identify components with security issues. It displays vulnerability severity levels and CVE identifiers, helping you prioritize remediation efforts. This is a static analysis based on version matching and does not require network access to your codebase.

What license information does the SBOM include?+

The generated SBOM includes license information for each component when available from the dependency file. The license analysis view helps you identify components using various open-source licenses, making it easier to ensure compliance with your organization license policies and legal requirements.

Is my dependency data kept private?+

Yes, all SBOM generation happens entirely in your browser. Your dependency files are processed client-side using JavaScript and are never uploaded to any server. The generated SBOM remains on your device until you choose to download or copy it.

This tool is provided for informational and educational purposes only. All processing happens in your browser — no data is sent to or stored on our servers. While we strive for accuracy, we make no warranties about the completeness or reliability of results.