SentinelloSentinello

An early-warning system for the dependencies you stopped watching.

In the AI age you ship more projects than you can maintain. Sentinello watches every one and surfaces known CVEs in their dependencies — JavaScript by default, with Python, Go, and Rust a toggle away — so a forgotten project never becomes an incident.

Run it in one command:

docker run -d \
  --name sentinello \
  -p 127.0.0.1:3870:3000 \
  --stop-timeout 60 \
  -v sentinello-data:/app/data \
  -v sentinello-nvm:/home/sentinello/.nvm \
  -v ~/Developer:/roots/personal:ro \
  ghcr.io/walkofcode/sentinello:latest

Runs on linux/amd64 and arm64

No account. No SaaS. No telemetry. One Docker image and one SQLite file — your code and your findings never leave your machine.

Or skip the portal entirely

The same scanners ship as a CLI. No install, no account, no database — it runs, prints an advisory your agent can act on, and exits.

npx sentinello

Piped, stdout carries only the markdown, so the advisory reaches an agent intact:

npx sentinello | claude -p "$(cat -)"

Walks the folder

Point it at a directory and it finds every project underneath, stopping at each project root so a monorepo counts once rather than fifty times. .gitignore and .sentinelloignore are honoured.

Checks three sources

Resolves the exact installed versions from the lockfile and matches them offline against a local advisory cache. No per-project network call, and nothing about your code is uploaded.

Writes an advisory

A dated markdown file with the findings and a remediation prompt attached — triage before touching anything, prefer parent upgrades over overrides, verify fixes in the lockfile.

How it differs from npm audit

It isn't a replacement for npm audit — it runs npm audit, then adds two advisory sources npm audit cannot see, and suppresses anything they duplicate.

npm auditnpx sentinello
ScopeThe one project you are standing in.Every project under a folder, in one pass and one report.
Advisory sourcesYour registry's advisory feed.That, plus OSV and GitLab gemnasium. Duplicates are suppressed, so each extra source only adds net-new findings.
Malicious packagesNot covered.OSV's MAL- records flag packages published with malware — typosquats, install-script payloads — matched against the specific compromised versions.
OutputA table, or JSON you have to interpret.A markdown advisory with a remediation prompt attached, ready to hand to an agent.
MatchingA registry call per project.Offline against a local cache. The first run downloads it and asks first; later runs transfer almost nothing.

The extra sources are not a formality. On Sentinello's own repository, npm audit and OSV each report three findings and agree on all of them — while the single critical finding comes from gemnasium, which neither of the other two carries.

Features

Everything in one self-hosted portal — no external services, no data leaving your network.

Single triage queue

See and triage CVEs across your whole portfolio in one place — instead of npm audit scattered across a dozen checkouts.

Browse by project or library

Drill into any repository for its findings, fix versions, and history — or pivot to a vulnerable package to see every project it affects and mute it everywhere at once.

Multi-language scanning

Scans JavaScript out of the box and adds Python, Go, and Rust with a per-language toggle — parsing each project's lockfile offline and matching it against OSV and GitLab gemnasium advisories.

Continuous scanning

A background worker rescans on a schedule, so new advisories show up without you remembering to check.

Multiple sources

Beyond npm audit: match against the OSV database for broader CVE coverage and known-malicious package detection.

Notifications & webhooks

Get failure and finding alerts via Slack, Telegram, or a plain webhook — scoped per root or project, in the language you choose. JSON or plain-text payloads for an auto-fix agent.

MCP server

Connect Claude Desktop, Cursor, and other MCP clients to query findings, projects, and libraries — and trigger scans — without leaving the chat.

Advisory export

Export findings for a project or library as Markdown, with a customizable remediation prompt for your team or an LLM.

Single image, single file

One Docker image and one SQLite file. No database server, no message queue, no cloud dependency.

Auto-registered roots

Anything mounted under /roots is registered and scanned on boot — the directory name becomes its label.

Per-project Node

Respects each project's .nvmrc, installing and caching the Node version it pins, once.

10 languages

The portal UI, scan reason codes, and statuses are localized to 10 languages.

Screenshots

See it in action — the portal scanning a handful of demo projects. Click any shot to expand it.

How it compares

