Cookbook

Each entry is designed so an LLM can copy, adapt, and run it directly. Every recipe includes a clear goal and complete code or commands.

1. Generate a report from a pandas DataFrame

Goal: render a report PDF containing a real table from analytics data.

Prerequisites: pandas must be installed. Run pip install "typy[pandas]" or pip install pandas.

from datetime import date

import pandas as pd

from typy.builder import DocumentBuilder
from typy.content import Content
from typy.functions import Figure, Table
from typy.markup import Heading, Text
from typy.templates import ReportTemplate

df = pd.DataFrame(
    {
        "Region": ["EMEA", "AMER", "APAC"],
        "Revenue": [1_200_000, 980_000, 1_450_000],
        "GrowthPct": [8.1, 5.4, 11.3],
    }
)

body = Content(
    [
        Heading(1, "Quarterly performance"),
        Text("This report summarizes regional revenue and growth."),
        Figure(Table(df.to_dict()), caption="Revenue by region"),
    ]
)

template = ReportTemplate(
    title="Q1 revenue report",
    subtitle="Regional breakdown",
    author="Finance Analytics",
    date=date.today().isoformat(),
    body=body,
    toc=True,
)

DocumentBuilder().add_template(template).save_pdf("q1-report.pdf")

2. Create an invoice from JSON data

Goal: render an invoice with line items loaded from a JSON payload.

import json

from typy.builder import DocumentBuilder
from typy.templates import InvoiceTemplate

payload = {
    "company_name": "Northwind Design LLC",
    "company_address": "101 River St, Porto",
    "client_name": "Contoso Retail",
    "client_address": "25 Market Ave, Lisbon",
    "invoice_number": "INV-2026-0411",
    "date": "2026-04-11",
    "due_date": "2026-05-11",
    "tax_rate": 23.0,
    "notes": "Thank you for your business.",
    "items": [
        {"description": "UI redesign", "quantity": 32, "unit_price": 75.0},
        {"description": "Design system audit", "quantity": 12, "unit_price": 90.0},
    ],
}

with open("invoice.json", "w", encoding="utf-8") as f:
    json.dump(payload, f, indent=2)

data = json.loads(open("invoice.json", encoding="utf-8").read())
template = InvoiceTemplate(**data)
DocumentBuilder().add_template(template).save_pdf("invoice.pdf")

3. Convert a Markdown file to a styled PDF

Goal: convert existing Markdown notes into a PDF without writing Python.

typy render --markdown README.md --output readme.pdf

4. Batch-generate certificates from a CSV

Goal: produce one PDF per person in a CSV list.

import csv
from pathlib import Path

from typy.builder import DocumentBuilder
from typy.templates import BasicTemplate

Path("out").mkdir(exist_ok=True)

rows = [
    {"name": "Alice Martins", "course": "Data Visualization"},
    {"name": "Bruno Costa", "course": "Prompt Engineering"},
]

with open("certificates.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["name", "course"])
    writer.writeheader()
    writer.writerows(rows)

with open("certificates.csv", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        body = (
            "# Certificate of Completion\n\n"
            f"This certifies that **{row['name']}** completed "
            f"**{row['course']}**."
        )
        template = BasicTemplate(
            title="Certificate",
            date="2026-04-11",
            author="Training Team",
            body=body,
        )
        filename = f"out/{row['name'].lower().replace(' ', '-')}.pdf"
        DocumentBuilder().add_template(template).save_pdf(filename)

5. Build and render a custom template from scratch

Goal: use your own Typst template file with JSON data.

cat > custom.typ <<'TYP'
#import "typy.typ": init_typy
#import "typy_data.typ": typy_data

#let t = init_typy(typy_data)

= #t("title", "str")

#t("body", "content")
TYP

cat > custom-data.json <<'JSON'
{
  "title": "Custom template demo",
  "body": "## Hello\n\nRendered with a raw Typst template."
}
JSON

typy render --template custom.typ --data custom-data.json --output custom.pdf

6. Use typy only from the CLI

Goal: full CLI workflow from discovery to render.

typy list
typy info report --json
typy scaffold report --output data.json
typy render --template report --data data.json --output report.pdf

7. Use typy with an AI agent code-execution pattern

Goal: reliable command sequence for tools that can execute shell commands.

# Step 1: discover and inspect schema
typy list
typy info letter --json > schema-letter.json

# Step 2: produce data.json that matches required fields
cat > data-letter.json <<'JSON'
{
  "sender_name": "Northwind Legal",
  "sender_address": "101 River St, Porto",
  "recipient_name": "Maria Silva",
  "recipient_address": "12 Elm Road, Braga",
  "date": "2026-04-11",
  "subject": "Contract renewal",
  "body": "Dear Maria,\n\nPlease find the updated renewal terms attached.",
  "signature_name": "Pedro Azevedo"
}
JSON

# Step 3: render
typy render --template letter --data data-letter.json --output letter.pdf

8. Combine markdown with programmatic figures and tables

Goal: mix human-written markdown and generated visual content in one document.

from typy.builder import DocumentBuilder
from typy.content import Content
from typy.functions import Figure, Table
from typy.markup import Markdown
from typy.templates import ReportTemplate

table_data = {
    "Metric": {0: "Latency", 1: "Throughput"},
    "Before": {0: "120ms", 1: "1000 req/s"},
    "After": {0: "45ms", 1: "3200 req/s"},
}

body = Content(
    [
        Markdown("## Benchmark summary\n\nPerformance improved after optimization."),
        Figure(Table(table_data), caption="Before vs after"),
    ]
)

template = ReportTemplate(
    title="Performance benchmark",
    author="Platform Team",
    date="2026-04-11",
    body=body,
)

DocumentBuilder().add_template(template).save_pdf("benchmark.pdf")

9. Generate a business letter from Python

Goal: create a formal letter programmatically.

from typy.builder import DocumentBuilder
from typy.templates import LetterTemplate

template = LetterTemplate(
    sender_name="Acme Procurement",
    sender_address="44 Harbor Road, Porto",
    recipient_name="Nova Supplies",
    recipient_address="9 Cedar St, Faro",
    date="2026-04-11",
    subject="Request for quotation",
    body="Dear team,\n\nPlease send a quote for 500 units of Model X by next Friday.",
    closing="Best regards",
    signature_name="Joana Pereira",
)

DocumentBuilder().add_template(template).save_pdf("rfq-letter.pdf")

10. Build a presentation with multiple slides

Goal: generate a slide deck PDF from structured slide content.

from typy.builder import DocumentBuilder
from typy.templates import PresentationTemplate, Slide

slides = [
    Slide(title="Context", body="## Current state\n\nUsage has grown 40% year over year."),
    Slide(title="Plan", body="## Next steps\n\n- Stabilize API\n- Improve docs\n- Expand templates"),
]

template = PresentationTemplate(
    title="Product update",
    subtitle="Q2 planning",
    author="Product Team",
    date="2026-04-11",
    slides=slides,
)

DocumentBuilder().add_template(template).save_pdf("product-update.pdf")

11. Render markdown into a report template body

Goal: keep metadata in JSON and body content in a separate Markdown file.

cat > report-data.json <<'JSON'
{
  "title": "Research summary",
  "author": "R&D Team",
  "date": "2026-04-11",
  "toc": true
}
JSON

cat > body.md <<'MD'
## Findings

The experiments show statistically significant improvements.

## Next actions

- Expand sample size
- Validate in production conditions
MD

typy render --template report --data report-data.json --markdown body.md --output research-summary.pdf