Skip to main content

sorbet-cli : dependency analysis and SBOM generation for code, containers and binaries

CI License: Apache-2.0

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
scanning this repository, then asking why one component is in the SBOM

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); --offline disables it entirely. No telemetry.
  • Contained failures. An unparseable file becomes an analysis-gap annotation instead of failing the scan.
  • Reproducible output. With --reproducible, scanning unchanged input twice produces the identical file, because timestamps come from SOURCE_DATE_EPOCH instead 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, fleet and 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.

the sorb evidence explorer: dashboard, component inventory and dependency graph

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=native runs 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 snapshot compares installed state before and after a step such as a package install.
  • sorb watch records the same as trace, 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)

Source distribution for sorb 0.2.0
File Size Uploaded Provenance
sorb-0.2.0.tar.gz 1.9 MB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for sorb 0.2.0
File Interpreter ABI Platform
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page