本文へスキップ
runtly

macOS · Node, Bun, Deno, pnpm, yarn

どのプロジェクトがサポート終了のランタイムで動いていますか。

どのバージョンマネージャも、いま使っているバージョンは教えてくれます。runtly はさらに、どのバージョンがセキュリティパッチを受け取らなくなったか、どのプロジェクトがその上にあるか、そのうちどれに今も手が入っているかを教えます。

macOS 版をダウンロード — 無料Universal · Apple Silicon と Intel · macOS 10.15+

またはコマンドラインのみ

$curl -fsSL https://runtly.flatium.com/download | sh
rt audit
$ rt auditruntly audit7 projects, 1 runtime versions examined · data fetched 3 minutes agoactive project, unsupported runtime  node 18.20.4    EOL 502d ago medium      medium CVE-2025-23085 GOAWAY HTTP/2 frames cause memory leak outside heap      https://nodejs.org/en/blog/vulnerability/january-2025-security-releases/      /Users/you/code/billing-worker      /Users/you/code/checkout-api      /Users/you/code/docs-site      and 4 more      4 of 7 committed to in the last 90 days, 4 inherit the global defaultrt install node@18.20.6rt use node@18.20.6  (4 project(s) inherit the default and are fixed by this alone)runtly audit examines the runtime, not your dependency tree. It does not replace `npm audit`.

01課題

バージョンマネージャは番号を知っています。リスクは知りません。

nvm use とその仲間が答えるのは一つの問いだけです。いまどのバージョンが有効か。その問いは尋ねた瞬間に片付きますが、そのバージョンがまだパッチを受け取っているかについては何も語りません。

だから答えはたいてい外側からやって来ます。コンプライアンスの質問票、顧客のセキュリティレビュー、本番で動いている Node のバージョンを尋ねるベンダー調査票。その時点で一覧は手作業で作るしかありません。リポジトリを一つずつ開き、.nvmrc を一つずつ読み、バージョンを一つずつサポート期限表と突き合わせる。

runtly はその一覧を保持しています。どのバージョンが入っているか、どのプロジェクトがそれに解決されるか、各プロジェクトが最後にコミットされたのはいつか、公開されたアドバイザリが各バージョンについて何と言っているか。

02監査

監査

rt audit はスキャン済みのすべてのプロジェクトを見て、その背後にあるランタイムのバージョンを報告します。

検出結果は、先に見るべきものから順に並びます

これはツールが実際に出力するラベルを、出力される順に並べたものです。

  1. 01

    active project, known vulnerability

    直近 90 日以内にコミットされたプロジェクトが、公開アドバイザリのあるバージョンで動いている状態。

  2. 02

    active project, unsupported runtime

    いまも作業中のプロジェクトが、セキュリティパッチを受け取らなくなったバージョンで動いている状態。

  3. 03

    critical vulnerability

    プロジェクトが動いているかどうかに関わらず、マシン上のどこかにある critical のアドバイザリ。

  4. 04

    losing security support soon

    サポート終了が近いバージョン。まだ移行を計画する時間が残っているうちに。

  5. 05

    dormant project on an old runtime

    90 日以上触れられていないもの。報告はしますが、既定では折りたたまれます。今日の午後に直すべきものではありません。

すべてのアドバイザリを解消する最小のアップグレード

推奨されるのはメジャーではなく、具体的なバージョンです。2025 年 1 月のアドバイザリが未解消の Node 18.20.4 なら、それは 18.20.6 であって「22 に上げろ」ではありません。顧客との契約で Node 18 に留められている人に後者は実行できませんが、前者なら今日の午後に実行できます。

バージョンを固定せずグローバル既定を継承しているプロジェクトについては、runtly はそのことを明示し、まとめて直せる一つのコマンドを添えます。

終了コードが 0 以外になるので、CI に置けます

rt audit --fail-on=critical は検出がしきい値に達したとき失敗の終了コードを返します。--fail-onhighmediumloweolnever も受け付けます。--json は読み取りたい何かのために、レポート全体を出力します。

$ rt audit --fail-on=eol$ echo $?1

オフラインで動き、そのことを隠しません

アドバイザリのデータは 24 時間キャッシュされるので、機内でも監査は動きます。どのレポートも 2 行目に、そのデータがどれだけ古いかを書きます — data fetched 3 minutes ago、あるいは 9 hours ago

データの出どころ

endoflife.date
サポート期間とサポート終了日のカレンダー。
Node.js Security WG
Node.js Security Working Group の脆弱性データベース。
OSV.dev
オープンソース脆弱性データベース。

03解決

解決

runtly は作業ディレクトリから上へたどり、最初に見つかった答えを採用します。規則は「近さが勝つ」です。優先度の低い近くのファイルが、優先度の高い遠くのファイルに勝つので、ワークスペースのメンバーがモノレポのルートを上書きします。逆ではありません。

同一ディレクトリ内での優先順位、高い順
1.runtlyrcruntly 自身のファイル。rt pin が書き出します。
2.nvmrcそのまま読むので、既存のリポジトリに変更は要りません。
3.node-version / .bun-version単一ランタイム向けの慣習。
4.tool-versionsasdf と mise のプロジェクト。
5package.json → packageManagerCorepack のフィールド。pnpm と yarn 用。
6package.json → engines範囲指定はインストール済みのバージョンに対して解決され、最も高い一致が勝ちます。

満たせない制約はエラーであり、フォールバックではありません

