sorbet-cli : dependency analysis and SBOM generation for code, containers and binaries
Sorbet CLI (sorb) is an open-source, cross-platform dependency-analysis
and SBOM-generation tool.
Point it at software - a code repository, a container image, a binary, infrastructure config, or a whole machine - and it produces an evidence-backed SBOM (CycloneDX 1.6, SPDX 2.3/3.0): every component carries occurrence evidence, a provenance chain, and a confidence score.
pip install sorb # or: uv tool install sorb / pipx install sorb
sorb scan . # scan a repo
sorb scan image:alpine:3.20 # scan a container image, per layer
sorb ui # browse the results in a local web UI
Features
- Explainable output.
sorb explain <component>reports which detector found a component, in which file and at which byte range, and how its confidence was derived. - Offline by default. Network access is opt-in per scan (
--allow-net);--offlinedisables it entirely. No telemetry. - Contained failures. An unparseable file becomes an
analysis-gapannotation instead of failing the scan. - Reproducible output. With
--reproducible, scanning unchanged input twice produces the identical file, because timestamps come fromSOURCE_DATE_EPOCHinstead of the clock. An SBOM can then be committed and regenerated in CI, where any diff means a dependency really changed. - A queryable evidence graph. Each scan writes an SQLite graph shared by
explain,query,diff,merge,fleetand the UI. SBOM files are views over it, and any result exports as a CycloneDX or SPDX subgraph.
The evidence explorer
sorb ui opens a local, fully offline web UI over any scan: an overview
dashboard, a filterable component inventory, an expandable dependency tree,
per-layer container attribution, fleet-wide version skew, and SBOM export —
every number clickable down to its evidence.
What it scans
| Target | Examples |
|---|---|
| Source trees | npm/pnpm/yarn, Python, Go, JVM (Maven/Gradle), .NET, Ruby, PHP, Rust, C/C++ (vcpkg/Conan/CMake), and a dozen long-tail lockfile formats |
| Container images | image:REF registry-direct, OCI layouts, docker-save archives, daemons/containerd, running containers - with per-layer attribution, base-image splitting, and multi-arch support |
| Compiled binaries | ELF/PE/Mach-O/WASM link graphs, embedded ground truth (Go buildinfo, cargo-auditable, .NET CLR), signature-DB fingerprinting of stripped/static libraries |
| Mobile & installers | APK/AAB/IPA, installers, firmware images |
| IaC | Terraform, Kubernetes/Helm/Kustomize, CloudFormation, Bicep, Ansible, Dockerfiles - with --follow-images chaining referenced images into container scans |
| Whole machines | host:// inventories a running host (marking what's observed running and on which ports); disk:// reads disk images agentlessly - no mount, no root |
It also inventories two things that are not packages:
- Certificates and keys (a CBOM). Each certificate is recorded with its subject, issuer and expiry date. Private keys are noted as present, but their contents are never read into the SBOM.
- Machine-learning models (an ML-BOM). Safetensors, GGUF, ONNX, PyTorch and pickle files, with their format and tensor metadata. Formats that run code when loaded, such as pickle and TorchScript, are flagged.
Beyond static analysis
Static analysis is the default. These optional modes gather more:
sorb scan --resolve=nativeruns the ecosystem's own build tool inside a deny-by-default sandbox (Linux and macOS) and reads what it resolved.sorb trace -- <cmd>runs a command and records which libraries it actually loads, finding dependencies that are used but never declared, and declared but never used.sorb snapshotcompares installed state before and after a step such as a package install.sorb watchrecords the same astrace, but across a longer session.
Working with SBOMs
sorb convert other.spdx.json -o cyclonedx-json --loss-report
sorb merge a.cdx.json b.spdx.json -o cyclonedx-json
sorb diff v1.cdx.json image:app:2.0 --fail-on-change
sorb validate sbom.json --require ntia
sorb sign / attest / verify # air-gapped DSSE signing and verification
sorb query 'components where confidence < 0.9 | count by ecosystem'
sorb fleet '.sorb/results/*.sorb.db' -q '…' # one question across every scanned host
For CI: --fail-on drift,stale-lockfile,version-conflict,phantom-deps, stable
exit codes, a GitHub Action (action.yml), and a container image.
Scope
sorb generates SBOMs. Vulnerability matching is out of scope: that is the
job of whatever platform consumes the SBOMs downstream.
Documentation
docs/usage.md- installation, every command, targets, formats, flags, configuration.docs/architecture.md- how it's built: the evidence model, pipeline, subsystems, storage, plugins, testing.docs/support.md- every ecosystem and file format read, and what is not supported yet.docs/plugins.md- writing a cataloger or emitter, and the WASM plugin ABI.
Extending
Findings from all three plugin tiers are re-validated before they reach the graph, so a plugin cannot inject unchecked claims, impersonate a first-party detector, or claim more confidence than its technique allows.
- Entry-point plugins - trusted Python packages registering catalogers or
emitters (
examples/sorb-plugin-example/). - WASM plugins - untrusted, must be signed, run with no filesystem,
network, or environment access and a CPU-fuel cap (
pip install 'sorb[wasm]'). - gRPC plugins - out-of-process services, contacted only when named in
trusted config (
pip install 'sorb[grpc]').
The last two are declared per project in sorb.toml; see
docs/plugins.md for the ABI and configuration.
Development
uv venv --python 3.13 .venv && uv pip install -e ".[dev]" -p .venv/bin/python
.venv/bin/sorb scan . # scan this repo
.venv/bin/pytest -q # tests (network-blocked)
.venv/bin/ruff check src tests && .venv/bin/mypy && .venv/bin/lint-imports
Requires Python ≥ 3.12. The optional Rust accelerator (native/sorb-accel)
is used only after a load-time check proves its output byte-identical to the
pure-Python implementation, which remains the reference.
License
Apache 2.0.
Metadata
Release files for sorb 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| sorb-0.2.0.tar.gz | 1.9 MB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sorb-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.3 MB
Release files / sorb-0.2.0.tar.gz
| Download URL | sorb-0.2.0.tar.gz |
|---|---|
| Size | 1.9 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2392b1cf9da0ceccd71499749d963436b4436e2a30484f61fb13270bd1e8d163
|
|
BLAKE2b-256 checksum How to use checksums |
380200ed0c21c654a611ba9d6b4ae675c252b063dd6043cb83be707b9c6d245a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 15, 2026.
Transparency logRelease files / sorb-0.2.0-py3-none-any.whl
| Download URL | sorb-0.2.0-py3-none-any.whl |
|---|---|
| Size | 461.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
37e59d98ea5cb8223977f5f5a510cbfd4de1ff01596eec0a0ca7fc4ab599f3dd
|
|
BLAKE2b-256 checksum How to use checksums |
aefd60821aac13883ec8fd2a6eb8a0f99c77aaf41e1c24a36b3f2d40e0324a3a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 15, 2026.
Transparency logSecurity for sorb 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for sorb-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 15, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.