Sentinello isn’t a heavier Dependency-Track or a cheaper Snyk. It owns a different niche: the long tail of projects nobody wired into a pipeline.

SentinelloDependency-TrackSnykDependabot
Zero-config — point it at a folder~~
No SBOM / CI step required
Scans real resolved lockfiles~
Malicious-package detection
Self-hosted, no SaaS
Single image + SQLite
AI-native (MCP + export)~
Polyglot (Python, Go, …)
Enterprise policy / VEX~~

Dependency-Track only sees the projects someone instrumented with an SBOM pipeline. Sentinello finds the ones you forgot. They’re stronger on enterprise policy — if you already run them on a mature pipeline, keep them. Sentinello is for the rest of your portfolio that nobody is watching.

Why we built this

In the AI age, you ship more than you can maintain.

A solo dev now spins up, delivers, and moves on from a dozen projects a year — the marketing site, the client dashboard, the side project that quietly went to production. Keeping them safe used to mean SSHing into each checkout to run npm audit by hand, or finding out about a Next.js CVE from a headline days after it dropped. Nobody keeps that up across a dozen repos, so it doesn't happen at all.

A single forgotten dependency with a critical remote-code-execution flaw is all it takes. The simplest site you stopped watching becomes the way in.

“Why not just use Snyk or Dependabot?” Those live inside the CI pipeline you wired up — and the long tail never got one. Sentinello is the early-warning system for everything else: point it at a folder and it watches every project you forgot, surfacing each new CVE in one queue before it becomes an incident.

How it works

Three steps. No agents to install in your projects, no accounts to create.

Point it at your code

Mount your repositories under /roots, or add them from Settings → Roots. Every directory is auto-registered and discovered on startup.

It scans continuously

A background worker checks your dependencies against known CVEs on a schedule, installing the Node version each project pins when it needs to.

Triage in one queue

Every finding across every project lands in a single queue you can filter by severity — with optional alerts to Slack, Telegram, or a webhook.

Who it's for

Sentinello is for everyone who has more in production than they have eyes on — the solo developer, the small team, the agency juggling client work.

  • You ship side projects and client sites that still need to stay safe long after launch.
  • You want a portfolio-wide view without wiring CI into every repository.
  • You'd rather self-host than hand your code inventory to a SaaS.

If you're a large org with Snyk or Dependabot already wired into a mature pipeline, keep them — Sentinello isn't trying to replace enterprise SCA. It's here for the rest of your portfolio that nobody is watching. It's open source and MIT-licensed, so you can read exactly what it does.

Release notes

Sentinello ships regularly — here's what each release delivered.

The gemnasium download works again — and the CLI gives the terminal back

v3.0.1 · Aug 4, 2026
  • GitLab gemnasium failed to download on 3.0.0 with `HTTP 406`, for everyone. Node’s built-in fetch attaches a `Sec-Fetch-Mode: cors` header that a program is not permitted to remove, and GitLab refuses any repository archive request carrying it — so this was never about your network, your IP, or how many times you retried. The download uses a plain HTTPS request now, and succeeds
  • The archive is fetched by commit id rather than by branch name, so everyone updating from the same upstream commit shares one cached copy instead of each asking GitLab to build a fresh 60 MB archive. A first download that took nearly seven minutes now finishes in seconds
  • The CLI used to finish its entire run — advisory written, summary printed — and then never return the terminal. The connection carrying the download was left open behind it, which kept the process alive; it is now closed as soon as the archive has been read
  • A feed that refuses a download no longer stalls for three minutes before saying so. It reports in seconds and, in a terminal, offers to try again — retrying only the source that actually failed
  • `--fail-on` is honest in both directions. It refuses a run whose advisory source could not be consulted, rather than reporting a clean scan it never performed; and it no longer fails a run over a source you switched off yourself with `SENTINELLO_OSV_FEED_URL=off` or `SENTINELLO_GEMNASIUM_FEED_URL=off` and never downloaded

Sentinello now runs without a portal at all

