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/ratatypst

Trong 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ínhGiá trị
Reposermuns/ratatypst
Sao / fork / commits22 / 0 / 29
LicenseUnlicense (public domain)
Ngôn ngữ chínhRust 91.3%, Typst 6.9%, Just 1.8%
Crate cốt lõiratatypst-core — expose TypstBackend
Cơ chế nhúngTypst Plugin function (WASM)
Cảm hứngTypst package soviet-matrix
Cài đặtcargo add --git https://github.com/sermuns/ratatypst

Workflow điển hình

  1. Viết app Ratatui như bình thường, nhưng dùng ratatypst_core::TypstBackend thay cho Crossterm.
  2. Tạo file main.typ nạp WASM plugin và gọi backend.
  3. Chạy typst watch main.typ hoặc mở typst-preview.nvim — PDF rebuild mỗi khi state thay đổi.

So sánh các Ratatui backend

BackendTargetTương tác
Crossterm (mặc định)TTY cross-platformReal-time, mouse + keyboard
Termion / TermwizTTY UnixReal-time
ratatui-xterm-jsBrowser (xterm.js)Real-time, qua WASM
egui_ratatuiGUI canvas (egui/bevy/eframe)Real-time
ratatypstPDF qua TypstStatic — "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.