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.
hoặc chỉ dòng lệnh
$curl -fsSL https://runtly.flatium.com/download | sh$ 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 default → rt install node@18.20.6 → rt 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.
- 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ố.
- 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.
- 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.
- 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.
- 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, eol và never. --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 $?1Chạ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.
| # | File | Ghi chú |
|---|---|---|
| 1 | 1.runtlyrc | File của riêng runtly. Do rt pin ghi ra. |
| 2 | 2.nvmrc | Đọc nguyên trạng, nên repository sẵn có không cần sửa gì. |
| 3 | 3.node-version / .bun-version | Quy ước cho từng runtime đơn lẻ. |
| 4 | 4.tool-versions | Dự án dùng asdf và mise. |
| 5 | 5package.json → packageManager | Trường của Corepack, cho pnpm và yarn. |
| 6 | 6package.json → engines | Dả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.0rt 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.
Một binary Rust không làm gì, chỉ gọi exec | 1.9 ms |
|---|---|
Shim của runtly, phân giải rồi mới gọi exec | 1.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ó.
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
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
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
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ệnhKé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.
Homebrew
Tuỳ dòng lệnh bạn chạyỨng dụng và CLI
$brew install --cask hieuhuynh93/tap/runtly-appChỉ riêng CLI
$brew install hieuhuynh93/tap/runtlyTrình cài qua shell
Chỉ dòng lệnh — cho server và CI, nơi một cửa sổ là vô nghĩaCLI
$curl -fsSL https://runtly.flatium.com/download | shCLI và ứng dụng
$curl -fsSL https://runtly.flatium.com/download | RUNTLY_WITH_APP=1 shNó 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.


