███████████ █████ █████ ███████████
░█░░░███░░░█ ░░███ ░░███ ░░███░░░░░░█
░ ░███ ░ ██████ ░░███ ███ ░███ █ ░ ██████ ████████ ███████ ██████
░███ ███░░███ ░░█████ ░███████ ███░░███░░███░░███ ███░░███ ███░░███
░███ ░███████ ███░███ ░███░░░█ ░███ ░███ ░███ ░░░ ░███ ░███░███████
░███ ░███░░░ ███ ░░███ ░███ ░ ░███ ░███ ░███ ░███ ░███░███░░░
█████ ░░██████ █████ █████ █████ ░░██████ █████ ░░███████░░██████
░░░░░ ░░░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░░ ░░░░░ ░░░░░███ ░░░░░░
███ ░███
░░██████
░░░░░░
Texforge is a unified LaTeX workspace — one tool for writing, rendering diagrams (Mermaid, Graphviz), and building PDFs. Set it up once and stay focused on your document.
Demo CLI

Features
- 🚀 One-command setup — Install once, everything is included (LaTeX engine, templates, diagram renderers).
- 📊 Diagrams as first-class — Write Mermaid or Graphviz blocks in your
.texfiles; they render and embed during build. - 🪄 Guided workflows — Start a new project or migrate an existing one with a guided init.
- 🔎 Template registry — Install, manage, and validate templates — with built-in fallback for offline work.
- 🔨 Build and live edit — Compile once or use watch mode; rebuild automatically as you edit.
- 🧭 Smart linting — Catch missing files, broken references, bibliography keys, and unclosed environments before build.
- ✨ Format on demand — Normalize
.texfiles with an opinionated formatter (including--checkmode). - 🔄 Placeholders and config — Reuse project details from configuration without retyping.
Installation
Quick install (recommended)
Linux / macOS:
|
Windows (PowerShell):
irm https://raw.githubusercontent.com/UniverLab/texforge/main/scripts/install.ps1 | iex
This downloads and installs texforge. No Rust toolchain required. Tectonic (the LaTeX engine) is installed automatically on first build.
You can customize the install:
# Pin a specific version
VERSION=0.1.0 |
# Install to a custom directory
INSTALL_DIR=/usr/local/bin |
# Pin a specific version (PowerShell)
$env:VERSION="0.1.0"; irm https://raw.githubusercontent.com/UniverLab/texforge/main/scripts/install.ps1 | iex
Via cargo
Tectonic (the LaTeX engine) is installed automatically on first build. No extra steps needed.
Available on crates.io.
From source
# Binary at target/release/texforge
GitHub Releases
Check the Releases page for precompiled binaries (Linux x86_64, macOS x86_64/ARM64, Windows x86_64).
Uninstall
Skill
If you want Copilot to understand texforge and help with common LaTeX tasks, install the texforge Skill:
Demo with OpenCode agents

