Tới nội dung
runtly

macOS · Node, Bun, Deno, pnpm, yarn

Dự án nào của bạn đang chạy trên runtime hết vòng đời?

Trình quản lý phiên bản nào cũng cho biết bạn đang ở phiên bản nào. runtly cho biết thêm: phiên bản nào đã ngừng nhận bản vá bảo mật, dự án nào nằm trên đó — và trong số đó cái nào còn người làm.

Tải cho macOS — miễn phíUniversal · Apple Silicon và Intel · macOS 10.15+

hoặc chỉ dòng lệnh

$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`.

01Vấn đề

Trình quản lý phiên bản biết con số. Nó không biết rủi ro.

nvm use và những công cụ cùng loại trả lời đúng một câu hỏi: phiên bản nào đang hoạt động ngay lúc này. Câu hỏi đó khép lại ngay khi được hỏi, và nó không nói gì về việc phiên bản ấy còn được vá hay không.

Nên câu trả lời thường đến từ bên ngoài: một bảng khảo sát tuân thủ, một đợt rà soát bảo mật của khách hàng, một biểu mẫu nhà cung cấp hỏi bạn đang chạy những phiên bản Node nào trên production. Đến lúc đó thì danh sách phải dựng bằng tay — mở từng repository, đọc từng .nvmrc, tra từng phiên bản với lịch hỗ trợ.

runtly giữ sẵn danh sách đó. Nó biết những phiên bản nào đang được cài, dự án nào phân giải về phiên bản nào, mỗi dự án được commit lần cuối khi nào, và các advisory đã công bố nói gì về từng phiên bản.

02Bản rà soát

Bản rà soát

rt audit xem lại mọi dự án nó đã quét và báo cáo các phiên bản runtime đứng sau chúng.

Kết quả được sắp theo thứ đáng chú ý trước

Đây là các nhãn mà công cụ in ra, theo đúng thứ tự nó in.

  1. 01

    active project, known vulnerability

    Dự án được commit trong 90 ngày gần nhất, đang chạy phiên bản có advisory đã công bố.

  2. 02

    active project, unsupported runtime

    Dự án vẫn đang được làm, chạy trên phiên bản không còn nhận bản vá bảo mật.

  3. 03

    critical vulnerability

    Một advisory mức critical ở bất kỳ đâu trên máy, bất kể dự án còn hoạt động hay không.

  4. 04

    losing security support soon

    Phiên bản sắp hết vòng đời, khi vẫn còn thời gian để lên kế hoạch chuyển.

  5. 05

    dormant project on an old runtime

    Không đụng tới từ 90 ngày trở lên. Vẫn được báo, nhưng mặc định thu gọn — đây không phải thứ bạn cần sửa chiều nay.

Bản nâng cấp nhỏ nhất xử lý hết mọi advisory

Khuyến nghị là một phiên bản cụ thể, không phải một major. Với Node 18.20.4 còn tồn advisory tháng 1/2025, con số đó là 18.20.6 — không phải "lên 22". Người đang bị hợp đồng khách hàng giữ ở Node 18 không làm được vế sau, nhưng làm được vế đầu ngay chiều nay.

Với những dự án thừa hưởng mặc định toàn cục thay vì ghim phiên bản, runtly nói rõ điều đó và thêm đúng một lệnh sửa hết tất cả cùng lúc.

Nó trả về mã thoát khác 0, nên nó thuộc về CI

rt audit --fail-on=critical trả về mã thoát lỗi khi có kết quả chạm ngưỡng. --fail-on còn nhận high, medium, low, eolnever. --json in toàn bộ báo cáo cho bất kỳ thứ gì muốn đọc nó.

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

Chạy ngoại tuyến, và nói thật về điều đó

Dữ liệu advisory được cache 24 giờ, nên rà soát vẫn chạy được trên máy bay. Mọi báo cáo đều ghi rõ dữ liệu của nó cũ tới đâu, ngay dòng thứ hai — data fetched 3 minutes ago, hay 9 hours ago.

Dữ liệu lấy từ đâu

endoflife.date
Lịch hỗ trợ và ngày hết vòng đời.
Node.js Security WG
Cơ sở dữ liệu lỗ hổng của Node.js Security Working Group.
OSV.dev
Cơ sở dữ liệu lỗ hổng mã nguồn mở.

03Phân giải

Phân giải

runtly đi ngược lên từ thư mục làm việc và lấy câu trả lời đầu tiên nó tìm thấy. Quy tắc là gần thắng xa: một file ưu tiên thấp nhưng ở gần sẽ thắng một file ưu tiên cao nhưng ở xa, nên một package con trong workspace ghi đè gốc monorepo chứ không phải ngược lại.

Thứ tự ưu tiên, cao nhất trước, trong cùng một thư mục
1.runtlyrcFile của riêng runtly. Do rt pin ghi ra.
2.nvmrcĐọc nguyên trạng, nên repository sẵn có không cần sửa gì.
3.node-version / .bun-versionQuy ước cho từng runtime đơn lẻ.
4.tool-versionsDự án dùng asdf và mise.
5package.json → packageManagerTrường của Corepack, cho pnpm và yarn.
6package.json → enginesDải phiên bản được phân giải theo các bản đã cài; bản khớp cao nhất thắng.

Ràng buộc không thoả được là lỗi, không bao giờ là fallback

Nếu một dự án yêu cầu phiên bản chưa được cài, runtly dừng lại và nói rõ. Nó không lặng lẽ chạy bất cứ thứ gì đang nằm trên PATH. Chính kiểu thay thế âm thầm đó là thứ một tuần sau biến thành "chạy ở máy thì được, lên CI thì hỏng".

$ 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 chỉ đích danh file đã quyết định

Câu trả lời cho "sao tôi lại đang ở sai phiên bản?" là một đường dẫn, và công cụ in ra đúng đường dẫn đó.

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

04Tốc độ

Tốc độ

Shim chạy trước mọi lần gọi node, nên nó buộc phải không tốn gì. Đo bằng hyperfine, 500 lần chạy.

Cộng thêm mỗi lần gọi node
Một binary Rust không làm gì, chỉ gọi exec1.9 ms
Shim của runtly, phân giải rồi mới gọi exec1.9 ms

Phần việc phân giải là miễn phí. Thứ còn lại là cái giá của chính macOS để khởi động một tiến trình, và không gì bỏ được nó.

Quét một máy thật136 dự án trong chưa tới một giây

05Ứng dụng

Ứng dụng

Một lõi dùng chung nằm dưới cả CLI lẫn GUI, nên hai bên không thể nói khác nhau về thứ đang được cài hay thứ đang có rủi ro. Một mục trên thanh menu cho phép đổi phiên bản mà không cần mở cửa sổ.

Bảo mật

Bảo mật

Mọi phiên bản đang dùng, trạng thái hỗ trợ của nó, và các dự án đứng sau.

Runtime

Runtime

Các phiên bản đã cài cho Node, Bun, Deno, pnpm và yarn, kèm những bản có sẵn ở thượng nguồn.

Dự án

Dự án

Mỗi dự án đã quét phân giải về đâu, và file nào đã quyết định.

06Giới hạn

Những gì nó không làm

Nói quá phạm vi bảo mật còn tệ hơn không nói, vì nó tạo ra sự yên tâm không có cơ sở. Ba giới hạn, nói thẳng.

  • Nó rà soát runtime, không phải cây phụ thuộc của bạn

    runtly báo cáo về các phiên bản Node, Bun và Deno mà dự án của bạn chạy trên đó. Nó không nói gì về các package bên trong node_modules. Nó không thay thế npm audit, và chạy nó không phải là cách thay cho việc chạy lệnh đó.

  • Với Bun và Deno, "không có kết quả" nghĩa là "không ai công bố dữ liệu đó"

    Cả hai dự án đều không duy trì một cơ sở dữ liệu advisory công khai như Node có. runtly báo trạng thái hết vòng đời của chúng, và tự in ra cảnh báo này thay vì để một báo cáo sạch ngụ ý điều mà nó không thể biết.

  • Chỉ macOS

    Apple Silicon và Intel, macOS 10.15 trở lên. Không có bản Windows, không có bản Linux, và cũng không hứa hẹn gì.

07Miễn phí

Miễn phí, và mã nguồn đóng

Một công cụ lập trình miễn phí mà đóng mã nguồn làm nảy ra ngay một câu hỏi, nên đây là những gì phần mềm này thực sự làm.

Không tài khoản, không đăng ký, không licence key
Tải về và dùng. Không có gì để đăng ký và không có gì để kích hoạt.
Không telemetry và không analytics dưới bất kỳ dạng nào
Ứng dụng không báo cáo bất cứ điều gì về bạn hay về máy của bạn, không bao giờ.
Shim không bao giờ chạm vào mạng
Phần chạy trước mọi lần gọi `node` không thực hiện bất kỳ request mạng nào.
Bản tải về được kiểm tra trước khi giải nén
Mỗi runtime đều được đối chiếu với SHA256 do chính nhà phát hành công bố. Bản thân ứng dụng được Apple ký và notarize, phát hành dưới dạng universal binary.

Toàn bộ những request mạng mà nó thực hiện

  • nodejs.org/distBản tải Node
  • api.github.comMetadata phát hành của Bun và Deno
  • GitHub release downloadsBinary của Bun và Deno
  • registry.npmjs.orgpnpm và yarn
  • endoflife.dateLịch hỗ trợ
  • raw.githubusercontent.com/nodejs/security-wgCơ sở dữ liệu advisory của Node.js
  • api.osv.devDữ liệu lỗ hổng mã nguồn mở

Đúng những nơi bạn sẽ tự tay tải về. Không gì khác, không tới đâu khác.

08Cài đặt

Cài đặt

Ba đường, và chúng không đặt cùng một thứ lên máy bạn.

Tải ứng dụng

Ứng dụng và dòng lệnh

Kéo vào Applications, mở lên, rồi bấm Set up now. Ứng dụng tự cài shim và tự cấu hình shell cho bạn — không cần terminal ở bất kỳ bước nào.

Tải cho macOSUniversal · Apple Silicon và Intel · macOS 10.15+

Homebrew

Tuỳ dòng lệnh bạn chạy

Ứng dụng và CLI

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

Chỉ riêng CLI

$brew install hieuhuynh93/tap/runtly

Trình cài qua shell

Chỉ dòng lệnh — cho server và CI, nơi một cửa sổ là vô nghĩa

CLI

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

CLI và ứng dụng

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

Nó tải đúng những binary đã ký đó, đối chiếu với SHA256 đã công bố trước khi giải nén, rồi chạy runtly setup giúp bạn.

Script nó thực sự chạy, nếu bạn muốn đọc trước: https://dl.runtly.flatium.com/install.sh

Dù đi đường nào, trạng thái cuối cũng như nhau: ~/.runtly/bin nằm trên PATH, và rt doctor báo xanh.