v3.0.0 · Aug 3, 2026
  • The scanners ship as a CLI on npm. `npx sentinello` walks a folder, finds every project underneath, checks them against npm audit, OSV and GitLab gemnasium, and writes a markdown advisory with a remediation prompt attached — no install, no account, no database, and nothing about your code leaves the machine
  • Piped, the advisory is the only thing on stdout, so `npx sentinello | claude -p "$(cat -)"` hands an agent a complete work list without anything corrupting the document
  • A first run no longer loses the gemnasium source to a refused download. GitLab declines its archive for a minute or two at a time, and the old retry gave up after thirteen seconds; the CLI now waits it out, says why it is waiting, and takes `--feed-wait` if the default of three minutes is wrong for you
  • Both download estimates were measured rather than guessed: the OSV npm export is quoted at 204 MB rather than 196, and the gemnasium archive at 52 MB rather than 80. The consent prompt marks an estimate with a tilde so it is never mistaken for a size the server reported
  • A value that looks like a flag is now rejected instead of taken literally — `--out --` used to write an advisory to a file named `--` inside your project and report success
  • The What’s new panel no longer runs off the bottom of the window when a release has a lot to say

The advisory document actually arrives — and counts what you mean

v2.6.0 · Jul 29, 2026
  • get_project_advisory now returns the advisory document itself. Connected clients previously received only its metadata — a filename and a count — and never the document, despite the tool describing it as a complete work list
  • The advisory export now holds one entry per distinct advisory with its sources merged, instead of one per scanner row: a vulnerability that npm audit and OSV both report is a single work item carrying both advisory IDs, not two near-identical ones. This applies to the portal’s Download .md as well, and the count now matches the dashboard
  • A project too large to fit in one MCP response is now paginated — the document states that it is incomplete and gives the exact follow-up call to fetch the rest, instead of being silently cut off where an agent would read the remainder as clean
  • Every input on every MCP tool now carries a description, and a new list_mutes tool exposes the mute IDs that unmute needs — previously obtainable only by creating the mute in the same session
  • Fixed a gap in the severity counts: a finding whose severity was not one of the five known values was counted as a finding but placed in no severity bucket, so a project whose only finding had one appeared completely clean

The advisory export, straight over MCP

v2.5.0 · Jul 28, 2026
  • Connected MCP clients can pull a project’s full Markdown advisory with the new get_project_advisory tool — the same document as the portal’s Download .md, without copying it out of the browser
  • Muted findings are now excluded from the project advisory export, so an agent is never handed work whose risk you have already accepted
  • Note: because the advisory contains your export prompt, an MCP client can now read whatever you have written in Settings → Export

Unclipped popups, stricter export prompt

v2.4.3 · Jul 26, 2026
  • Dropdowns, the dependency-path popover, and the advisory export menu no longer get clipped by the table or dialog they sit in — they render above the page and flip above the trigger when there is no room below
  • The default advisory-export prompt now asks the agent to plan before editing anything, group findings that share a single fix, and spell out the code impact of each version bump — and it targets zero findings while ruling out the shortcuts to a fake zero: muting, widening ranges, or narrowing the scan, with anything genuinely unfixable listed in a dated residual table

Branch in its own column

v2.4.2 · Jul 25, 2026
  • The git branch a project was scanned on now has a column of its own in the project list — plain text, no icon — instead of sitting under the project name

Clean shutdowns

v2.4.1 · Jul 25, 2026
  • Restarting the container no longer kills a scan that is midway through writing, and the worker now starts immediately instead of retrying for ~30 seconds first
  • Set stop_grace_period: 60s (or --stop-timeout 60) in your compose file to give it room — the README and Docker docs now cover this

Polyglot scanning — Python, Go, and Rust join npm

v2.4.0 · Jul 25, 2026
  • Sentinello now scans Python, Go, and Rust projects alongside npm — lockfiles are resolved entirely offline, and every project reports its scan coverage (full, partial, or unauditable) so gaps are visible instead of silent
  • GitLab’s gemnasium database joins npm audit and OSV as an offline advisory source, deduplicated against the others by CVE/GHSA alias; Settings → Sources is now a Languages × Sources matrix with per-cell notification scope, and npm audit itself can be turned off as long as one source stays active
  • Findings now record the git branch they came from, shown in the project list, the project header, and every notification
  • Project rows carry their own actions — scan now, copy or download the advisory, mute or unmute, and edit tags — so a triage pass no longer needs a trip into each project
  • The projects dashboard went from ~3.3s to ~0.03s, and navigation now shows loading states instead of appearing frozen
  • Security: 25 dependency advisories cleared, including libvips CVEs that were live in the portal’s image optimizer and nine Next.js advisories affecting the shipped portal
  • The default advisory-export prompt now covers minimum release age, lockfile verification, and stale overrides

