v0.11.0 Latest release · Apache-2.0

Fail the build when scan results cross your limits.

Gatecheck reads a scanner report, compares it with the thresholds in a config file, and exits non-zero when one is crossed. One binary. Stateless. Nothing to host.

$ go install github.com/gatecheckdev/gatecheck/cmd/gatecheck@latest

Needs Go 1.26 or newer.

gatecheck validate -f gatecheck.yaml grype-report.json
critical
8 / limit 0
high
14 / limit 5
medium
limit off
low
limit off
ERR grype severity limit exceeded severity=critical report=8 limit=0
INF vulnerability detected id=GHSA-whpj-8f3w-67p5 severity=Critical
INF vulnerability detected id=GHSA-2jcg-qqmg-46q6 severity=Critical
…
ERR grype severity limit exceeded severity=high report=14 limit=5
Error: validation failure: Grype: Severity Limit Exceeded
Grype fixture from test/, trimmed exit 1 · build blocked
reads Grype Trivy osv-scanner CycloneDX Syft SARIF Semgrep Gitleaks trufflehog Scorecard LCOV Clover Cobertura enriches with EPSS CISA KEV VEX

A report goes in. An exit code comes out.

No server, no database, no account. Gatecheck runs in the job, reads files, and returns an exit code.

01 — report

A scanner writes a report

Grype, Trivy, a SARIF tool, an SBOM, a secrets scan, or a coverage file. Gatecheck reads the type from the contents. gatecheck bootstrap installs pinned, checksum-verified scanners.

$ gatecheck grype app:latest -o json > grype-report.json
02 — thresholds

You set the limits

gatecheck config init prints a config with every limit off. Turn on the ones you mean to enforce.

grype:
  severityLimit:
    critical:
      enabled: true
      limit: 0
    high:
      enabled: true
      limit: 5
03 — verdict

CI passes or fails

gatecheck validate exits 1 when a limit is crossed and 0 when the report is inside it. A bad input exits 2, and missing EPSS or KEV data exits 3, even with --audit.

inside every limitexit 0 · pass
a limit crossedexit 1 · fail

What it checks

gatecheck ls prints any report as a table. Every command takes --help.

VULNERABILITIES

Grype, Trivy, osv‑scanner

Severity counts, a CVE deny list, and a list of accepted CVEs.

SBOM

CycloneDX and Syft

The same CVE checks for CycloneDX vulnerabilities, and license gating for SBOM packages: deny GPL, require an allow list, or fail unknown licenses.

STATIC ANALYSIS

Semgrep and SARIF

Severity limits and rule allow and deny lists for any SARIF tool, such as gosec, hadolint, zizmor, KICS, or Checkov.

SECRETS

Gitleaks and trufflehog

Fail the job when a report contains a secret, or only when trufflehog verified it is live.

SUPPLY CHAIN

OpenSSF Scorecard

A minimum aggregate score, and minimums for single checks such as Token-Permissions.

TESTS

Coverage

Line, function, and branch thresholds for LCOV, Clover, and Cobertura.

EXPLOITS

EPSS and KEV

FIRST EPSS scores on ls --epss and as a limit, and a fail on any CVE in the CISA known-exploited catalog. download epss and download kev save the data for offline runs.

ACCEPTED RISK

VEX

Skip findings an OpenVEX or CycloneDX VEX document marks not affected, so risk decisions live in a file other tools read too.

bundle

Keep every report from a run in one archive.

bundle create and bundle add pack scan reports into a single gzipped tarball with a manifest of what is inside, so the evidence travels with the build.

$ gatecheck bundle create gatecheck-bundle.tar.gz grype-report.json
$ gatecheck bundle add gatecheck-bundle.tar.gz semgrep-report.json
$ gatecheck bundle add gatecheck-bundle.tar.gz gitleaks-report.json
$ gatecheck ls gatecheck-bundle.tar.gz

One step in any pipeline.

A non-zero exit fails the job, so it works with GitHub Actions, GitLab CI, or anything else that runs a shell. The report type comes from its contents, and --format json gives the result to the next step.

  • Single static binary for Linux, macOS, and Windows
  • Stateless: no server to provision or keep running
  • Config lives in your repo next to the pipeline
.github/workflows/security.yaml
- name: Install pinned scanners
  run: gatecheck bootstrap --tools grype

- name: Scan the image
  run: gatecheck grype app:latest -o json > grype-report.json

- name: Validate the Grype report
  run: gatecheck validate -f gatecheck.yaml grype-report.json

Put a gate in front of your next deploy.

Start with gatecheck config init > gatecheck.yaml and turn on one limit.