Scan your project in 10 seconds.

DepSentinel checks your dependencies before they are installed or deployed and blocks malicious packages, typosquatting, dangerous install scripts and vulnerabilities. Free, local and open source.

go install github.com/AlejandroMolines/depsentinel/cmd/depsentinel@latest

With Go 1.22 or later you install the depsentinel command. Then, inside your project: depsentinel scan. (You can also use Docker without installing: see README and installation docs.)

$ depsentinel scan --ci --fail-on highDepSentinel 0.1.0 · ~/online-storenpm, Docker, GitHub Actions · 1328 packages · 4 manifests SEVERITY  PACKAGE                       RULE           DETAILcritical    npm event-stream@3.3.6        malicious       Known compromised version…critical    npm minimist@1.2.0            vulnerability   Prototype Pollution in min…high       actions some-org/deploy@main  action-pinning  Action pinned to a mutable branch m…high       docker node:latest            remote-script   Downloads and runs a remote s…high       npm lodash@4.17.15            vulnerability   Command Injection in lodas…medium      npm reactt@1.0.0              typosquat       Possible typosquatting of «…low        npm core-js@3.30.2            install-script  Runs scripts on install… What to do first  • event-stream@3.3.6 — Remove it, reinstall from scratch and rotate credentials ac…  • minimist@1.2.0 — Update to 1.2.6 or later.  • some-org/deploy@main — Pin the action to the full commit SHA: uses: some-or… Summary: 1328 packages · 2 critical · 3 high · 1 medium · 1 lowOverall risk: CRITICAL✖ 5 findings of severity high or higher: build fails.
Sample output, abridged, from a fictional project. Exit code 1: CI stops.

You chose 19 packages. 1,328 were installed.

Measured with DepSentinel on the package-lock.json of a test React project. Each dot is a package installed on your machine and in your CI, and any of them can run code when installed. Almost nobody has read any of them.

  • 19 the ones you wrote in package.json
  • 3 run scripts on your machine when installed
  • 1,306 you never chose

DepSentinel checks them all in seconds.

What it looks for in every scan

Seven checks, each with an explanation and a concrete way to fix it.

Known malicious packages
Every dependency is checked against OSV (the OpenSSF MAL-* advisories) and a signed local database that keeps working offline. It recognizes cases such as event-stream@3.3.6, crossenv or the hijacked versions of ua-parser-js.
Typosquatting
Names almost identical to popular ones: reactt, lodassh, reqeusts. It measures edit distance and package age so legitimate packages are not flagged.
Dangerous install scripts
Reads preinstall, install and postinstall. With --deep it downloads the package, checks its hash against the lockfile and reads the code those scripts run: remote downloads, reverse shells, credential theft.
Known vulnerabilities
CVE and GHSA advisories via OSV, with CVSS severity and the version that fixes them. depsentinel fix bumps direct dependencies and pins GitHub Actions to a SHA.
Abandoned dependencies
Packages with no releases for years, deprecated or yanked versions, and packages that no longer exist in the registry.
Odd version or maintainer changes
99.x versions typical of dependency confusion, new publishers or maintainers right on the latest version, and tarballs that do not match the lockfile.
Beyond npm
PyPI, Go, Dockerfiles and GitHub Actions: curl | sh in a Dockerfile, actions not pinned to a SHA, pull_request_target checking out the PR, command injection in workflows.

From zero to blocking in CI

Three steps. The first two need no account and no server.

  1. Install it

    go install github.com/AlejandroMolines/depsentinel/cmd/depsentinel@latest

    A single binary with no dependencies. There is also a Docker image, and binaries with checksums on every release.

  2. Scan your project

    cd my-project
    depsentinel scan

    It picks up whatever lockfiles, Dockerfiles and workflows it finds. depsentinel report --html --open opens the dashboard with the details of every package.

  3. Make CI enforce it

    - uses: AlejandroMolines/depsentinel/action@v1
      with:
        fail-on: high

    It comments the result on every pull request and fails the build on high risk. An exception only counts if it carries a written justification.

This is the comment DepSentinel leaves (and updates, without duplicating it) on every pull request. The comment text is currently in Spanish.

What leaves your machine, and what does not

DepSentinel runs on your computer or in your CI. There is no account, no server of ours and no telemetry.

Leaves, only when online

  • The name and version of each public package, to api.osv.dev, to look up security advisories.
  • The package name, to registry.npmjs.org, pypi.org or proxy.golang.org, to read dates and maintainers.

Never leaves

  • Your code, your full lockfile, your machine's paths, tokens and environment variables.
  • Packages installed from git, local paths or URLs.

You decide

--offline opens no connection at all and uses only the local rules. --no-osv and --no-registry switch each source off separately, and DEPSENTINEL_OSV_URL points to an internal mirror. The malicious-package database is downloaded with depsentinel db update and verified with an Ed25519 signature before use. Only two commands that you run on purpose reach other places: db update downloads the feed from the repository and fix queries api.github.com to resolve the SHA of an action.

Free. Always.

Free for individuals, open-source projects and education. Donations are not available yet: when they are, they will pay for the domain, the feed servers and security audits. Companies will be able to sponsor, but no sponsorship or donation will unlock features.

Every month we publish how much comes in and what it is spent on: see the accounts.