Simpler MCP setup — no environment variables

v2.3.0 · Jun 9, 2026
  • Set up MCP entirely in Settings → MCP: generate a token to turn the /api/mcp endpoint on, clear it to turn it off — the SENTINELLO_MCP_ENABLED and SENTINELLO_MCP_API_TOKEN environment variables are gone (an existing env token is imported once on upgrade)
  • Ready-to-paste connection snippets for Claude Code, Codex, Cursor, and Claude Desktop, pre-filled with your token
  • When SENTINELLO_PORTAL_BASE_URL is set in the environment it’s shown read-only in Settings → Advanced, since it stays authoritative and is re-applied on every boot

Fewer false alarms and self-cleaning findings

v2.2.0 · Jun 9, 2026
  • Malware advisories now match the exact compromised version — a clean or already-remediated version of a once-compromised package is no longer flagged
  • Duplicate findings now resolve themselves on the next scan, so old or stranded entries clear out automatically
  • Production and development labels are now computed one consistent way across every source (npm and OSV)

A cleaner project header and consistent filters

v2.1.0 · Jun 6, 2026
  • Streamlined the project header — rename inline beside the title, with mute and tags as one-tap icons
  • Filter findings by source (npm / OSV) from a new dropdown beside the dependency-type filter
  • Unified, consistent dropdowns across the app, with type-to-search on long lists like time zones

Clearer upgrade guidance

v2.0.1 · Jun 4, 2026
  • Expanded upgrade steps for the 2.0 breaking changes
  • README notes the localhost-only port binding

Multi-source scanning and a hardened, secure-by-default install

v2.0.0 · Jun 4, 2026
  • OSV as an opt-in second source (Settings → Sources, off by default) with malicious-package detection, matched against the public OSV database in a local cache
  • Findings now merge across sources — one row per vulnerability, every source tagged, the best available fix, and the union of dependency paths, with a source filter and a dependency-path popover
  • Security hardening: the MCP endpoint is off by default and requires a token, webhook delivery is guarded against SSRF, an optional portal login gate, and the container runs as an unprivileged user
  • Settings is now a top-level section with a sidebar and a Profile page

MCP integration & what’s-new

v1.4.0 · May 29, 2026
  • MCP server at /api/mcp for Claude Desktop, Cursor, and other clients
  • New Settings → MCP section with server URL and token management
  • What’s-new pill plus a Release notes history

Footer version fix

v1.3.1 · May 28, 2026
  • The running version renders cleanly in the footer

Notification improvements

v1.3.0 · May 28, 2026
  • Filter notifications by environment
  • Simpler notification-target edit form
  • Duplicate an existing notification target

Projects and Libraries pages

v1.2.0 · May 24, 2026
  • The home view is split into dedicated Projects and Libraries pages

Live schedule reload

v1.1.2 · May 24, 2026
  • The worker reloads the scan schedule the moment you save changes in the portal

Safer deletes & a clearer update banner

v1.1.0 · May 23, 2026
  • Confirmation prompts before deleting roots and notification targets
  • Update notice moved to a dismissible top banner
  • Worker prunes stale roots when a host mount disappears

Scanner accuracy fixes

v1.0.1 · May 23, 2026
  • Drop audit findings whose installed version isn’t actually in the vulnerable range
  • Allow deleting a notification target that has delivery history

Initial open-source release

v1.0.0 · May 23, 2026
  • The first public release of Sentinello

Roadmap

Sentinello watches your dependencies across languages today. Here's where it's headed — and what you can ask for.

Smarter prioritization

Planned

Rank findings by exploitability and whether the vulnerable code is actually reachable — triage what matters first.

More integrations

Planned

More notification channels and ways to plug Sentinello into the tools your team already uses.

Static analysis (SAST)

Planned

Catch risky patterns in your own source code, not just known CVEs in your dependencies.

Secret & license scanning

Planned

Flag committed secrets and license issues across the same portfolio, in the same queue.

Request an integration or source

Tell us what you'd integrate or scan next — open an issue on GitHub and help shape the roadmap.