limbo.watch

Open source. GitLab, GitHub, Gitea and Forgejo. Release 0.1.0a13, an alpha.

Find what your scanner can’t see yet.

limbowatch scan checks your lockfiles against all 10,059 advisories in limbo, the ones Dependabot, npm audit and OSV-Scanner don’t report yet. It shows what it finds where your team already looks, and tells you which upgrade clears it.

Try it

pipx install limbowatch-cli==0.1.0a13
limbowatch scan .

Needs OSV-Scanner 2.7.1. Guide

See it on real packages. Our public proof repository pins nats-server, typebox, go-openapi/spec, mustache, scapy and others at versions with fixed advisories in limbo. Its daily run shows Limbowatch reporting every one, while OSV-Scanner, npm audit, pip-audit and Dependabot stay silent on them and report the old control packages.

In your terminal

One table per lockfile, the upgrade that clears each package, and a verdict. This is the demo pull request that adds scapy==2.7.0.

Terminal output of limbowatch scan: a table of findings per lockfile with severity, package, installed and fixed version and advisory; a To fix list of seven upgrades; and the verdict FAILED, 9 findings at or above high.Terminal output of limbowatch scan: a table of findings per lockfile with severity, package, installed and fixed version and advisory; a To fix list of seven upgrades; and the verdict FAILED, 9 findings at or above high.
51 advisories in limbo for scapy alone: the table shows the 4 high ones and folds the rest; -v lists all of them.

In your pull request

The GitHub action writes SARIF for code scanning, annotates each affected package without it, and adds a summary to the run.

A GitHub pull request diff adding scapy==2.7.0 to requirements.txt, with a code scanning alert inline on the added line: GHSA-c547-xwrv-q9jm, published advisory not yet in GitHub's database or OSV.A GitHub pull request diff adding scapy==2.7.0 to requirements.txt, with a code scanning alert inline on the added line: GHSA-c547-xwrv-q9jm, published advisory not yet in GitHub's database or OSV.
Code scanning alerts on the line the pull request adds.
The GitHub Actions job summary: Failed, 9 findings at or above high; 67 advisories in limbo; a To fix list; and a table of the findings that fail the build.The GitHub Actions job summary: Failed, 9 findings at or above high; 67 advisories in limbo; a To fix list; and a table of the findings that fail the build.
The job summary: the verdict, what to upgrade, and the findings that fail the build.

In your merge request

The GitLab CI/CD component works on every tier, Free included.

A GitLab merge request: the pipeline's Limbowatch report artifact, 'Code Quality scans found 51 new findings', and 'Test summary: 9 failed, 67 total tests'.A GitLab merge request: the pipeline's Limbowatch report artifact, 'Code Quality scans found 51 new findings', and 'Test summary: 9 failed, 67 total tests'.
Code Quality shows the 51 new findings, the test summary the 9 that fail the build, and “Limbowatch report” links every report.

Every report from one scan

Write as many as you need: -o table -o sarif=x.sarif -o junit=junit.xml -o html=report.html. Exit codes: 0 passed, 1 a finding meets --fail-on, 2 the scan couldn’t run.

tableThe terminal and CI logs, coloured; one verdict line at the end
jsonAutomation: findings, upgrades, summary and gate result (schema_version 1)
markdownPull request comments and job summaries
htmlA standalone report to keep as a CI artifact
sarifGitHub code scanning and other SARIF 2.1.0 tools
codequalityGitLab Code Quality in merge requests, every tier
junitTest summaries in GitLab, Jenkins, Azure DevOps, CircleCI
csvSpreadsheets
cyclonedxCycloneDX 1.6 with vulnerabilities, for SBOM tools
githubAnnotations on the pull request, one per package, no code scanning needed
The standalone HTML report: Failed, 9 findings at or above high; a To fix list; and a table per lockfile with severity badges, versions, advisory links and affected ranges.The standalone HTML report: Failed, 9 findings at or above high; a To fix list; and a table per lockfile with severity badges, versions, advisory links and affected ranges.
The HTML report: no scripts, nothing loaded from elsewhere, safe to keep as an artifact.

What it finds

1,080

confirmed findings in 13 popular open-source projects that GitHub’s Dependabot didn’t alert on, though every affected package was in its dependency graph. It raised 2,020 alerts on the same files, none of them for these.

16 vs 0

on a demo app with real npm, Go, pip and Bundler lockfiles: Limbowatch found 16 advisories in limbo in six packages. OSV-Scanner and GitHub’s Dependabot alerts reported none of them.

51

new findings when a change adds one affected package, in GitLab’s merge request and inline on GitHub.

Use it

  1. 1

    GitLab CI · in the CI/CD Catalog

    include:
      - component: $CI_SERVER_FQDN/limbowatch/limbowatch-component/limbowatch@0.1.0-alpha.13
        inputs:
          fail_on: high
  2. 2

    GitHub, Gitea or Forgejo Actions · in GitHub Marketplace

    permissions:
      contents: read
      security-events: write   # for the SARIF upload
    steps:
      - uses: actions/checkout@v4
      - uses: limbowatch/limbowatch-action@v0.1.0a13
        with:
          fail-on: high
          sarif: limbowatch.sarif
      - if: always()
        uses: github/codeql-action/upload-sarif@v4
        with: { sarif_file: limbowatch.sarif, category: limbowatch }
  3. 3

    On your machine

    pipx install limbowatch-cli==0.1.0a13   # needs OSV-Scanner 2.7.1
    limbowatch scan .

    This is an alpha: options and formats may change before 0.1.0. Full guide · Changelog

What it does, and what it doesn’t

  • Reads lockfiles with OSV-Scanner, offline. The feed is downloaded whole, so limbo.watch learns nothing about your project.
  • Never drops a dependency. A range-only requirement, a git install or an unreadable lockfile is listed with the reason.
  • It’s a head start. Most of these advisories are reviewed eventually, after weeks; then your usual scanner reports them and Limbowatch notes that they’re visible. In ecosystems GitHub doesn’t review, the wait may never end.
  • Ranges are as entered by maintainers and haven’t been reviewed. A range that contradicts its own fix is reported as possible, never silently passed.
  • Large projects need a read-only GitHub token, to check the upstream repos the tracker doesn’t watch.