mrkeyoor.com_
Tue 10 Nov 05:42 UTC
Dev Toolsevaluationupdated 24 Oct 2026

syft review

Syft is Anchore's CLI and Go library for generating software bills of materials from container images and filesystems. Its README lists archive scanning, dozens of package ecosystems, and CycloneDX, SPDX and Syft JSON output. Vulnerability matching requires a scanner such as Grype.

+33stars / 7d
Verdict

Syft is worth evaluating when you need SBOM generation across container images and filesystems, several output formats, or a Go library. In our October 9, 2026 run at commit 546c872, the build step exited 0 in 170 seconds, while the test command exited 1 in 232 seconds and the build tail recorded vet-exit:1. Those observations do not establish that the product is broken or that an installed CLI works. Before adoption, scan representative artifacts and check the identifiers and relationships your downstream tools actually consume; use a separate scanner for vulnerability matching.

We ran it

Lab card: what happened when we ran syftScreenshot of syft (github.com/anchore/syft)
Install✓ · 62s858 packages
Build✓ · 170s
Tests✗ · 232s113 passed · 33 failed of 146 (go test)
Repo2944 files~228,540 lines of source · 34.3 MB · 4 CI workflows · Dockerfile · tests dir

Answers from our run

Does syft build from source?

Dependencies installed in 62 seconds (858 packages), and the build succeeded in 170 seconds. We cloned commit 546c872 into a clean Debian container with 3 CPUs and no project-specific setup.

Do syft's tests pass?

No. The project's own test command finished in 232 seconds and reported 113 passed, 33 failed (go test).

Who should not use syft?

Teams expecting Syft's inventory command alone to report known vulnerabilities.

What are the alternatives to syft?

Trivy, Microsoft SBOM Tool. Syft is worth evaluating when you need SBOM generation across container images and filesystems, several output formats, or a Go library.

Setup3/5The README lists several installation routes and our build step exited 0, but no installed-binary check was recorded; vet and test results were not clean.
Docs3/5The README explains basic targets and output options and links installation, configuration and schema documentation. Those linked documents and their walkthroughs were not evaluated here.
Community3/5The README invites contributions and lists community meetings; issue 5173 contains contributor discussion. This supports visible participation, not measured adoption or response quality.
Maturity3/5v1.51.0 documents specific cataloger and output fixes, but our later commit's test command exited 1 and inventory accuracy was not measured.

Who it’s for

Release teams that need container or filesystem inventories in several SBOM formats.
Security teams that will pass an inventory to a separate vulnerability scanner.
Go developers who want SBOM generation through a library.
Teams prepared to validate package identifiers and dependency relationships against their own artifacts.

Who it’s NOT for

Teams expecting Syft's inventory command alone to report known vulnerabilities.
Consumers that assume CycloneDX and SPDX expose interchangeable dependency graphs without checking their semantics.
Contributors who need a verified clean test run at commit 546c872: our recorded test command exited 1, and the available logs do not establish all causes.
Buyers requiring measured scan speed, inventory accuracy or installed-binary compatibility from this review: our recorded run did not establish those results.

Setup reality

In our recorded run on October 9, 2026, at commit 546c872c9d942216d9ddc0da4909cb06fcac356c, the dependency step completed in 61.514 seconds, rounded to 62 seconds by the harness. The recorded dependency count was 858. The install tail reports downloading go1.26.8; completing this step does not establish that the Syft CLI was installed.

The build step exited 0 after 169.994 seconds, rounded to 170 seconds. Its tail also contains unkeyed-field warnings, an unreachable-code diagnostic and vet-exit:1. The build-step success therefore does not establish a clean vet result. The test command exited 1 after 232.306 seconds, rounded to 232 seconds, without timing out.

The parser recorded 113 successful package results, 33 failed package results and 38 packages with no tests. These are package-level summaries, not individual test counts. The reported total of 146 combines successful and failed package results; unique and exhaustive coverage was not verified through complete-log reconciliation.

The configured sandbox had 3 CPUs, 8 GB of memory and image golang:1.24-bookworm. That image label does not establish the effective toolchain version. The checkout contained 2,944 files, approximately 228,540 source lines and 34.3 MB, with 4 CI workflows, a Dockerfile and a tests directory. The README also lists installation routes including Homebrew, Docker, Scoop, Chocolatey and Nix; we did not test those routes.

Syft can produce several SBOM formats, but choosing a format does not establish that its dependency graph answers your policy question. For release and security teams, the useful evaluation is whether the inventory contains the packages, identifiers and relationships their downstream tools need.

What Syft provides

The Syft README describes a CLI and Go library for generating SBOMs from container images and filesystems. It lists archives, dozens of package ecosystems, format conversion, CycloneDX, SPDX, Syft JSON and signed attestations using the in-toto specification. These are documented capabilities, not workloads measured in our run. The README pairs Syft with Grype for vulnerability scanning.

