Spec-driven document rendering engine
Transform Markdown into publication-ready PDF and HTML — defined once, rendered anywhere.
Renderflow is a config-driven rendering engine that transforms Markdown documents into polished PDF and HTML output — no complex shell scripts, no Pandoc flags to memorize.
Define your output spec in YAML. Point it at your Markdown. Run one command.
- 📄 Multi-format output — Render to PDF and HTML from a single config file
- 🗂️ YAML-driven spec — Declarative, repeatable, version-controllable builds
- 🖼️ Asset management — Automatically resolves and validates image paths
- 🔄 Transform pipeline — Pluggable in-memory content transforms
- 🧩 Custom templates — Per-output Jinja2-compatible templates via Tera
- 🔍 Dry-run mode — Preview what will be built without writing any files
- 🦀 Built with Rust — Fast, safe, and reliable
1. Create your Markdown document (input.md):
# My Document  Welcome to my publication.2. Create a config file (renderflow.yaml):
input: "input.md" output_dir: "dist" outputs: - type: pdf - type: html3. Render:
renderflow buildOutput files appear in dist/:
dist/ ├── input.pdf └── input.html Pre-built binaries are available for Linux, macOS, and Windows on the Releases page.
Linux:
curl -L https://github.com/egohygiene/renderflow/releases/latest/download/renderflow-linux -o renderflow chmod +x renderflow sudo mv renderflow /usr/local/bin/macOS:
curl -L https://github.com/egohygiene/renderflow/releases/latest/download/renderflow-macos -o renderflow chmod +x renderflow sudo mv renderflow /usr/local/bin/Windows:
Download renderflow-windows.exe from the Releases page and place it somewhere on your PATH.
cargo install --path .# Render using the default renderflow.yaml config renderflow build # Render using a custom config file renderflow build --config my-project.yaml # Shorthand: pass the config file directly renderflow my-project.yaml # Preview what would be built, without writing any files renderflow build --dry-run # Enable verbose or debug logging renderflow build --verbose renderflow build --debugNote: The argument to
renderflowis always a YAML config file. The Markdown source is specified inside the config via theinputkey (e.g.input: "input.md").
Renderflow is entirely driven by a YAML spec file (default: renderflow.yaml):
input: "input.md" # Path to your Markdown source output_dir: "dist" # Output directory (default: dist) outputs: - type: pdf # Render to PDF (requires Pandoc + Tectonic) - type: html # Render to HTML template: "default" # Optional: use a custom template| Type | Description | Requirements |
|---|---|---|
html | Renders to HTML | Pandoc |
pdf | Renders to PDF via LaTeX | Pandoc + Tectonic |
Templates live in a templates/ directory and use Tera syntax (Jinja2-compatible). Specify a template per output with the template key. A default HTML template is included out of the box.
Renderflow processes documents through a two-phase pipeline:
Input Markdown │ ▼ ┌─────────────────────┐ │ Transform Phase │ In-memory text transformations (emoji, etc.) └─────────────────────┘ │ ▼ ┌─────────────────────┐ │ Step Phase │ I/O and external tool execution (Pandoc, Tectonic) └─────────────────────┘ │ ▼ Output Files (PDF / HTML) Key design patterns:
- Pipeline — Ordered, composable steps with clean error propagation
- Strategy — Each output format is an independent, swappable rendering strategy
- Transform — Pure in-memory text transforms applied before any I/O
- DOCX output format
- Watch mode (re-render on file change)
- Built-in stylesheet themes
- SVG / emoji embedding in PDFs
- Plugin system for custom transforms
MIT © Ego Hygiene