Quick Start
# Interactive wizard — new project or migrate existing
# Or directly:
Workflow
sequenceDiagram
actor User
participant CLI as texforge
participant Tectonic
User->>CLI: texforge new my-doc
CLI-->>User: project scaffolded
alt Existing LaTeX project
User->>CLI: texforge init
CLI-->>User: project.toml generated
end
User->>CLI: texforge check
CLI-->>User: errors with file:line + suggestion
User->>CLI: texforge fmt
CLI-->>User: .tex files formatted in place
User->>CLI: texforge build
Note over CLI: render embedded diagrams to PNG
CLI->>Tectonic: compile build/main.tex
Note over CLI,Tectonic: auto-installs tectonic on first run
Tectonic-->>User: build/main.pdf
texforge init
Interactive wizard. Auto-detects the context:
- If a
.texfile with\documentclassis found in the current directory — migrates the existing project (asks for title and author, generatesproject.toml) - Otherwise — guides creation of a new project (asks for name and template)
# Existing LaTeX project
# Empty directory
&&
| Command | Description |
|---|---|
texforge new <name> |
Create new project from template |
texforge new <name> -t <template> |
Create with specific template |
texforge init |
Interactive wizard — new project or migrate existing |
texforge build |
Compile to PDF |
texforge build --watch |
Watch for changes and rebuild automatically |
texforge clean |
Remove build artifacts |
texforge fmt |
Format .tex files |
texforge fmt --check |
Check formatting without modifying |
texforge check |
Lint without compiling |
texforge config |
Interactive wizard to set user details (name, email, institution, language) |
texforge config list |
Show all configured values |
texforge config <key> |
Show value for key (name, email, institution, language) |
texforge config <key> <value> |
Set value for key |
texforge template list |
List installed templates |
texforge template list --all |
List installed + available in registry |
texforge template add <name> |
Download template from registry |
texforge template remove <name> |
Remove installed template |
texforge template validate <name> |
Verify template compatibility |
Configuration
Global user details stored in ~/.texforge/config.toml. These are used as replaceable placeholders in templates.
Interactive setup:
This launches a wizard asking for:
- Name: Your full name
- Email: Your email address
- Institution: Your institution/organization
- Language: Document language (default:
english)
Command-line interface:
# View all settings
# Get a specific value
# Set a value
Templates
Templates are managed through the texforge-templates registry. The general template is embedded in the binary and works offline. Run texforge template list --all to see all available templates.
Diagrams
texforge build intercepts embedded diagram environments before compilation. Originals are never modified — diagrams are rendered in build/ copies.
Mermaid
% Default: width=\linewidth, pos=H, no caption
\begin{mermaid}
flowchart LR
A[Input] --> B[Process] --> C[Output]
\end{mermaid}
% With options
\begin{mermaid}
flowchart TD
X --> Y --> Z
\end{mermaid}
Graphviz / DOT
\begin{graphviz}
digraph G
\end{graphviz}
Both rendered to PNG via pure Rust — no browser, no Node.js, no dot binary required.
| Option | Default | Description |
|---|---|---|
width |
\linewidth |
Image width |
pos |
H |
Figure placement (H, t, b, h, p) |
caption |
(none) | Figure caption |
Watch Mode
texforge build --watch watches for .tex file changes and rebuilds automatically:
The terminal shows a live session timer, build count, and the result of the last build. Press Ctrl+C to stop.
Linter
texforge check runs static analysis without compiling:
\input{file}— verifies file exists\includegraphics{img}— verifies image exists\cite{key}— verifies key exists in.bib\ref{label}/\label{label}— verifies cross-reference consistency\begin{env}/\end{env}— detects unclosed environments
ERROR [main.tex:47]
\includegraphics{missing.png} — file not found
ERROR [main.tex:12]
\cite{smith2020} — key not found in .bib
ERROR [main.tex:23]
\begin{figure} never closed
suggestion: Add \end{figure}
Formatter
texforge fmt applies opinionated formatting inspired by rustfmt:
- Consistent indentation (2 spaces) inside environments
- Collapsed multiple blank lines
- Aligned
\begin{}/\end{}blocks
One canonical output regardless of input style. Git diffs stay clean.
Runtime Directory
~/.texforge/
bin/
tectonic # LaTeX engine (auto-installed on first build)
templates/
general/ # Cached templates
apa-general/
...
Platform Support
| Platform | Architecture | Status |
|---|---|---|
| Linux | x86_64 | yes |
| macOS | x86_64 | yes |
| macOS | ARM64 (Apple Silicon) | yes |
| Windows | x86_64 | yes |
Tech Stack
| Concern | Crate |
|---|---|
| CLI parsing | clap (derive) |
| Error handling | anyhow |
| Serialization | serde + toml |
| HTTP client | reqwest (blocking) |
| Archive extraction | flate2 + tar |
| File traversal | walkdir |
| LaTeX engine | tectonic (external binary) |
| Mermaid renderer | mermaid-rs-renderer |
| Graphviz renderer | layout-rs |
| SVG → PNG | resvg |
License
MIT
Support
- 📖 GitHub Issues — Report bugs or request features
- 💬 Discussions — Ask questions
- 🐦 Twitter: @JheisonMB