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.
a presentation compiler
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
backdrop: blocks finding their slots — the layout engine, dramatized
live output
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.
# Request triage
<!-- layout: funnel -->
## 2,400 received
All channels combined.
## 1,100 eligible
After checking the criteria.
## 320 selected
Funded this year.
# Indicators
:::metric
19
Layouts planned
↑ +5 this release
:::
:::metric
100%
Output parity
→ stable
:::
:::metric
0
Broken slides
↓ -100% (+)
:::
# Budget by quarter
The chart is rendered by the engine, in the
brand's colors, with a palette validated for
color blindness and contrast.
```chart
type: bar
categories: Q1, Q2, Q3, Q4
Planned: 120, 150, 180, 210
Actual: 110, 155, 175, 190
```
One layout hint, and the engine does the geometry. Omit it and a layout is inferred from the structure of the content.
Three :::metric directives become three cards. The trend arrow picks its own color — and (+) flips it when a fall is good news.
A fenced chart block becomes a chart rendered by the engine — same geometry in the HTML and in the .pptx, in the theme's palette.
A sample straight from the compiled deck — metrics, charts, SWOT, funnels, diagrams, full-bleed photos. Click any slide to open it in the deck.
In the deck, press P to present —
arrows to navigate, N for the notes window with timer. The
.pptx is the same deck, built by the same commit: open it
in PowerPoint and rework the text, tables and shapes.
positioning
They are good tools, and often the right choice. Lutrin answers a different need, which comes down to three points.
.pptxNative shapes, text boxes and tables, fonts embedded. The recipient opens the file, corrects a figure, and moves on — no repository to clone.
No coordinates, no columns, no CSS escape hatch. Layouts are inferred, overflow is paginated. A deliberate constraint: decks stay homogeneous and automatable.
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.
lutrin CLIbuild, preview with reload,
validate, inspect, vendor.
npx lutrin and nothing else.
Live preview that follows the cursor, diagnostics underlined in
the editor, quick fixes, .pptx export.
The preview follows the active note; wiki embeds
![[image.png]] just work. Desktop only.
.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
Not a converter with a stylesheet: a front end, an intermediate representation, analysis passes, and two renderers that share one geometry.
Enriched Markdown → AST. markdown-it, plus directives:
:::metric, ```chart, Mermaid, LaTeX,
Lucide icons.
AST → IR. deck → slides → sections → blocks, source
positions kept for diagnostics.
The engine infers a layout from the structure of the content and places blocks in slots; overflowing content is paginated, or measured and flagged.
One positioned scene. Both renderers consume the same geometry — parity is tested.
.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.