folio is a Typst package that turns project data into publication-grade documents. You write the data; folio writes the document.
Quickstart
#import "@preview/folio:0.0.1": project-doc
#let project = (
project: (name: "My Project", description: "A folio demonstration"),
initiation: (pitch: "This project will change everything.")
)
#show: project-doc(
data: project,
config: (audit: true, toc: true),
brand: (palette: (primary: rgb("#003e7e"))),
)
What’s in v0.0.1
Folio v0.0.1 covers 14 PMBOK-aligned sections across 4 phases:
- Phase 1: Initiation: Business Case, Project Objectives, Project Pitch.
- Phase 2: Planning: Project Boundaries, Budget, Gantt, Milestones, Team.
- Phase 3: Execution: Change Log, Issue Log, Risk Matrix, Status Report.
- Phase 4: Closure: Lessons Learned, Sign-off.
Plus support for Custom Sections at any insertion point.
Features
- The Data is the Document: All content lives in a single dictionary.
- Graceful Failure: Missing fields show as red placeholders, not build errors.
- Audit System: Diagnostic dashboard for data completeness and orphan references.
- Extensible: Inject custom sections at named insertion points.
Branding
folio supports a multi-layered branding system. You can use built-in presets or create your own brand packs.
#show: project-doc(
data: project,
brand: (preset: "academic")
)
Audit System
Folio includes a diagnostic audit system. To enable it, set audit: true in the config.
Note: Orphan Reference detection requires a second compile pass for full accuracy, as it depends on Typst’s layout query system.
Documentation
See docs/manual.pdf for full API reference and schema details.
Examples
Browse examples for runnable templates that show folio end-to-end:
minimal— smallest viable document, ideal starting pointfull-standards— every PMBOK section populatedbranding-demo— brand presets and token overridesthesis— academic preset adaptationrfp— request-for-proposal formathardware— hardware-project variant
Each section also ships a standalone showcase in
examples/components— one minimal.typper component, designed as drop-in snippets you can paste straight into your own document. Source-only by design: the top-level examples above already render these components in context.