patat: Pandoc slides in the terminal, with code evaluation and theming
Terminal-based presentations using Pandoc
At a glance
- What is it?
- A Haskell presentation tool that reads any Pandoc format, evaluates code snippets, highlights a hundred languages and reloads as you type.
- Who is it for?
- patat succeeds because it declined to reinvent document parsing. Everything it does with a slide deck, from smart splitting to nested headers becoming title slides, falls out of Pandoc's AST, which is why reStructuredText and Org mode work without any extra effort in this project.
- Can I use it commercially?
- Yes, with conditions. GPL-2.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 103 days ago.
- What is it written in?
- Mainly Haskell, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 24, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Writing slides in markdown with a horizontal rule between them
The input is whatever Pandoc reads, which in practice means markdown and also reStructuredText and Org mode, and slides are separated by a horizontal rule:
# This is a slide
Slide contents. Yay.
---
# Important title
Things I like:
- Markdown
- Haskell
- PandocThe rule is intrusive if you dislike it visually, so there is an alternative. Start every slide with a header instead and the file should contain no horizontal rule at all. `patat` picks the most deeply nested header as the slide marker, and headers above that level become title slides, rendered as a centered title on its own.
That second mode is the reason `patat` composes well with real documents. A chapter structure written as `h1` for chapters and `h2` for slides produces title slides for free, which is how the third example in the README turns a document into a deck without adding separators at all. Advanced splitting goes further still, letting you choose the level per section rather than globally.
Installing from a package manager, cabal or a release binary
Packaging is thorough enough that most people never build it. Linux is covered by Arch, Debian, Fedora, NixOS, openSUSE and Ubuntu packages, and macOS has Homebrew. Generic Linux and macOS binaries are attached to GitHub releases for anyone outside those ecosystems.
From source it is on Hackage, which means a single cabal command:
cabal install patatThe repository tree backs up the claim that this is a normal Haskell project. There is a `patat.cabal`, a `cabal.project`, `Setup.hs`, `lib/`, `src/`, `tests/` and `extra/`, plus a `flake.nix` with a `flake.lock` and an `.envrc` for anyone using direnv. The Makefile also compresses release binaries with UPX 3.94 and pins `SOURCE_DATE_EPOCH` for reproducible output, which is a level of release hygiene that is not common in small Haskell tools.
Key bindings cover jumping, paging and reloading
The control set is the part you internalize once and then stop noticing. Forward is `space`, `enter`, `l`, the right arrow or PageDown. Back is `backspace`, `h`, the left arrow or PageUp. `j` and the down arrow jump ten slides forward, `k` and the up arrow jump ten back, `0` goes to the first slide and `G` goes to the last.
Jumping to an arbitrary slide is a number followed by enter, which is the feature that makes a long deck manageable in a talk where you know you need to be on slide 34. `r` reloads the file, and the README singles it out as the most useful key because it lets you preview while writing and because it also clears rendering artifacts after the terminal is resized. `q` quits.
Three flags shape the run. `--watch` reloads automatically as the file changes, `--force` runs the presentation even when the terminal claims it lacks ANSI support, which is the escape hatch for terminals that lie, and `--dump` writes all slides to stdout for debugging. Dumping slides to stdout is quietly the most useful flag for CI, since you can check that a deck parses without launching a terminal UI.
Code evaluation and syntax highlighting for a hundred languages
The feature that separates `patat` from a markdown pager is code evaluation: a snippet can be run and its output shown on the slide. For a technical talk that means the code on screen is the code that just ran, rather than a pasted block that drifted from reality months ago.
Syntax highlighting comes from Kate syntax files, which is how one implementation covers nearly a hundred languages without maintaining a hundred grammars. Both features are configured through YAML in the presentation's metadata block, and so are most other options, including turning the slide number off:
slideNumber: falseThe same block nests options under a `patat:` key when you want them scoped to the tool, keeping them separate from Pandoc's own metadata. Margins, tab stop, line wrapping, auto advancing, theming, slide numbers, breadcrumbs and transitions are all set this way, so a deck is self-describing and lives in version control with everything else.
Speaker notes, themes, images and why ANSI not ncurses
Speaker notes can be shown in a second window or monitor, which is the difference between a terminal tool you can actually present from and one you can only read from. Images are supported but the README labels the support experimental, so it is worth testing against your terminal and image format before planning a deck around it. Transitions and incremental fragment display, where content appears step by step within one slide, are both there.
Theming supports 24-bit RGB, with both header theming and class-based theming so a class attribute in your markdown can select a style. Centering and re-wrapping adapt text to terminal width with proper indentation, which is the unglamorous feature that decides whether slides look authored or generated.
The portability choice is worth noting explicitly: `patat` requires only an ANSI terminal rather than something like ncurses. That means fewer dependencies, better behaviour over ssh, and a much smaller chance of breaking on a machine that has ncurses but not your terminal's idea of it. Release history shows v0.15.0.0 in April 2025, v0.15.1.0 the same month, and v0.15.2.0 in August 2025, with pushes continuing to 2026-06-25.
Editorial conclusion
patat succeeds because it declined to reinvent document parsing. Everything it does with a slide deck, from smart splitting to nested headers becoming title slides, falls out of Pandoc's AST, which is why reStructuredText and Org mode work without any extra effort in this project. The feature list is longer than most people expect from a terminal tool, with code evaluation, speaker notes, transitions and 24-bit RGB theming all present, and portability comes from depending on ANSI rather than ncurses. The trade is that you inherit Pandoc's markdown semantics, so a construct that renders oddly is usually a Pandoc question rather than a patat one. The repository is GPL-2.0, sits at 2742 stars, and was pushed on 2026-06-25, with v0.15.2.0 the most recent tagged release.
Frequently asked questions
How do I split slides in patat?
Either separate them with a horizontal rule of three dashes, or omit rules entirely and start every slide with a header. In the header form, patat uses the most deeply nested header as the slide marker and turns shallower headers into title slides.
What key do I press to reload a presentation while editing?
`r` reloads the file, which lets you preview slides as you write them and also clears artifacts after the terminal is resized. Passing the `--watch` flag reloads automatically whenever the file changes.
Can patat run code snippets on a slide?
Yes. Snippets can be evaluated and the result shown, so the code on screen is the code that actually ran. It also highlights nearly a hundred languages using syntax definitions generated from Kate.
How do I install patat?
Use a system package such as Homebrew on macOS or Debian, Fedora, NixOS, Arch, openSUSE or Ubuntu on Linux, or download a generic binary from the GitHub releases. From source it is on Hackage, so cabal install patat works.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/jaspervdj-patat)