typst-bake

Crates.iotypst-bake
lib.rstypst-bake
version0.1.3
created_at2026-01-15 18:48:18.879293+00
updated_at2026-01-19 13:05:05.12395+00
descriptionBake Typst templates, fonts, and packages into your Rust binary — use Typst as a self-contained, embedded library
homepage
repositoryhttps://github.com/elgar328/typst-bake
max_upload_size
id2046302
size136,557
elgar328 (elgar328)

documentation

README

typst-bake

Crates.io Documentation CI License

Bake Typst templates, fonts, and packages into your Rust binary — use Typst as a self-contained, embedded library.

Features

  • Multi-Format Output - Generate PDF, SVG, or PNG from the same template
  • Simple API - Generate documents with just document!("main.typ").to_pdf()
  • Minimal Setup - Just specify template-dir and fonts-dir in Cargo.toml metadata
  • File Embedding - All files in template-dir are embedded and accessible from templates
  • Font Embedding - Fonts (TTF, OTF, TTC) in fonts-dir are automatically bundled into the binary
  • Automatic Package Bundling - Scans for package imports, downloads them at compile time, and recursively resolves all dependencies
  • Package Caching - Downloaded packages are cached in system cache directory for faster compilation. Use TYPST_BAKE_REFRESH=1 to force re-download
  • Runtime Inputs - Pass dynamic data from Rust structs to Typst via IntoValue / IntoDict derive macros
  • Optimized Binary Size - Resources are compressed with zstd and decompressed lazily at runtime
  • Smart Recompilation - File changes trigger recompilation automatically, with optional build script for complete coverage

Installation

Add to your Cargo.toml:

[dependencies]
typst-bake = "0.1"

[package.metadata.typst-bake]
template-dir = "./templates"  # Path to your .typ files and assets
fonts-dir = "./fonts"         # Path to your font files

Cargo Features

Feature Description
pdf (default) Enable to_pdf()
svg Enable to_svg()
png Enable to_png()
full Enable all output formats

PDF works out of the box. To disable PDF and use only SVG: default-features = false, features = ["svg"].

Optional: Complete File Change Detection

By default, typst-bake detects template or font file modifications and triggers recompilation when you run cargo build. File additions and deletions are not detected directly, but this is rarely an issue—adding a new file usually requires modifying an existing file (like main.typ) to use it, which triggers recompilation anyway.

If you want to fully detect even the rare case where you only add or remove files without modifying existing ones, add a build script:

# Cargo.toml
[package]
build = "build.rs"

[build-dependencies]
typst-bake = "0.1"
// build.rs
fn main() {
    typst_bake::rebuild_if_changed();
}

Quick Start

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let doc = typst_bake::document!("main.typ");

    // Generate PDF
    let pdf = doc.to_pdf()?;
    std::fs::write("output.pdf", &pdf)?;

    // Generate SVG
    let svgs = doc.to_svg()?;
    std::fs::write("page1.svg", &svgs[0])?;

    // Generate PNG at 144 DPI
    let pngs = doc.to_png(144.0)?;
    std::fs::write("page1.png", &pngs[0])?;

    Ok(())
}

For a complete walkthrough, see the Quick Start Guide (PDF). Also check out the PDF outputs from other examples below—each document explains its usage in detail.

Examples

Example Description Command Output
quick-start Generates the Quick Start PDF using all features cargo run -p example-quick-start PDF
font-guide Guide to font setup and usage cargo run -p example-font-guide PDF
with-inputs Pass dynamic data from Rust to Typst cargo run -p example-with-inputs PDF
with-files Embed images and various data files cargo run -p example-with-files PDF
with-package Automatic package bundling cargo run -p example-with-package PDF
output-formats Multi-format output with rendering test patterns cargo run -p example-output-formats See below

output-formats Example Outputs

Format Files
PDF output.pdf (42KB)
SVG output_1.svg (306KB), output_2.svg (700KB)
PNG output_1.png (388KB), output_2.png (693KB)

Comparison with typst-as-lib

typst-as-lib is a lightweight and flexible wrapper that makes it easy to use the Typst compiler as a Rust library. It supports various combinations of runtime filesystem access, package downloads from the internet, caching, and more.

typst-bake uses typst-as-lib internally, adding a layer focused on creating self-contained binaries. This focused scope enables a simple, easy-to-use API. It embeds all resources (templates, fonts, packages) into the binary at compile time, so the resulting executable works anywhere without external files or network access. For packages, the entire process—scanning, downloading, compressing, and embedding—is fully automatic.

Key Differences

Aspect typst-as-lib typst-bake
Resources Runtime filesystem access or compile-time individual file embedding Embeds entire folders at compile time
Packages Runtime download (with caching) or local filesystem Automatic scan, download, compress, and embed at compile time
Fonts Typst default fonts, embedded fonts, system fonts, etc. Embedded fonts only
Configuration Flexible setup via builder pattern in code Cargo.toml metadata only
API Flexible with fine-grained control Simple (document!("main.typ").to_pdf())

Which should you use?

  • If you want all resources embedded in your binary for a fully self-contained executable → use typst-bake
  • If you prefer runtime flexibility (e.g., downloading packages on demand to reduce binary size) → use typst-as-lib directly

License

MIT OR Apache-2.0

Commit count: 57

cargo fmt