- Một dev người Thụy Điển vừa ghép hai thứ tưởng chừng không liên quan: Ratatui (framework TUI cho Rust) và Typst (hệ typesetting hiện đại).
- Kết quả là ratatypst — viết app terminal bằng Rust, render thẳng ra PDF, và xem PDF cập nhật live khi state thay đổi.
TL;DR
ratatypst là một Typst package proof-of-concept của sermuns cho phép bạn viết một app Ratatui (framework TUI của Rust) rồi render nó thẳng thành PDF thông qua Typst. Dùng typst watch hoặc typst-preview.nvim, file PDF cập nhật live mỗi khi state thay đổi. Repo: 22 sao, 29 commits, license Unlicense (public domain).
Có gì mới
Trước giờ Ratatui chỉ render ra terminal — backend mặc định là Crossterm, phụ là Termion/Termwiz. Có vài thử nghiệm đẩy Ratatui ra browser (ratatui-xterm-js) hoặc nhúng vào GUI (egui_ratatui). Nhưng chưa có ai render Ratatui ra một hệ typesetting paginated.
ratatypst là backend đầu tiên làm chuyện đó. Nó cài đặt trait Backend của Ratatui, nhưng thay vì ghi ANSI cells xuống TTY, nó sinh ra Typst markup mô tả lưới ô (ký tự, foreground/background, modifier). Markup này được đóng gói thành WASM plugin mà Typst load tại lúc compile.
Cách dùng cũng đơn giản đến mức gây bất ngờ:
cargo add --git https://github.com/sermuns/ratatypstTrong code Rust thay CrosstermBackend bằng ratatypst_core::TypstBackend. Trong main.typ nạp WASM plugin và gọi backend. Mở typst watch main.typ ở terminal kế bên, hoặc typst-preview.nvim trong Neovim — mỗi lần state thay đổi, PDF tự rebuild trong vài trăm ms.
Vì sao đáng chú ý
Đây là minh chứng đẹp cho việc plugin model của Typst mạnh đến đâu. Bất cứ thứ gì compile được sang wasm32-unknown-unknown đều có thể chạy bên trong pipeline typesetting — và một TUI framework đầy đủ widgets (charts, tables, gauges, sparklines) chỉ là một trong vô số use case.
Với người làm tài liệu, ý nghĩa thực tế là: bạn không cần chụp ảnh terminal nữa. State của app hiển thị trong PDF luôn là vector, text vẫn select được, sharp ở mọi mức zoom, và có thể tự động cập nhật khi rebuild docs. Khi ai đó đọc PDF, họ thấy chính xác cùng một frame mà Ratatui đã render — không có pixel mờ, không có anti-aliasing lệch font hệ thống, không có hậu kỳ chỉnh ảnh.
Ở góc khác, nó cũng cho thấy ranh giới "TUI là cho terminal, document là cho LaTeX" vốn không cứng như ta tưởng. Khi một framework UI và một engine layout đều có thể chạy chung trong một WASM sandbox, hai thế giới đó hợp nhất lại được.
Kỹ thuật
| Thuộc tính | Giá trị |
|---|---|
| Repo | sermuns/ratatypst |
| Sao / fork / commits | 22 / 0 / 29 |
| License | Unlicense (public domain) |
| Ngôn ngữ chính | Rust 91.3%, Typst 6.9%, Just 1.8% |
| Crate cốt lõi | ratatypst-core — expose TypstBackend |
| Cơ chế nhúng | Typst Plugin function (WASM) |
| Cảm hứng | Typst package soviet-matrix |
| Cài đặt | cargo add --git https://github.com/sermuns/ratatypst |
Workflow điển hình
- Viết app Ratatui như bình thường, nhưng dùng
ratatypst_core::TypstBackendthay cho Crossterm. - Tạo file
main.typnạp WASM plugin và gọi backend. - Chạy
typst watch main.typhoặc mởtypst-preview.nvim— PDF rebuild mỗi khi state thay đổi.
So sánh các Ratatui backend
| Backend | Target | Tương tác |
|---|---|---|
| Crossterm (mặc định) | TTY cross-platform | Real-time, mouse + keyboard |
| Termion / Termwiz | TTY Unix | Real-time |
| ratatui-xterm-js | Browser (xterm.js) | Real-time, qua WASM |
| egui_ratatui | GUI canvas (egui/bevy/eframe) | Real-time |
| ratatypst | PDF qua Typst | Static — "live" theo nhịp recompile |
Use cases thực tế
- Tài liệu & tutorial cho TUI app — nhúng screenshot vector chính xác, không cần PNG raster. Khi UI thay đổi, chỉ cần rebuild docs là ảnh tự cập nhật.
- Báo cáo & dashboard PDF định kỳ — dùng widgets Ratatui (table, gauge, sparkline) làm layout, xuất ra PDF print-ready. Cron job hàng tuần render báo cáo trạng thái server, gửi email PDF — không cần mở browser.
- Slide & tài liệu giảng dạy về Rust/TUI: minh hoạ widget bằng chính code thật, không phải screenshot tĩnh.
- Archival — snapshot trạng thái một TUI dài hơi (system monitor, log viewer) thành PDF vector lưu lâu dài.
- Test snapshot — diff PDF render của Ratatui app giữa các commit để bắt regression UI.
- Fun — author tự gọi project là "a very silly project that works surprisingly well", và đó là một phần điểm sáng.
Hạn chế & giá
- Miễn phí, public domain (Unlicense). Không có SaaS, không pricing.
- Proof-of-concept: chưa có release trên crates.io, phải cài qua git.
- Example demo còn rất cơ bản. Tính tương tác trong PDF không có — "live" là live ở nguồn, không phải trong file PDF.
- Cần Rust toolchain + Typst CLI cài sẵn.
Tiếp theo là gì
Tác giả nói sẽ "mở rộng thêm" nhưng chưa có roadmap công khai. Hướng tự nhiên: fidelity màu/style đầy đủ hơn, xử lý font metrics tốt hơn, đóng gói release lên Typst registry, thêm example app phức tạp.
Trong khi đó hệ sinh thái Ratatui vẫn rất sôi động — fork từ tui-rs năm 2023, danh sách awesome-ratatui ngày càng dài. ratatypst là một nhánh sáng tạo hiếm có: kéo TUI ra khỏi terminal và đặt nó vào trang giấy in được.
Nguồn: github.com/sermuns/ratatypst, Typst Forum showcase, @orhundev tweet.



