markdown in · a real deck out

Write the deck.
Don't design it.

Lutrin compiles Markdown into an editable .pptx or a standalone HTML page. You write the content; the engine picks the layout, places every block and holds the brand. There is no box to nudge, because you never drew one.

npx lutrin build deck.md -o deck.pptx

Node ≥ 22 · nothing else to install · MIT

A real slide from the demo deck, compiled by CI at HEAD. Nobody placed the quadrants.

the compiler · running in this page

Try it right here.

No install, no account, no upload. This is packages/core — the same code npx lutrin runs — loaded into your own browser. Type on the left; the engine lays it out on the right, and your text never leaves your machine.

The two buttons hand you the real files — the standalone .html and a .pptx you can open and retouch, both built in this tab and uploaded nowhere. Three things the page will refuse rather than fake: Mermaid diagrams need a headless browser, and icons and images are read from disk. Ask for any of them and it says so instead of quietly dropping them — those three are the reason to install. LaTeX used to be the fourth and is not any more: equations render here, and arrive in the .pptx as native PowerPoint equations.

the part nobody hired you for

Every deck costs two kinds of time.

One of them is thinking about what you have to say. The other one is this, and it is the one that runs long:

  • nudge the box 2 px left, then 1 px back
  • pick the blue again, off the slide that already had it
  • shrink the text until it fits — differently on every slide
  • re-align the four icons after adding one bullet
  • redo all of it when the numbers change on Thursday

Lutrin does none of this, because you never do it. The layout comes from the structure of what you wrote — headings, lists, directives — and the engine does the geometry. Change the numbers on Thursday and rebuild: the deck relays itself.

source · output

This is the whole file.

Not an excerpt with the styling omitted — the whole thing. No coordinates, no CSS, no theme to wire up. The panel on the right is the real deck, recompiled from examples/demo.deck.md on every push to main.

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. Leave it out and the layout is inferred from the shape of the content.

These three are somebody else's content. Yours goes in the playground above — the same compiler, recompiling as you type — or in its own page, which gives it the room this card cannot.

one file · thirty-seven slides

A layout is an intention, not a template.

A funnel narrows. A timeline moves forward. A comparison weighs one thing against another. So you never pick a shape — you say what the slide is for, and one line says it: <!-- layout: funnel -->. Most of the time you skip even that: three figures already read as a metric row, two balanced sections as a comparison, a table as a table. The intention is in the content, the engine recognises it, and the slide is laid out without you saying a word. Click any slide to open the deck there.

Open the deck Download the .pptx

In the deck, press P to present, arrows to move, N for speaker notes and a timer. The .pptx is the same deck from the same commit: open it in PowerPoint and rework the text, the tables and the shapes.

three doors

It runs where you already write.

Your terminal

build, preview with live reload, validate. One npx lutrin, no project to scaffold.

VS Code

The preview follows your cursor. Problems are underlined where you typed them, with quick fixes and one-key export.

Your agent

A skill an agent can drive: write, validate, fix, build — and look at the result before handing it over.

Your 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 without a single style decision of yours. Eight of them are installable right now, each one showing the same slide compiled inside it — the words held still so that everything that moves is the brand. Building your own is its own workbench: the kit editor puts every colour, font and layout beside a deck the engine just compiled.

your words

Your deck stays on your machine.

The playground on this page is not a service you send a deck to. The compiler itself is delivered to your browser and runs there, so what you type is compiled a few centimetres from where you typed it. No upload, no round-trip, no draft of your slides sitting in somebody else's storage.

On your own machine it holds by rule rather than by luck: nothing on the compilation path touches the network. Your slides are never read, never stored, never used to train anything and never turned into marketing. The reorganisation, the numbers before they are announced, the client's name — they stay where you wrote them.

What this site does count, so that you can weigh it: page views without cookies, and the fact that somebody started typing in the playground — a yes or a no, never a character of what was typed. That is the whole list. All of it is in the open: read the code, or cut the network and watch the compiler carry on.

the price

There isn’t one.

Lutrin is MIT, free, and free in the way that needs no footnote: no watermark on your slides, no slide cap, no export limit, no feature held back for a paid tier and no account to create. Every layout, every chart, every kit and both export formats are what you get on the first run.

What you compile carries your organization’s brand and nothing of ours. Install a kit, build the deck, hand it to the client — there is no line in the corner announcing the tool it came out of.

What can be checked, at the source, right now:

Monthly downloads of the lutrin package on npm GitHub stars on julien-riel/lutrin Latest published version of lutrin on npm The project is MIT licensed

The questions that remain

Does anything about my deck leave my machine?

Nothing. There is no telemetry in Lutrin, no account, and nothing to check with anybody: the compilation path does not touch the network at all. The only requests a build makes are for content your own deck asks for — an image you referenced by URL, an icon not yet in the local cache. Cut the connection and it keeps compiling.

Can I run it in CI?

Yes, and nothing in the tool treats a build server differently from your laptop. npx lutrin build deck.md in a runner is the same command with the same result. Install your kit in the image, or point --kit at a directory in the repository, and the decks come out branded.

Can I use it at work, in client deliverables, commercially?

Yes, all three, with nothing to sign. The MIT licence covers the code and the decks are yours outright. The one limit is the name: “Lutrin” is a trademark, so a fork you redistribute needs a name of its own.

the deal

What it will refuse to do.

Put one element at one exact spot. There is no escape hatch and no CSS override, and that is the whole trade: you give up the pixel, you get back the afternoon.

So if a slide has to be art-directed, use something that art-directs. reveal.js and Slidev go much further on the web, Marp is mature and its CSS themes will feel familiar, Pandoc converts anything into anything. Lutrin is for the deck you have to ship on Thursday, in your organization's colours, without opening a design tool.

Written out properly, one page each, checked against their own current documentation: vs Marp, vs Slidev, vs reveal.js, vs Pandoc.