プロジェクトがインストールされていないバージョンを要求した場合、runtly は止まってそう伝えます。PATH にたまたま載っているものを黙って実行することはありません。その静かなすり替えこそ、一週間後に「手元では通るのに CI で落ちる」になる失敗そのものです。

$ node --versionerror: this directory requires node `20.99.0`, and no installed version satisfies it.  Declared in: /Users/you/code/bad/.nvmrc (.nvmrc)  Install one: rt install node@20.99.0

rt current は、決定したファイルの名前を出します

「なぜ間違ったバージョンになっているのか」の答えはパスであり、ツールはそのパスを出力します。

$ rt current/Users/you/code/mono/packages/web  runtime  version  source  node     18.20.4  /Users/you/code/mono/packages/web/.nvmrc (.nvmrc)

04速度

速度

shim は node を呼ぶたびに先に走るので、コストはゼロでなければなりません。hyperfine で 500 回計測。

node 呼び出しごとの増分
exec を呼ぶだけの、何もしない Rust バイナリ1.9 ms
runtly の shim、解決してから exec を呼ぶ1.9 ms

解決の処理は無料です。残っているのはプロセスを起動するために macOS 自身が要求する代金で、これは誰にも取り除けません。

実際のマシンをスキャン1 秒未満で 136 プロジェクト

05アプリ

アプリ

CLI と GUI の下に共通のコアが一つあるので、何が入っていて何が危ういかについて両者が食い違うことはありません。メニューバーの項目から、ウィンドウを開かずにバージョンを切り替えられます。

セキュリティ

セキュリティ

使用中のすべてのバージョン、そのサポート状態、そしてその背後にあるプロジェクト。

ランタイム

ランタイム

Node、Bun、Deno、pnpm、yarn のインストール済みバージョンと、上流で利用できるもの。

プロジェクト

プロジェクト

スキャンした各プロジェクトが何に解決されるか、そしてどのファイルが決めたか。

06限界

これができないこと

セキュリティの守備範囲を大きく言うのは、何も言わないより悪い結果になります。根拠のない安心を作るからです。限界は三つ、そのまま書きます。

  • 監査するのはランタイムであって、依存関係ツリーではありません

    runtly が報告するのは、プロジェクトが動いている Node、Bun、Deno のバージョンです。node_modules の中のパッケージについては何も言いません。npm audit の代わりにはならず、これを走らせることがそれを走らせる代わりにもなりません。

  • Bun と Deno では、「検出なし」は「誰もそのデータを公開していない」という意味です

    どちらのプロジェクトも、Node にあるような公開アドバイザリデータベースを持っていません。runtly はそれらのサポート終了状態は報告し、きれいなレポートが知りようのないことをほのめかさないよう、この警告を自分で出力します。

  • macOS のみ

    Apple Silicon と Intel、macOS 10.15 以降。Windows 版も Linux 版もなく、約束もしていません。

07無料

無料、そしてクローズドソース

無料でクローズドソースの開発者ツールには、すぐに一つ疑問が湧きます。ですから、このソフトウェアが実際に何をするかを書きます。

アカウントなし、サインアップなし、ライセンスキーなし
ダウンロードして使うだけです。登録するものも、有効化するものもありません。
テレメトリなし、いかなる解析もなし
アプリはあなたについても、あなたのマシンについても、一切報告しません。
shim はネットワークに触れません
`node` を呼ぶたびに先に走る部分は、ネットワークリクエストを一切行いません。
ダウンロードは展開前に検証されます
すべてのランタイムは、配布元自身が公開している SHA256 と照合されます。アプリ自体は Apple による署名と公証を受け、ユニバーサルバイナリとして配布されます。

行うネットワークリクエストの全部

  • nodejs.org/distNode のリリース配布
  • api.github.comBun と Deno のリリース情報
  • GitHub release downloadsBun と Deno のバイナリ
  • registry.npmjs.orgpnpm と yarn
  • endoflife.dateサポート期間のカレンダー
  • raw.githubusercontent.com/nodejs/security-wgNode.js のアドバイザリデータベース
  • api.osv.devオープンソースの脆弱性データ

あなたが手で取りに行くのと同じ場所です。ほかには、どこへも行きません。

08インストール

インストール

三つの経路があり、マシンに入るものは同じではありません。

アプリをダウンロード

アプリとコマンドライン

Applications にドラッグして開き、Set up now を押します。アプリが shim をインストールし、シェルの設定も自分で行います — どの段階でもターミナルは不要です。

macOS 版をダウンロードUniversal · Apple Silicon と Intel · macOS 10.15+

Homebrew

どちらの行を実行するかによります

アプリと CLI

$brew install --cask hieuhuynh93/tap/runtly-app

CLI のみ

$brew install hieuhuynh93/tap/runtly

シェルインストーラ

コマンドラインのみ — ウィンドウが意味を持たないサーバーと CI 向け

CLI

$curl -fsSL https://runtly.flatium.com/download | sh

CLI とアプリ

$curl -fsSL https://runtly.flatium.com/download | RUNTLY_WITH_APP=1 sh

同じ署名済みバイナリをダウンロードし、展開前に公開された SHA256 と照合し、runtly setup まで実行します。

実際に実行されるスクリプトです。先に読んでおきたい場合は: https://dl.runtly.flatium.com/install.sh

どの経路を選んでも最終状態は同じです。PATH に ~/.runtly/bin が載り、rt doctor が緑を返します。