Slides from a Markdown file, in the browser

A deck is a document with breaks in it. Write the talk as Markdown, separate the slides with three dashes, and present it full-screen — or hand it over as a PDF, one landscape page per slide.

Writing the deck

# The problem

Nobody reads a 40-page document.

---

# The shape of a fix

- One idea per slide
- Diagrams where words get long

Anything Markdown does works on a slide: lists, tables, code with syntax highlighting, images, maths, and Mermaid diagrams. The slide shows exactly what the preview showed, because it is the rendered preview — the nodes are cloned rather than re-rendered, so nothing can drift between the two.

Presenting

  1. Ctrl+KPresent slides…
  2. , Space or Page Down to advance; or Page Up to go back; Home and End to jump to either end.
  3. Esc leaves, and the cursor goes back where it was.

The overlay asks for full screen and carries on without it if the browser refuses — a deck that fills the window is still a deck. One slide is on screen at a time, at a readable width rather than stretched across a wide monitor.

Exporting the deck

Export in the toolbar → Slides as PDF gives one landscape A4 page per slide. Each slide is fitted to the page by aspect ratio and centred, so a two-line slide is not blown up to fill the sheet and a long one is not cut off at the bottom. Like the document export, it renders locally and forces light colours so the file is printable.

Why the split is on rendered rules, not on the text

Three dashes in Markdown are not always a slide break. They also underline a setext heading, fence YAML front matter, and mean nothing at all inside a code block. Splitting the source text would break all three. Markbeam splits on the horizontal rules the renderer actually produced, so a --- inside a fenced block stays part of your code sample — which is exactly what you would expect, and exactly what the obvious implementation gets wrong.

Write a deck →