a presentation compiler

Write Markdown.
Ship a real PowerPoint.

Lutrin compiles enriched Markdown into an editable .pptx or a standalone HTML page — and it is the engine, not the author, that decides the layout. You write the intent; the compiler picks the layout, places every block, and keeps the deck on brand.

npx lutrin build deck.md -o deck.pptx

Node ≥ 22 · nothing else to install · MIT

backdrop: blocks finding their slots — the layout engine, dramatized

live output

Real slides. Zero coordinates.

Everything below is live output, not screenshots: the deck is recompiled from examples/demo.deck.md by CI on every push to main. There is not a single coordinate in the file.

examples/demo.deck.md
# Request triage

<!-- layout: funnel -->

## 2,400 received
All channels combined.

## 1,100 eligible
After checking the criteria.

## 320 selected
Funded this year.

One layout hint, and the engine does the geometry. Omit it and a layout is inferred from the structure of the content.

positioning

Why not Marp, Slidev, reveal.js, Pandoc?

They are good tools, and often the right choice. Lutrin answers a different need, which comes down to three points.

A genuinely editable .pptx

Native shapes, text boxes and tables, fonts embedded. The recipient opens the file, corrects a figure, and moves on — no repository to clone.

The engine owns the layout

No coordinates, no columns, no CSS escape hatch. Layouts are inferred, overflow is paginated. A deliberate constraint: decks stay homogeneous and automatable.

Validation that measures

The deck doctor measures overflows, flags images too low-res for the area they occupy, and suggests better-suited layouts — in the CLI, underlined in VS Code, clickable in Obsidian.

What the others do better: reveal.js and Slidev are far richer on the web; Marp is mature, with familiar CSS themes; Pandoc converts everything. And if you want to place one element at one precise spot — Lutrin will tell you no.

Four doors, one compiler.

lutrin CLI

build, preview with reload, validate, inspect, vendor. npx lutrin and nothing else.

VS Code

Live preview that follows the cursor, diagnostics underlined in the editor, quick fixes, .pptx export.

Obsidian

The preview follows the active note; wiki embeds ![[image.png]] just work. Desktop only.

Agent skill

.claude/skills/deck: an agent writes, validates, fixes and builds — with a visual check at the end.

An organization's brand travels as a kit — theme, layouts, fonts and logos in one archive; data, never code. lutrin kit install <url> and every deck is on brand, in every entry point.

pipeline

A compiler, in the literal sense.

Not a converter with a stylesheet: a front end, an intermediate representation, analysis passes, and two renderers that share one geometry.

  1. 01

    parse

    Enriched Markdown → AST. markdown-it, plus directives: :::metric, ```chart, Mermaid, LaTeX, Lucide icons.

  2. 02

    lower

    AST → IR. deck → slides → sections → blocks, source positions kept for diagnostics.

  3. 03

    layout

    The engine infers a layout from the structure of the content and places blocks in slots; overflowing content is paginated, or measured and flagged.

  4. 04

    scene

    One positioned scene. Both renderers consume the same geometry — parity is tested.

  5. 05

    render

    .pptx with native shapes, text boxes and tables, fonts embedded — or one standalone HTML file with presenter mode.

lutrin validate measures — overflows, under-resolved images, better-suited layouts — and returns positioned JSON (--json) for a write → validate → fix agent loop.