Its basic image example uses alpine:latest. For repeatable release evidence, use an immutable image digest and record the Syft version, configuration and output format. The installation example uses curl | sudo sh; review installation scripts and artifacts under your organization's normal release policy. We did not assess the security of that installation route.

What our recorded run establishes

Our stored run is dated October 9, 2026, at commit 546c872c9d942216d9ddc0da4909cb06fcac356c, whose recorded commit date is October 7, 2026. It used a sandbox configured with 3 CPUs, 8 GB of memory and image golang:1.24-bookworm. The install tail says go: downloading go1.26.8 (linux/amd64), so describing the effective toolchain simply as Go 1.24 would be misleading.

The dependency step exited 0 in 61.514 seconds, with 858 dependencies recorded. This is dependency setup, not an installed-binary check. The build step exited 0 in 169.994 seconds, but its tail includes unkeyed-field diagnostics, unreachable code and vet-exit:1. We can report successful completion of the recorded build step, not a clean static-analysis result.

The test command exited 1 in 232.306 seconds and did not time out. The parser recorded 113 successful package results and 33 failed package results, plus 38 packages with no tests. Its total of 146 covers the successful and failed package results. These figures are not counts of individual test cases, and the stored parser summary has not been reconciled against a complete log to verify unique, exhaustive coverage.

The available test tail names failures in Python, Red Hat and Rust catalogers, stereoscope sources and CLI tests, including Test_Unknowns. It does not show a missing-Docker error or establish the causes of all failures. Assigning those failures to Docker would exceed this run's evidence.

The checkout had 2,944 files, approximately 228,540 source lines and 34.3 MB. It included 4 CI workflows, a Dockerfile and a tests directory. No separate installed-binary check, representative scan workload, scan-speed benchmark, accuracy evaluation or security audit is supplied. A failed test command alone does not prove that Syft cannot perform its documented scanning tasks.

Check relationship semantics before relying on a graph

Issue 5173 reports missing language-package dependency edges and differences between CycloneDX and SPDX graphs for the same images. Those are the reporter's observations, not our measurements. An August 25 contributor comment describes encoder-level differences at bf82010f; an October 12 contributor comment asks for clarification of the report. Neither comment establishes the behavior of our measured commit across the reporter's corpus.

The report explicitly describes a data-quality issue for consumers that use declared relationships, rather than a vulnerability. Its practical lesson is to check what an edge means before computing reachability or comparing graph completeness across formats. A containment relationship and a dependency relationship answer different questions.

For an adoption trial, select artifacts with known expected packages and dependency edges. Generate the formats your consumers require, inspect the identifiers and relationships, and document any gaps. We have not performed that trial, so this review cannot certify graph completeness.

Release notes describe fixes, not our test results

The v1.51.0 release notes list fixes involving legacy JAR PURLs, phantom JavaScript packages, hardlink handling in SPDX verification codes and Git for Windows CPE candidates. These are upstream release claims. They explain why inventory identifiers and output details deserve validation, but they do not establish that our later checkout passed those regression tests. v1.51.0 is a release reference here, not the verified version of an installed binary from our run.

Choosing an alternative

Trivy is relevant when the requirement combines SBOM inventory with vulnerability, misconfiguration or secret scanning. Microsoft SBOM Tool is relevant when SPDX 2.2 or SPDX 3.0 generation and separate shipped-file and build-component inputs fit the release workflow. These distinctions come from their primary documentation; we did not run a comparative evaluation.

How to read the scores

Scores are editorial assessments on a five-point scale: 1 means substantial documented obstacles, 2 means limited support in the supplied evidence, 3 means a documented route with material validation still needed, 4 means strong evidence with bounded gaps, and 5 requires broad verification beyond feature lists. They do not measure adoption, compatibility or scan accuracy. Unknowns limit the scores rather than counting as product defects.

Syft's documented scope makes it a candidate for teams that need several SBOM formats or Go integration. The next useful step is a small inventory-validation trial on your own release artifacts, followed by a separate vulnerability-scanning step if that is part of your workflow.

Alternatives

ProjectWhat it isPick it when
Trivy gh↗A security scanner whose README lists SBOM inventory, known vulnerabilities, misconfigurations and secrets among its scanner capabilities.Choose Trivy when you want to evaluate inventory and several security checks within one CLI. Its README supports that scope; we did not compare its results with Syft.
Microsoft SBOM ToolAn SBOM generator supporting SPDX 2.2 and SPDX 3.0, with separate inputs for shipped files and build components.Choose Microsoft SBOM Tool when SPDX output and a workflow that distinguishes release files from build-component evidence match your requirements. We did not benchmark it against Syft.

What people are saying

  1. [github-trending] anchore/syft

Sources

  1. Syft README
  2. Syft v1.51.0 release
  3. Syft issue 5173
  4. Syft repository activity

More dev tools reviews

folly · universal-android-debloater-next-generation · OpenSandbox · You-Dont-Know-JS · evilginx2 · google-colab-cli · the whole board →

Related reading