見守るのをやめた依存関係のための、早期警告システム。
AIの時代、あなたは維持できる以上のプロジェクトをリリースしています。Sentinelloはそのすべてを見守り、依存関係に潜む既知のCVEを浮かび上がらせます — 標準で JavaScript、Python・Go・Rust も切り替えひとつで。忘れられたプロジェクトがインシデントになる前に。
コマンド1つで実行:
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:latestlinux/amd64 と arm64 で動作
アカウント不要。SaaSなし。テレメトリなし。Dockerイメージ1つとSQLiteファイル1つ — あなたのコードと検出結果がマシンの外に出ることはありません。
ポータルを使わずに済ませることもできます
同じスキャナーが CLI としても提供されています。インストール不要、アカウント不要、データベース不要 — 実行してエージェントが処理できるアドバイザリを出力し、そのまま終了します。
npx sentinelloパイプで渡すと stdout には markdown だけが流れるため、アドバイザリはそのままエージェントに届きます:
npx sentinello | claude -p "$(cat -)"フォルダーを走査
ディレクトリを指定すれば配下のすべてのプロジェクトを検出します。各プロジェクトのルートで停止するため、モノレポは 50 個ではなく 1 個として数えられます。.gitignore と .sentinelloignore は尊重されます。
3 つのソースを照合
lockfile から実際にインストールされている正確なバージョンを解決し、ローカルのアドバイザリキャッシュとオフラインで突き合わせます。プロジェクトごとのネットワーク通信はなく、コードは一切アップロードされません。
アドバイザリを書き出し
検出結果と修正プロンプトを添えた日付入りの markdown ファイル — 手を付ける前にトリアージし、override より親パッケージの更新を優先し、修正は lockfile で検証する、という指示付きです。
npm audit との違い
npm audit の置き換えではありません。npm audit を実行したうえで、npm audit からは見えない 2 つのアドバイザリソースを追加し、重複するものは抑制します。
| npm audit | npx sentinello | |
|---|---|---|
| 対象範囲 | 今いる 1 つのプロジェクトのみ。 | フォルダー配下のすべてのプロジェクトを、1 回の実行と 1 つのレポートで。 |
| アドバイザリソース | 利用中のレジストリのアドバイザリフィード。 | それに加えて OSV と GitLab gemnasium。重複は抑制されるため、ソースを増やしても新規の検出だけが加わります。 |
| 悪意あるパッケージ | 対象外。 | OSV の MAL- レコードがマルウェア入りで公開されたパッケージ(タイポスクワット、インストールスクリプトのペイロードなど)を、侵害された特定のバージョンと照合して警告します。 |
| 出力 | 表、または自分で解釈する JSON。 | 修正プロンプトを添えた markdown のアドバイザリ。そのままエージェントに渡せます。 |
| 照合方法 | プロジェクトごとにレジストリへ問い合わせ。 | ローカルキャッシュに対してオフラインで照合。初回実行時に確認のうえダウンロードし、以降はほとんど通信しません。 |
追加のソースは形だけのものではありません。Sentinello 自身のリポジトリでは、npm audit と OSV はそれぞれ 3 件を報告し、その内容はすべて一致します。一方、唯一の critical な検出は、他の 2 つが持たない gemnasium から得られています。
機能
セルフホスト型ポータルにすべてを — 外部サービスなし、データがネットワークの外に出ることもありません。
単一のトリアージキュー
十数個のチェックアウトに散らばった npm audit ではなく、ポートフォリオ全体のCVEを1か所で確認・トリアージできます。
プロジェクト別・ライブラリ別に見る
任意のリポジトリを開いて、検出結果、修正バージョン、履歴を掘り下げる — あるいは脆弱なパッケージに切り替えて、影響を受けるすべてのプロジェクトを確認し、一度にすべてをミュートできます。
多言語スキャン
標準で JavaScript をスキャンし、言語ごとの切り替えで Python・Go・Rust を追加できます — 各プロジェクトのロックファイルをオフラインで解析し、OSV と GitLab gemnasium のアドバイザリと照合します。
継続的なスキャン
バックグラウンドのワーカーがスケジュールに沿って再スキャンするので、確認を覚えていなくても新しいアドバイザリが表示されます。
複数のソース
npm audit を超えて、OSV データベースと照合し、より広い CVE カバレッジと既知の悪意あるパッケージの検出を実現します。
通知とWebhook
失敗や検出のアラートを、Slack、Telegram、またはシンプルなWebhookで受け取れます — ルートまたはプロジェクト単位でスコープ指定でき、言語も選べます。自動修正エージェント向けに JSON またはプレーンテキストのペイロードを送信します。
MCP サーバー
Claude Desktop や Cursor などの MCP クライアントを接続し、チャットを離れずに検出結果・プロジェクト・ライブラリを照会し、スキャンを実行できます。
アドバイザリのエクスポート
プロジェクトまたはライブラリの検出結果を Markdown でエクスポート。チームや LLM 向けにカスタマイズ可能な修復プロンプト付き。
1つのイメージ、1つのファイル
Dockerイメージ1つとSQLiteファイル1つ。データベースサーバーも、メッセージキューも、クラウドへの依存もありません。
自動登録されるRoots
/roots にマウントしたものは起動時に登録・スキャンされます — ディレクトリ名がそのラベルになります。
プロジェクトごとのNode
各プロジェクトの .nvmrc を尊重し、固定されたNodeのバージョンを一度だけインストール・キャッシュします。
10言語
ポータルのUI、スキャンの理由コード、ステータスは10言語にローカライズされています。
スクリーンショット
実際の動作を見る — いくつかのデモプロジェクトをスキャンするポータル。任意の画像をクリックすると拡大表示します。
比較
Sentinello は重い Dependency-Track でも安価な Snyk でもありません。別のニッチを担います。誰もパイプラインに組み込まなかったプロジェクトのロングテールです。
| Sentinello | Dependency-Track | Snyk | Dependabot | |
|---|---|---|---|---|
| 設定不要 — フォルダーを指定するだけ | ~ | ~ | ||
| SBOM / CI ステップ不要 | ||||
| 実際の解決済みロックファイルをスキャン | ~ | |||
| 悪意あるパッケージの検出 | ||||
| セルフホスト、SaaS なし | ||||
| 単一イメージ + SQLite | ||||
| AI ネイティブ(MCP + エクスポート) | ~ | |||
| 多言語(Python、Go、…) | ||||
| エンタープライズポリシー / VEX | ~ | ~ |
Dependency-Track は、誰かが SBOM パイプラインで計装したプロジェクトしか見えません。Sentinello は忘れられたものを見つけます。エンタープライズポリシーでは相手が優れています — 成熟したパイプラインで既に使っているなら、そのまま使ってください。Sentinello は、誰も見ていない残りのポートフォリオのためのものです。
私たちがこれを作った理由
AIの時代、あなたは維持できる以上のものをリリースしています。
今や1人の開発者が、年に十数件のプロジェクトを立ち上げ、納品し、そして離れていきます — マーケティングサイト、顧客向けダッシュボード、ひっそりと本番に出た個人プロジェクト。これらを安全に保つには、かつてはチェックアウトごとに SSH で入って手作業で npm audit を回すか、Next.js のCVEを公開から数日後にニュースの見出しで知るしかありませんでした。十数個ものリポジトリでそんなことを続けられる人はいないので、結局まったく行われません。
クリティカルなリモートコード実行の欠陥を抱えた、忘れられた依存関係が1つあれば十分です。見るのをやめた最も単純なサイトが、侵入口になります。
「Snyk や Dependabot を使えばいいのでは?」 — それらは、あなたが組み込んだ CI パイプラインの中で動きます。そしてロングテールにはそのパイプラインがありません。Sentinello は、それ以外すべてのための早期警告システムです。フォルダーを指定すれば、忘れていたすべてのプロジェクトを見守り、新しいCVEがインシデントになる前に1つのキューに浮かび上がらせます。
仕組み
3ステップ。プロジェクトにインストールするエージェントも、作成するアカウントも不要です。
コードを指定する
リポジトリを /roots にマウントするか、設定 → Roots から追加します。各ディレクトリは起動時に自動登録・検出されます。
継続的にスキャン
バックグラウンドのワーカーがスケジュールに沿って依存関係を既知のCVEと照合し、各プロジェクトが固定するNodeのバージョンを必要に応じてインストールします。
1つのキューでトリアージ
すべてのプロジェクトのすべての検出結果が、深刻度で絞り込める1つのキューに集まります。Slack、Telegram、Webhookへの通知も任意で設定できます。
対象となる人
Sentinelloは、見守れる以上のものを本番に抱えるすべての人のためのものです — 1人で開発する人、小さなチーム、顧客の仕事をやりくりするエージェンシー。
- リリース後もずっと安全であり続ける必要のある、個人プロジェクトや顧客サイトをリリースしている。
- すべてのリポジトリにCIを組み込まずに、ポートフォリオ全体を俯瞰したい。
- コードの一覧をSaaSに渡すより、セルフホストしたい。
成熟したパイプラインにSnykやDependabotをすでに組み込んでいる大規模な組織なら、それを使い続けてください — Sentinelloはエンタープライズ向けSCAを置き換えようとはしていません。誰も見ていない、残りのポートフォリオのためにあります。オープンソースかつMITライセンスなので、何をしているかを正確に読むことができます。
リリースノート
Sentinello は頻繁に更新されています。各リリースの内容をご紹介します。
gemnasium のダウンロードが復旧し、CLI がターミナルを返すようになりました
v3.0.1 · 2026/08/04- 3.0.0 では GitLab gemnasium のダウンロードが全ユーザーで `HTTP 406` により失敗していました。Node 組み込みの fetch はプログラムから削除できない `Sec-Fetch-Mode: cors` ヘッダーを付与し、GitLab はそれを含むリポジトリアーカイブ要求をすべて拒否します。つまりネットワークや IP、再試行回数とは無関係でした。ダウンロードは通常の HTTPS 要求を使うようになり、成功します
- アーカイブはブランチ名ではなくコミット ID で取得するようになりました。同じ上流コミットから更新する全員がキャッシュされた 1 つのコピーを共有するため、各自が GitLab に 60 MB のアーカイブを生成させる必要がありません。7 分近くかかっていた初回ダウンロードが数秒で完了します
- CLI は処理をすべて終えても — レポートを書き、サマリーを表示しても — ターミナルを返しませんでした。ダウンロードの接続が背後で開いたままプロセスを生かしていたためです。アーカイブを読み終えた時点で閉じるようになりました
- ダウンロードを拒否されたソースが、報告するまで 3 分間止まることはなくなりました。数秒で報告し、ターミナルでは再試行を提案します。再試行するのは実際に失敗したソースだけです
- `--fail-on` は双方向で正直になりました。アドバイザリソースを参照できなかった実行は、実施していないクリーンなスキャンとして報告せず拒否します。また `SENTINELLO_OSV_FEED_URL=off` や `SENTINELLO_GEMNASIUM_FEED_URL=off` で自分が無効にし一度もダウンロードしていないソースを理由に失敗することはなくなりました
Sentinello はポータルなしでも動くようになりました
v3.0.0 · 2026/08/03- スキャナーが npm 上の CLI として提供されます。`npx sentinello` はフォルダーを走査して配下のすべてのプロジェクトを見つけ、npm audit・OSV・GitLab gemnasium と照合し、修正プロンプトを添えた markdown のアドバイザリを書き出します。インストール不要、アカウント不要、データベース不要で、コードがマシンの外に出ることもありません
- パイプで渡すと stdout にはアドバイザリだけが流れるため、`npx sentinello | claude -p "$(cat -)"` は文書を壊すことなく完全な作業リストをエージェントに渡せます
- 初回実行でダウンロードを拒否されて gemnasium ソースを失うことがなくなりました。GitLab はアーカイブを 1〜2 分ほどまとめて拒否しますが、以前の再試行は 13 秒で諸めていました。CLI は待機して待ち、待っている理由を表示し、既定の 3 分が合わない場合は `--feed-wait` を受け付けます
- ダウンロード見積もりはどちらも推測ではなく実測しました。OSV の npm エクスポートは 196 MB ではなく 204 MB、gemnasium のアーカイブは 80 MB ではなく 52 MB と表示します。確認プロンプトは見積もりにチルダを付け、サーバーが報告したサイズと取り違えられないようにしています
- オプションのように見える値は、そのまま解釈せず拒否するようになりました。`--out --` は以前、プロジェクト内に `--` という名前のファイルへアドバイザリを書き出し、成功と報告していました
- リリースの内容が多いときに「新着情報」パネルがウィンドウ下部からはみ出さなくなりました
アドバイザリ文書が実際に届くように — 集計も正確に
v2.6.0 · 2026/07/29- get_project_advisory が文書そのものを返すようになりました。これまで接続クライアントにはファイル名と件数などのメタデータだけが渡され、完全な作業リストと説明されていたにもかかわらず文書本体は届いていませんでした
- アドバイザリの書き出しが、スキャナーの行ごとではなくアドバイザリごとに 1 件へ統合されました。npm audit と OSV の両方が報告する脆弱性は、両方の ID を持つ 1 件の作業項目になります。ポータルの「.md をダウンロード」にも同じ変更が適用され、件数がダッシュボードと一致するようになりました
- MCP の 1 回の応答に収まらない大きなプロジェクトはページ分割されます。文書が未完であることを明示し、残りを取得するための正確な呼び出しを示すため、エージェントが残りを「問題なし」と誤読することがありません
- すべての MCP ツールのすべての入力に説明が付きました。また、unmute に必要なミュート ID を取得できる list_mutes ツールを追加しました(従来は同じセッションでミュートを作成した場合しか分かりませんでした)
- 深刻度の集計の抜けを修正しました。既知の 5 段階以外の深刻度を持つ検出は、件数には数えられるのにどの区分にも入らず、その 1 件だけを持つプロジェクトが完全にクリーンに見えていました
アドバイザリの書き出しを MCP から直接
v2.5.0 · 2026/07/28- 接続済みの MCP クライアントは、新しい get_project_advisory ツールでプロジェクトの Markdown アドバイザリ全文を取得できます。ポータルの「.md をダウンロード」と同じ文書を、ブラウザからコピーせずに使えます
- ミュートした検出結果はプロジェクトのアドバイザリ書き出しに含まれなくなりました。すでにリスクを受け入れた項目がエージェントに渡ることはありません
- 注意: アドバイザリには書き出しプロンプトが含まれるため、MCP クライアントは設定 → 書き出し に記入した内容を読み取れるようになりました
切れないポップアップと、より厳格な書き出しプロンプト
v2.4.3 · 2026/07/26- ドロップダウン、依存パスのポップオーバー、アドバイザリ書き出しメニューが、置かれているテーブルやダイアログに切り取られなくなりました。ページの上に重ねて描画され、下に余裕がない場合は上向きに開きます
- アドバイザリ書き出しの既定プロンプトが、何かを編集する前に計画を立てること、同じ修正でまとめて解消できる検出結果をグループ化すること、バージョン変更ごとのコードへの影響を明示することを求めるようになりました。目標はゼロ件ですが、ミュート・バージョン範囲の緩和・スキャン範囲の縮小といった見せかけのゼロへの近道は禁止し、本当に解消できないものは日付入りの残存項目テーブルに残します
ブランチを独立した列に
v2.4.2 · 2026/07/25- プロジェクトをスキャンした git ブランチが、プロジェクト名の下ではなくプロジェクト一覧の独立した列に表示されるようになりました(アイコンなしのテキスト)
クリーンな終了
v2.4.1 · 2026/07/25- コンテナを再起動しても、書き込み途中のスキャンが強制終了されなくなりました。ワーカーは約 30 秒間リトライすることなく、すぐに起動します
- compose ファイルに stop_grace_period: 60s(または --stop-timeout 60)を設定して余裕を持たせてください。README と Docker ドキュメントに説明を追加しました
ポリグロット解析 — npm に Python・Go・Rust が加わりました
v2.4.0 · 2026/07/25- Sentinello が npm に加えて Python・Go・Rust のプロジェクトも解析するようになりました。ロックファイルは完全にオフラインで解決され、各プロジェクトが解析カバレッジ(完全・部分的・監査不可)を報告するため、抜け漏れが見えないまま残りません
- GitLab の gemnasium データベースが npm audit と OSV に並ぶオフラインのアドバイザリソースとして加わり、CVE/GHSA エイリアスで他ソースと重複排除されます。「設定 → ソース」は「言語 × ソース」のマトリクスになり、セルごとに通知範囲を設定でき、ソースが 1 つ以上有効であれば npm audit 自体も無効にできます
- 検出結果に、それが得られた git ブランチが記録され、プロジェクト一覧・プロジェクトヘッダー・すべての通知に表示されます
- プロジェクトの各行に操作が用意されました。今すぐスキャン、アドバイザリのコピーまたはダウンロード、ミュートと解除、タグ編集ができ、トリアージのたびに各プロジェクトを開く必要がなくなりました
- プロジェクトダッシュボードが約 3.3 秒から約 0.03 秒になり、画面遷移では固まったように見える代わりにローディング表示が出るようになりました
- セキュリティ: 依存関係のアドバイザリ 25 件を解消しました。ポータルの画像最適化で実際に有効だった libvips の CVE や、配布されるポータルに影響する Next.js の 9 件を含みます
- アドバイザリ書き出しの既定プロンプトが、最小公開経過日数・ロックファイルの検証・古い override を扱うようになりました
よりシンプルな MCP 設定 — 環境変数は不要
v2.3.0 · 2026/06/09- MCP の設定はすべて「設定 → MCP」で完結します。トークンを生成すると /api/mcp エンドポイントがオンになり、削除するとオフになります — SENTINELLO_MCP_ENABLED と SENTINELLO_MCP_API_TOKEN の環境変数は廃止されました(既存の環境変数トークンはアップグレード時に一度だけ取り込まれます)
- Claude Code、Codex、Cursor、Claude Desktop 向けの貼り付けるだけの接続スニペット。トークンが入力済みです
- SENTINELLO_PORTAL_BASE_URL を環境変数で設定している場合、優先され起動のたびに再適用されるため、「設定 → 詳細設定」では読み取り専用で表示されます
誤検知の低減と、自動で整理される検出結果
v2.2.0 · 2026/06/09- マルウェアのアドバイザリが、影響を受ける正確なバージョンと照合されるようになりました。かつて侵害されたパッケージでも、クリーンな、または修正済みのバージョンはもう検出されません
- 重複した検出結果が次回のスキャンで自動的に解決され、古い項目や取り残された項目が自動でクリアされます
- 本番(production)と開発(development)のラベルが、すべてのソース(npm と OSV)で一貫した単一の方法で算出されるようになりました
すっきりしたプロジェクトヘッダーと一貫したフィルター
v2.1.0 · 2026/06/06- プロジェクトヘッダーを簡素化 — タイトルの横で名前を変更でき、ミュートとタグはアイコンに
- 依存タイプフィルターの横の新しいドロップダウンから、ソース(npm / OSV)で検出結果を絞り込み
- アプリ全体でドロップダウンを統一し、タイムゾーンなどの長いリストでは入力して検索可能に
よりわかりやすいアップグレード手順
v2.0.1 · 2026/06/04- 2.0 の破壊的変更に関するアップグレード手順を拡充
- README に localhost のみのポートバインドを明記
複数ソースのスキャンと、デフォルトで安全な堅牢化されたインストール
v2.0.0 · 2026/06/04- 任意の第2ソースとしての OSV(設定 → ソース、デフォルトはオフ)。悪意あるパッケージ検出を備え、ローカルキャッシュ内の公開 OSV データベースと照合します
- 検出結果がソース間で統合されるようになりました。脆弱性ごとに1行で、各ソースをタグ付けし、利用可能な最良の修正と依存パスの和集合を示し、ソースフィルターと依存パスのポップオーバーを備えます
- セキュリティ強化: MCP エンドポイントはデフォルトでオフかつトークンが必要、Webhook 配信は SSRF から保護、任意のポータルログインゲート、コンテナは非特権ユーザーとして実行されます
- 設定が、サイドバーとプロフィールページを備えたトップレベルのセクションになりました
MCP 連携と新着情報
v1.4.0 · 2026/05/29- Claude Desktop、Cursor などのクライアント向けの /api/mcp の MCP サーバー
- サーバー URL とトークン管理を備えた新しい「設定 → MCP」セクション
- 新着情報バッジとリリースノートの履歴
フッターのバージョン表示の修正
v1.3.1 · 2026/05/28- 実行中のバージョンがフッターに正しく表示されます
通知の改善
v1.3.0 · 2026/05/28- 環境ごとに通知をフィルタリング
- 通知先の編集フォームを簡素化
- 既存の通知先を複製
プロジェクトとライブラリのページ
v1.2.0 · 2026/05/24- ホーム画面が専用のプロジェクトページとライブラリページに分割されました
スケジュールのライブ再読み込み
v1.1.2 · 2026/05/24- ポータルで変更を保存すると、ワーカーがスキャンスケジュールをすぐに再読み込みします
より安全な削除と分かりやすい更新バナー
v1.1.0 · 2026/05/23- ルートと通知先を削除する前に確認
- 更新のお知らせが画面上部の閉じられるバナーに変更
- ホストのマウントが消えると、ワーカーが古いルートを整理します
スキャナーの精度修正
v1.0.1 · 2026/05/23- インストール済みバージョンが実際には脆弱な範囲にない検出結果を除外
- 送信履歴のある通知先を削除できるように
初のオープンソースリリース
v1.0.0 · 2026/05/23- Sentinello の最初の一般公開リリース
ロードマップ
Sentinello は今、複数の言語にまたがってあなたの依存関係を見守っています。これからの方向性と、あなたがリクエストできることを紹介します。
よりスマートな優先順位付け
予定悪用可能性と脆弱なコードが実際に到達可能かで検出結果をランク付けし、重要なものから対応します。
より多くの連携
予定通知チャンネルを増やし、チームがすでに使っているツールと Sentinello をつなぐ方法を広げます。
静的解析(SAST)
予定依存関係の既知の CVE だけでなく、あなた自身のソースコードの危険なパターンも検出します。
シークレットとライセンスのスキャン
予定コミットされたシークレットやライセンスの問題を、同じポートフォリオの同じキューで検出します。
次に連携・スキャンしてほしいものを教えてください — GitHub で Issue を立てて、ロードマップづくりに参加しましょう。