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 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. Put in your own: the playground loads this same compiler into your browser and recompiles as you type — nothing installed, and nothing sent anywhere.

one file · thirty-seven slides

You chose none of these layouts.

Delivery boards, scored options, charts, diagrams, full-bleed photographs. Each one inferred from the structure of the content, or named in one 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.

the price

Free to use. Paid to go unsigned.

Everything works without a licence — every layout, every kit, every export. A deck compiled without one carries a discreet Made with Lutrin at the bottom right of each slide. A licence removes it. That is the entire difference: no watermark, no slide cap, no feature held back.

Team

$449 USD / year

Up to ten people, one organisation.

Buy Team →

Thirty people rather than ten, or a licence bought once rather than every year? The full price list has all five options side by side, in USD and in CAD.

A seat is a person, not a machine: install Lutrin on your laptop, your desktop and the build server, they all run on the same key. Buy, invite people by email, and Polar does the rest — it issues the keys, hosts the customer portal and emails everyone their link. Activate once, then compile offline: a licence keeps working for 30 days without reaching the network, and forever without leaving your machine.

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

Before you buy

If my licence lapses, do the decks I already shipped change?

No. The attribution is decided once, while the deck is being compiled, and written into the file itself; nothing ever reopens a .pptx you have already exported. A deck built while licensed stays clean forever, whatever happens afterwards. The reverse holds too: buying a licence does not clean up old files — you rebuild them.

What does a licence actually remove?

One line of text, and nothing else. Every layout, every chart, every kit and both export formats are there either way; there is no slide cap, no export limit and no feature behind the licence. The compiler asks the licence exactly one question — whether to paint the attribution — and it asks it in the editor previews too, so what you look at while writing is what you will hand over.

How many machines can I install on?

A seat is a person; the machine count is a property of the key, and the keys sold today set no limit. Your laptop, your desktop and a build server all run on the same one. If a key ever does carry a limit, lutrin license status prints it, and re-activating on a machine that already holds an activation releases the old one first — a reinstall never costs you a second.

What if I am offline, or on a plane?

You compile. Reading the licence is a read of one small local file — there is deliberately no network on the compilation path, so a build never waits on anything and never fails because the connection is down. A licence keeps applying for 30 days without a successful check; past that, run lutrin license status once while online and the clock resets. Only the very first activation truly needs the network.

Can I move my licence to a new machine?

Yes. lutrin license deactivate on the old one frees it, lutrin license activate <key> on the new one takes it. If the old machine is gone or offline, activate on the new one anyway and free the stale activation from the Polar customer portal. Copying the licence file across by hand is the one thing that does not work: it is sealed to the account and machine it was activated on, and a copied file is ignored rather than honoured.

Does anything about my deck leave my machine?

Nothing. There is no telemetry in Lutrin. The only network a build makes is for content your own deck asks for — an image you referenced by URL, an icon not yet in the local cache. Separately, and at most once a week, the CLI checks your licence with Polar after the deck has been written; that request carries your key, an activation id and the organisation id. No file names, no deck content, no counts.

Can I run it in CI?

Yes, and nothing in the tool treats a build server differently from your laptop: lutrin license activate <key>, and it compiles. One practical note for ephemeral runners — a fresh container has no local record to release, so each run takes a new activation. That is harmless on today's keys, which set no activation cap; if you would rather not, cache the config directory between runs and point LUTRIN_CONFIG at it — which works as long as the runner image stays the same one, since the record is sealed to the account and platform that activated it.

Invoices, taxes, refunds, cancelling — how is that handled?

Through Polar, which sells the licences and is the merchant of record: the receipt, the invoice and the cancellation all live in the customer portal it emails you a link to, and the tax treatment shown at checkout is the one that applies to your country. For anything your finance team needs in a particular form — a purchase order, a framework agreement, an invoice raised before payment — write to contact@lutrin.app and it gets handled by a person.

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.