An early-warning system for the dependencies you stopped watching.
In the AI age you ship more Node.js projects than you can maintain. Sentinello watches every one and surfaces known CVEs in their npm dependencies — so a forgotten project never becomes an incident.
Run it in one command:
docker run -d \
--name sentinello \
-p 3870:3000 \
-v sentinello-data:/app/data \
-v sentinello-nvm:/root/.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.
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.
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 Node 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, …) | Planned | |||
| 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, and polyglot coverage is on Sentinello’s roadmap — 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.
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 Node.js dependencies 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 ecosystems
PlannedExtend scanning beyond Node to Python, Go, and Rust, using the same filesystem-native discovery.
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.