zerostack: agent lập trình Rust chỉ cần 8MB RAM
Một buổi sáng tôi gõ claude --version chỉ để kiểm tra con số. Con trỏ đứng yên. Bốn giây sau terminal in ra một chuỗi version rồi im lặng.
Tôi không phải người duy nhất để ý chuyện này. Một tài khoản tên mohsen1 trên HN đã bấm giờ nghiêm chỉnh và đăng kết quả lên:
$ time claude --version
2.1.143 (Claude Code)
Executed in 4.39 secs fish external
usr time 29.68 millis 0.26 millis 29.41 millis
sys time 71.30 millis 1.30 millis 70.00 millis
Benchmark đó giờ đang nằm trong thread bình luận của zerostack, một coding agent Rust vừa xuất hiện trên HN hôm qua với 335 upvote.
Câu chuyện trong một câu
zerostack là một coding agent full-featured viết bằng 7.000 dòng Rust thuần - hỗ trợ đa provider (OpenRouter, OpenAI, Anthropic, Gemini, Ollama), hệ thống phân quyền bốn mức, quản lý session, hệ thống prompts có thể chuyển đổi, MCP cho công cụ mở rộng, tích hợp git worktree, và vòng lặp tác vụ dài hạn - với RAM idle chỉ khoảng 8MB và binary nặng 8.9MB.
Để so sánh: opencode và các agent nền JS khác chạy ở mức khoảng 300MB lúc rảnh.
--> // making it invisible to querySelectorAll. // // `data-cfasync="false"` keeps this rescue script executable even when // Rocket Loader is active. It rescues module scripts via two strategies: // 1. Query the DOM for type$="-module" + src (covers case A) // 2. Regex-parse the raw HTML for commented-out script tags (covers case B) // Dynamically-created scripts bypass Rocket Loader entirely. (function () { if (window.__markdyRescue) return; window.__markdyRescue = true; var rescued = false; function rescueModuleScripts() { if (rescued) return; rescued = true; var srcs = []; // Strategy 1: Rocket Loader kept the tag in DOM but changed the type. // type="module" → type="{uuid}-module" (still has src attribute) document.querySelectorAll('script[type$="-module"][src]').forEach(function (s) { srcs.push(s.src); }); // Strategy 2: Rocket Loader COMMENTED OUT the script tag entirely: // // These are invisible to querySelectorAll, so we parse the raw HTML. // We handle both attribute orderings (type-first or src-first). var html = document.documentElement.innerHTML; var reSrcFirst = //g; var reTypeFirst = //g; var m; while ((m = reSrcFirst.exec(html)) !== null) { srcs.push(m[1]); } while ((m = reTypeFirst.exec(html)) !== null) { srcs.push(m[1]); } // Re-inject each found src as a real module script. // Deduplicate first, then inject. Dynamically-created scripts bypass // Rocket Loader entirely. Modules with the same URL are only executed // once by the browser (cached), so re-injecting already-running scripts // is safe. var seen = {}; srcs.forEach(function (src) { if (seen[src]) return; seen[src] = true; var fix = document.createElement('script'); fix.type = 'module'; fix.src = src; fix.setAttribute('data-cfasync', 'false'); document.head.appendChild(fix); }); } // Rescue when user clicks the placeholder (fallback if autoplay failed). document.addEventListener('click', function (e) { var t = e.target; if (t && typeof t.closest === 'function' && t.closest('.markdy-placeholder')) { rescueModuleScripts(); } }); // Rescue automatically after a short delay for autoplay. // Only fires if initAll() never ran (no data-markdy-init on any root). setTimeout(function () { if (document.querySelector('.markdy-root:not([data-markdy-init])')) { rescueModuleScripts(); } }, 1500); }());Vì sao bài này leo top HN
Công thức quen thuộc: Rust, một lập trình viên, một dự án lớn dần thành thứ gì đó thật sự, và một README có bảng hiệu năng khiến các tool khác trông ngại.
| Chỉ số | zerostack | opencode / agent JS |
|---|---|---|
| RAM (rảnh) | ~8MB | ~300MB |
| RAM (đang làm) | ~12MB | ~300MB+ |
| CPU (rảnh) | 0,0% | ~2% |
| CPU (dùng tool) | ~1,5% | ~20% |
| Kích thước binary | 8,9MB | - |
Cú đấm càng mạnh hơn khi nhìn vào danh sách tính năng thật sự. Đây không phải toy project bị cắt xén. Nó có hệ thống prompts với các chế độ chuyển đổi được: code, plan, review, debug, ask, brainstorm, frontend-design, review-security… Nó tự đọc AGENTS.md và CLAUDE.md từ thư mục dự án, y như mọi agent lớn khác. Nó có bộ phát hiện doom-loop - tự động dừng lại khi agent lặp đúng một tool call ba lần liên tiếp.
Nói cách khác: đủ tính năng, nhưng chỉ bằng một phần bốn mươi bộ nhớ.
Thread HN đang tranh cãi gì
Bình luận nổi nhất đến từ throwa356262, thẳng vào con số:
“RAM footprint: ~8MB khi session rỗng, ~12MB khi đang làm việc. Tôi thích điều này lắm, Claude Code đang dùng nhiều gigabyte, cực kỳ khó chịu trên laptop cấu hình thấp.”
Tiếp theo, 360MustangScope thú nhận họ đang giữa chừng tự viết một agent Rust thì zerostack xuất hiện:
“Thật buồn cười khi opencode cứ leak bộ nhớ dần, đến khi làm dự án lớn thì leo lên 6GB rồi chậm dần đều.”
Rồi bình luận sắc bén nhất thread đến từ 2001zhaozhao:
“Hơi buồn cười khi coding agent cần kéo 1000W+ và dùng 2TB+ bộ nhớ ở data center để chạy, vậy mà người ta cứ tập trung vào vài watt và vài trăm megabyte trên laptop - vốn đã bị chi phí compile code che khuất rồi.”
Kỹ thuật mà nói, điều này đúng. Model không chạy trên máy của bạn. Inference nằm đâu đó ở một data center, và chi phí năng lượng mỗi request lớn hơn nhiều so với những gì client địa phương tiêu tốn. Liệu process local dùng 8MB hay 300MB chỉ là nhiễu so với đó.
Nhưng tôi nghĩ lập luận ngược lại cũng có lý: hiệu năng client-side không phải chuyện bảo vệ môi trường - mà là chuyện cảm giác dùng tool. Một tool ngốn 2% CPU khi bạn không dùng nó, một tool mất bốn giây để in ra version của chính nó - tool đó đang nói với bạn điều gì đó về những giả định mà tác giả đã mặc định. Và những giả định đó không phải của tôi.
Nên thử không?
Thử zerostack nếu: bạn đang dùng agent dòng lệnh và muốn thứ gì đó không ngốn 2% CPU lúc nhàn, máy bạn có RAM hạn chế và 300MB thật sự gây khó chịu, bạn muốn chuyển LLM provider mà không phải đổi tool, hoặc bạn tò mò xem một lập trình viên solo xây dựng toàn bộ agent stack trong ~7k dòng như thế nào.
Bỏ qua nếu: bạn cần tích hợp VS Code của Claude Code, cần hỗ trợ Windows được kiểm thử kỹ (zerostack nói thẳng là không test), hoặc workflow của bạn phụ thuộc vào thứ gì đó provider-specific.
Cài đặt chỉ một lệnh:
cargo install zerostack
export OPENROUTER_API_KEY="your-key"
zerostack
Có một tính năng tôi thích: sandbox mode. Cài bubblewrap rồi truyền --sandbox, mọi lệnh bash sẽ chạy trong môi trường cô lập. Loại tính năng này cho thấy tác giả đã nghĩ đến những gì có thể xảy ra nếu mọi thứ đi sai hướng.
Toàn bộ codebase nhỏ đến mức một người dùng (hiAndrewQuinn) đã đút cả source code vào một agent khác để kiểm tra tự động và không thấy gì đáng ngờ. Đó là ưu điểm của codebase nhỏ và dễ đọc.
Thảo luận trên Hacker News · Nguồn: crates.io · Đăng bởi gidellav
Hoang Yell
Một nhà phát triển phần mềm và là người kể chuyện kỹ thuật. Tôi đọc Hacker News mỗi ngày và kể lại những câu chuyện hay nhất ở đây — bằng tiếng Việt và tiếng Anh, cho người tò mò nhưng không có thời gian.