An honest software
bill of materials.

A CVE severity renders only when OSV/GHSA actually returned it. A version renders only when a lockfile actually pinned it. Everything else is blank — never a placeholder, never a guess. The same discipline a procurement team demands of a hardware BOM, ported to software.

Live demo

Run against a real dependency estate
5,041
components resolved
32
manifests across repos
19
version drifts found
2
EOL runtimes flagged

Every one of the 5,041 rows was parsed deterministically from a manifest or lockfile. Zero rows are model-sourced. 2 drifts are high-severity.

Drift

Same package, divergent major versions
PackageEcoMajorsSeverityWhere
dotenvnpm10 / 16 / 17higheval/package.json ^16.3.0, package.json ^17.3.1, pipeline/package.json ^16.3.1, streetmerchant/package.json ^10.0.0
puppeteernpm21 / 24 / 9highurlFetcher/package.json ^21.6.1, crawler-service/package.json ^21.6.1, package.json ^24.40.0, pipeline/package.json ^21.7.0, streetmerchant/package.json ^9.1.1
@types/jestnpm29 / 30mediumcrawler-service/package.json ^30.0.0, pipeline/package.json ^29.5.11
@types/nodenpm16 / 20mediumurlFetcher/package.json ^20.10.4, crawler-service/package.json ^20.10.4, eval/package.json ^20.0.0, functions/package.json ^20.0.0, package.json 20.19.37
@types/nodemailernpm6 / 8mediumpackage.json ^8.0.0, streetmerchant/package.json ^6.4.4
@types/reactnpm18 / 19mediumwalter-ui/package.json ^19, package.json ^18.3.28
@types/react-domnpm18 / 19mediumwalter-ui/package.json ^19, package.json ^18
@types/uuidnpm10 / 9mediumpackage.json ^10.0.0, pipeline/package.json ^9.0.7
@vitejs/plugin-reactnpm4 / 6mediumwalter-ui/package.json ^4, package.json ^6.0.2
firebase-adminnpm12 / 13mediumfunctions/package.json ^13.10.0, package.json ^13.10, pipeline/package.json ^12.0.0
groq-sdknpm0 / 1mediumeval/package.json ^0.5.0, package.json ^1.1.2
nodedocker16 / 18mediumcrawler-service/Dockerfile 18-slim, streetmerchant/Dockerfile 16.18.0-alpine3.16
nodemailernpm6 / 8mediumpackage.json ^8.0.7, streetmerchant/package.json ^6.6.3
openainpm4 / 6mediumeval/package.json ^4.0.0, package.json ^6.33.0, pipeline/package.json ^4.28.0
reactnpm18 / 19mediumwalter-ui/package.json ^19, package.json ^18.3.1
react-domnpm18 / 19mediumwalter-ui/package.json ^19, package.json ^18.3.1
typescriptnpm4 / 5mediumwalter-ui/package.json ^5, crawler-service/package.json ^5.3.3, eval/package.json ^5.3.0, functions/package.json ^5.0.0, package.json 5.9.3
uuidnpm13 / 9mediumpackage.json ^13.0.0, pipeline/package.json ^9.0.0
vitenpm6 / 8mediumwalter-ui/package.json ^6, package.json ^8

Runtime

Base images & end-of-life risk
RuntimeVersionImageProjectStatus
node16.18node:16.18.0-alpine3.16tomciszek/tools/streetmerchantEOL
bun1oven/bun:1-alpinebomforge/mainsupported
node18node:18-slimbomforge/crawler-servicesupported
python3.11python:3.11-slimbomforge/stripe-apisupported
python3.12python:3.12-slimtomciszek/data/catholicossupported

Lockfile gaps

Declared dependencies with no lockfile (unreproducible builds)

The gate

Why you can trust every badge
A fact is verified only when its source is authoritative — osv, ghsa, nvd, a package registry, the SPDX license list, a resolved lockfile, an image digest. A model's opinion about a severity, a license, or a "latest version" is never verified and never renders a badge. A floating ^4.28.0 with no lockfile is not a version — it stays blank. Real or blank. Never a placeholder.