- Một trình duyệt có thể render HTML và CSS đã được một người cùng một LLM agent tự triển khai trực tiếp bằng Rust chỉ trong 3 ngày
- Dự án được hoàn thành với khoảng 20.150 dòng code, bao gồm các tính năng cơ bản như cuộn, quay lại và chế độ headless
- Được thiết kế để chạy trên Windows, macOS và Linux mà không dùng thư viện Rust bên ngoài
- Quá trình phát triển được thực hiện dưới hình thức cộng tác với agent Codex: con người phụ trách điều phối và kiểm chứng, còn agent đảm nhiệm việc viết code
- Kết quả cho thấy tổ hợp “một người + một agent” hiệu quả hơn nhiều agent
Tổng quan dự án
- Mục tiêu là xây dựng mới hoàn toàn một trình duyệt cơ bản có thể render HTML và CSS
- Không hỗ trợ JavaScript
- Nhà phát triển bắt đầu “cho vui” và thực hiện cùng LLM agent (Codex)
- Đặt ra các ràng buộc như hoàn thành trong 3 ngày, không được dùng dependency Rust bên ngoài và hỗ trợ 3 hệ điều hành lớn
- Trình duyệt có engine render riêng, đồng thời gồm tính năng chụp màn hình, nhấp liên kết và kiểm thử hồi quy
Ngày 1 – triển khai ban đầu
- Bắt đầu từ việc render “Hello World”, sau đó thêm xử lý thẻ lồng nhau và tính năng chụp màn hình
- Xác định đặc tả HTML/CSS và đưa vào tính năng so sánh hình ảnh cho kiểm thử E2E
- Chỉ sau một ngày đã đạt đến mức dùng X11 và cURL để tải website về rồi render
- Codebase vào khoảng 7.500 dòng, mọi file đều được giữ dưới 1.000 dòng
Ngày 2 – mở rộng tính năng
- Thêm chế độ
--headless để giải quyết vấn đề cửa sổ bật lên khi chạy test
- Cải thiện thay đổi kích thước cửa sổ, độ tương thích, hiệu năng và render font
- Workflow là chia sẻ ảnh chụp màn hình website rồi để Codex tái hiện lại
- Phần lớn code do agent viết, con người phụ trách rà soát và phê duyệt
Ngày 3~4 – hoàn thiện và hỗ trợ đa nền tảng
- Bổ sung các tính năng thiết yếu của trình duyệt như cuộn, log debug, nút quay lại
- Triển khai hỗ trợ macOS và Windows và vượt qua kiểm thử
- Hoàn tất tích hợp CI và bản build phát hành, tổng thời gian phát triển khoảng 72 giờ
Kết quả và thống kê code
- Codebase cuối cùng gồm khoảng 20.150 dòng, cấu thành từ 72 file
- Các file chính bao gồm những module như
layout, style, platform, browser
Cargo.lock trống, tức có thể chạy hoàn toàn độc lập mà không cần gói Rust bên ngoài
- Có thể tải trực tiếp binary được build bằng CI và mã nguồn từ GitHub
Bài học chính
- Tổ hợp một người + một agent hiệu quả hơn việc dùng hàng nghìn agent
- Một agent đơn lẻ có thể xử lý một codebase trong thời gian dài và tạo ra tiến triển thực chất
- Có khả năng mở rộng theo mô hình nhiều người, mỗi người sở hữu agent riêng
- Giảm tốc độ lại đôi khi cho kết quả nhanh hơn và tốt hơn
- Vai trò của con người điều khiển agent có thể quan trọng hơn cả thiết kế hệ thống
- Kết luận là, trước câu hỏi “liệu đưa nhiều agent vào có làm tăng tốc phát triển không?”,
đây là một ví dụ cho thấy hợp tác giữa một người và một agent có thể thực tế và hiệu quả hơn
4 bình luận
Có thể tôi không rõ lắm, nhưng
blog của simonmà mọi người trong các ý kiến trên Hacker News nhắc tới là blog gì vậy, sao cứ được nhắc đến hoài thế...?Có lẽ lý do bài blog của Simon Willison được nhắc đến nhiều trên Hacker News là vì,
Đây là blog đứng số 1 trong những blog được yêu thích nhất trên Hacker News năm 2025. Vừa có danh tiếng, vừa có số lượng bài đăng rất đáng kể, nên từ góc nhìn của một người dùng Hacker News thông thường, đây có lẽ là blog được ghé thăm thường xuyên nhất và vì thế tự nhiên được xem như một chỉ dấu.
Ý kiến trên Hacker News
Tôi nghĩ đây là bản demo trình duyệt sinh mã tốt hơn rất nhiều so với FastRender của Cursor
Nhỏ hơn nhiều, chỉ khoảng 20 nghìn dòng Rust, chỉ dùng thư viện hệ thống để render hình ảnh và văn bản, mã nguồn cũng dễ đọc
Ví dụ, nhìn vào mã triển khai flexbox thì thấy rất rõ ràng
Tôi cũng đã đăng ảnh chụp màn hình render blog của mình; nó xử lý tốt CSS gradient và biểu tượng SVG nhưng thất bại với PNG
Tôi từng nghĩ trình duyệt render HTML+CSS là bài toán hoàn hảo để trình diễn agent song song, nhưng thật đáng ngạc nhiên là chỉ một coding agent cũng làm được
Điều quan trọng không chỉ là dùng thật nhiều token, mà là cách tận dụng agent hiệu quả
Tôi cũng đã nhiều lần tạo ra hàng loạt dự án rồi bỏ đó sau vài ngày. Agent chỉ làm đúng những gì được bảo mà không có phản hồi, nên nếu đi sai hướng thì chỉ càng đào hố sâu hơn
Dù Claude có đi chệch hướng, nếu có cấu trúc agent đúng thì vẫn có thể kéo lại được
Hiện tôi đang thử nghiệm tách riêng agent đánh giá, nghiên cứu và triển khai
Tôi để họ mở rộng test dựa trên điểm số hoặc điều tra nguyên nhân thất bại, và nếu không có cải thiện thì hủy commit
Cấu trúc như vậy có lợi hơn nhiều cho quản lý chất lượng mã nguồn
Trong thời đại mà code rẻ và có thể vứt bỏ, chính workflow cũng phải thay đổi
Câu chuyện này giống như “David vs Goliath”: 1 người + 1 agent đánh bại một trình duyệt trị giá 5 triệu USD, 1,6 triệu LOC
AI vẫn là một hộp đen, nên mọi người đều đang vừa thử nghiệm vừa tìm hướng đi
Mới chỉ qua một tháng của năm 2026, mà đã thấy háo hức về những thử nghiệm sắp tới
Sẽ rất thú vị nếu Simon định kỳ xem lại thread dự đoán năm 2026 trên HN
Họ đặt giới hạn 3 ngày và quy định phải hỗ trợ X11/Windows/macOS chỉ bằng thư viện mặc định của hệ điều hành, không dùng crate bên thứ ba của Rust
Hoàn thành trong khoảng 20 nghìn LOC, trong đó 14 nghìn dòng là engine và 6 nghìn dòng là mã hỗ trợ nền tảng
Đã công khai mã nguồn và binary
Giờ thì nhờ bộ test có thể đọc được bằng máy mà hiệu quả cao hơn hẳn
Ngày xưa hành vi của IE gần như là chuẩn thực tế, còn bây giờ thì Google, Apple và nhiều bên khác cùng đóng góp vào chuẩn hóa nên mọi thứ tốt hơn nhiều
Ngoài tính năng ra, tôi rất tò mò về kiểm toán bảo mật của kiểu codebase này
Rust chắc có giúp ích, nhưng tôi nghi ngờ chỉ riêng những đảm bảo của ngôn ngữ có đủ hay không
Rust chỉ ngăn các lỗi bộ nhớ cơ bản chứ không ngăn được những thứ như truy cập file cục bộ
Không có JS engine nên khó rò rỉ dữ liệu hơn, nhưng nếu kiểm toán thì chắc sẽ lộ ra nhiều lỗ hổng nghiêm trọng
Cộng đồng đã chờ browserBench từ lâu, nên thật vui khi cuối cùng nó cũng bắt đầu
Trình duyệt là một trong những phần mềm phức tạp nhất, nên những thử nghiệm như thế này sẽ trở thành mốc tham chiếu để đánh giá giới hạn
Tôi rất khó hình dung việc làm một trình duyệt chỉ với 20 nghìn dòng
Chỉ riêng zlib đã là 12 nghìn dòng rồi, nên cảm giác như phải có gì đó bị lược bỏ
Tôi tò mò liệu nó chỉ đang gọi các hàm render của hệ điều hành hay không
README có ghi rõ đang dùng những thư viện nào
Khi tôi chạy thử thì việc render khá rối rắm
Màu liên kết và gạch chân không nhất quán, và trên Windows thì nút quay lại không hoạt động
Dù vậy, nó vẫn render khá tốt trang chủ HN và blog của Simon
Mục tiêu là triển khai tính năng tương tự với số LOC ít hơn
Không có stylesheet mặc định nên màu liên kết không đồng nhất
Trên Windows 11 thì nút quay lại hoạt động. Nếu bạn dùng Windows 10 thì đó có thể là nguyên nhân
Có vẻ như render blog của Simon sẽ trở thành mục tiêu tiêu biểu cho trình duyệt AI
Nhưng hiện tại thì nó vẫn giống một renderer hơn là một trình duyệt thật sự
Sẽ ấn tượng hơn nếu AI được dùng để bổ sung triển khai API trong các dự án như Servo
Dù vậy, nó vẫn tốt hơn nỗ lực của Cursor, và việc “biên dịch được” ít nhất cũng là một bước tiến tối thiểu
Tôi tò mò nếu làm một mình thì sẽ mất bao lâu
Để hiểu mức độ trợ giúp của agent, tôi muốn biết độ sâu chuyên môn đã được đưa vào phần hướng dẫn cho nó là như thế nào
Tôi biết Rust nhưng không biết X11, macOS hay Windows API, nên có lẽ còn khó mà bắt đầu
Tuy vậy, tôi có nhiều kinh nghiệm về test, hạ tầng và thiết kế nên điều đó giúp ích trong việc cộng tác với agent
dự án này theo mặt bằng năm 2000 được ước tính là 4,58 nhân-năm, 610 nghìn USD,
còn theo mặt bằng năm 2025 là khoảng 5,6 năm, 1,38 triệu USD
Điều thú vị ở bài viết này không phải là thành phẩm mà là quá trình tạo ra và các ràng buộc
Phần lớn bài viết tập trung vào kết quả hoặc tác giả, còn bài này đem lại góc nhìn lấy quy trình làm trung tâm
Vì thế tôi cảm thấy việc khám phá đâu mới là phần thực sự khó, và quy trình nào đã đi sai, có ý nghĩa hơn nhiều
Công việc rất ấn tượng
Tôi tò mò nếu triển khai khả năng truy cập (Accessibility) mà không có dependency Rust thì phải làm thế nào
Trên Windows/macOS thì có thể dùng UI Automation và NSAccessibility, nhưng trên X11 thì có thể