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:latestRuns 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 sentinelloPiped, 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 audit | npx sentinello | |
|---|---|---|
| Scope | The one project you are standing in. | Every project under a folder, in one pass and one report. |
| Advisory sources | Your registry's advisory feed. | That, plus OSV and GitLab gemnasium. Duplicates are suppressed, so each extra source only adds net-new findings. |
| Malicious packages | Not covered. | OSV's MAL- records flag packages published with malware — typosquats, install-script payloads — matched against the specific compromised versions. |
| Output | A table, or JSON you have to interpret. | A markdown advisory with a remediation prompt attached, ready to hand to an agent. |
| Matching | A 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.
| Sentinello | Dependency-Track | Snyk | Dependabot | |
|---|---|---|---|---|
| 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
PlannedRank findings by exploitability and whether the vulnerable code is actually reachable — triage what matters first.
More integrations
PlannedMore notification channels and ways to plug Sentinello into the tools your team already uses.
Static analysis (SAST)
PlannedCatch risky patterns in your own source code, not just known CVEs in your dependencies.
Secret & license scanning
PlannedFlag committed secrets and license issues across the same portfolio, in the same queue.
Tell us what you'd integrate or scan next — open an issue on GitHub and help shape the roadmap.