How to Use Presenterm: The Beginner’s Guide to Terminal Presentations

CodexFuse Team · 2026-11-02T02:54:35.407Z · 11 min read min read

This beginner’s guide shows you how to use Presenterm: install the markdown terminal slideshow tool, split slides with end_slide, apply themes, run live code with +exec, and export to PDF.

How to Use Presenterm: The Beginner's Guide to Terminal Presentations

When developers search for how to use presenterm, they are not looking for Webinato's "Presentation Manager" or Confluence's presenter mode — they mean Presenterm, the open-source markdown terminal slideshow tool by Marco Fontanini that turns one markdown file into a full slide deck you present straight from your terminal, with no browser and no PowerPoint. This presenterm tutorial takes you from a fresh install to your first themed, image-capable, code-executing deck in about thirty minutes. If you already live in the terminal, the honest way to rehearse is inside a persistent tmux beginner guide session, where a dropped SSH connection never kills your deck — tmux multiplexes shells while Presenterm builds slides, two different jobs, drawn once.

What Is Presenterm, Exactly?

Presenterm is an open-source markdown terminal slideshow tool that lets you create presentations in markdown format and run them from your terminal, with support for images and animated GIFs, highly customizable themes, code highlighting, and export into PDF format. That one sentence is the whole pitch — this markdown slides terminal workflow turns one text file into a full deck without a browser or a GUI. The project was started by Marco Fontanini (mfontanini on GitHub) in August 2023, it has gathered roughly 8,944 stars across 23 releases, the current release is v0.16.1 from February 2026, and it ships under the BSD-2-Clause license. For developers who give presentations in terminal environments, it is the most complete markdown-to-terminal presenter available.

How Do You Install Presenterm?

Download the pre-built binary from the project's releases page, or install through your platform's package manager. The install page lists every route, and the two most common are brew install presenterm on macOS and cargo install --locked presenterm anywhere Rust's toolchain works. If Homebrew is new to you, the Homebrew beginner guide walks through the setup first.

PlatformInstall command
macOS (Homebrew)brew install presenterm
macOS (unreleased build)brew install --head presenterm
Anywhere (Rust, fastest)cargo binstall presenterm
Anywhere (Rust, from source)cargo install --locked presenterm
Nightly buildcargo install --locked --git https://github.com/mfontanini/presenterm
Nix / NixOSnix-env -iA nixos.presenterm or nix run nixpkgs#presenterm
Arch Linuxpacman -S presenterm (AUR: paru -S presenterm-bin)
Windows (Scoop)scoop install main/presenterm
Windows (winget)winget install --id=mfontanini.presenterm -e

Verify it with presenterm --version — you should see v0.16.1 or newer. One quirk worth knowing early: the docs sometimes mention "version 0.40.0" next to the font_size command, but that is the kitty terminal's version, not Presenterm's. Do not let that confuse you.

What Does Your First Deck Look Like?

Create a file called slides.md and run presenterm slides.md — that is the entire workflow. Here is a complete three-slide deck you can paste and run right now:

---
title: My First Deck
sub_title: What my terminal can do
author: Your Name
---

# Welcome to Presenterm

- One markdown file
- Zero GUI tools
- Slides in your terminal

<!-- end_slide -->

# Slide Two

This is a second slide.

<!-- end_slide -->

# Thanks!

Questions?

Notice the title block at the top: that is YAML front matter with title, sub_title, and author, and it creates an automatic intro slide. All three fields are optional — skip them and the deck just starts on slide one. Want the official tour first? Clone the repo and run the demo the maker ships: git clone https://github.com/mfontanini/presenterm.git && cd presenterm && presenterm examples/demo.md (new to Git? the Git beginner guide covers cloning). By default Presenterm runs in dev mode: the file auto-reloads on every save and jumps you to the slide you just edited. When it is showtime, pass --present (or -p) to disable auto-reload so a stray save never surprises your audience.

How Does Presenterm Know Where One Slide Ends?

Slides split on a line containing <!-- end_slide --> — and this is the single most important lesson in this guide: a thematic break (---) does NOT end a slide in Presenterm, unlike almost every other markdown presentation tool. The maker's docs say it plainly: "While other applications use a thematic break (---) to mark the end of a slide, presenterm uses a special end_slide HTML comment." If your deck renders as one long slide, you forgot the comment — that is the fix, every time. Two opt-ins soften the rule: options: { end_slide_shorthand: true } makes --- end slides too, and implicit_slide_ends: true ends slides automatically on slide titles. Learn the default first; reach for the shorthand only when you want it.

What Can You Put on a Slide?

Everything markdown already gives you: headings, bullet and numbered lists, bold and italic text, code blocks with syntax highlighting, and tables. Two markdown extras exist for presenters. First, setext-style headers (underlining a title with ===) become specially styled slide titles. Second, the comment-command system: single-line HTML comments are treated as commands, while multi-line ones are treated as ordinary comments — that is how <!-- pause --> and <!-- end_slide --> both work while longer comment blocks stay invisible.

How Do You Theme Your Deck?

Run presenterm --list-themes and Presenterm renders a sampler deck of every built-in theme so you can see them all at once. The built-ins are catppuccin-latte, catppuccin-frappe, catppuccin-macchiato, catppuccin-mocha, dark, light, gruvbox-dark, terminal-dark, terminal-light, and the tokyonight family (moon, day, night, storm). Apply one three ways: pass --theme dark on the command line, set it in front matter with theme: { name: dark }, or point at your own file with theme: { path: /path/to/theme.yaml }. Front-matter theme overrides hot-reload on save, so you can iterate a custom theme live. To make one permanent, drop .yaml theme files in ~/.config/presenterm/themes. The config also supports automatic light/dark selection based on your terminal.

What Are Pauses and Incremental Lists For?

Pauses let you reveal a slide piece by piece instead of all at once, and they are the difference between reading your deck and performing it. Drop <!-- pause --> anywhere and everything below it stays hidden until you advance — or use <!-- incremental_lists: true --> to reveal bullet points one at a time automatically. During the talk, n and p fast-jump between slides while skipping every pause, and pressing s reveals all pauses on the current slide at once. Other comment commands in the same family: <!-- jump_to_middle --> for vertical centering, <!-- alignment: left|center|right -->, <!-- new_line --> and <!-- new_lines: 10 --> for spacing, <!-- no_footer --> to drop the slide footer, <!-- speaker_note: ... --> for notes only you see, and <!-- include: foo.md --> to split a deck across files. Run presenterm --list-comment-commands for the full machine-readable list.

How Does Code Execution Work in Presenterm?

Presenterm code execution is the feature that makes developer audiences gasp: you can run the code on your slides, live, during the talk.

```bash +exec
curl -s https://api.github.com/repos/mfontanini/presenterm | grep tag_name
```

Annotate a code block with +exec, press control+e, and the output appears in a box below the block — execution is stateful, so later blocks see what earlier ones set up. But execution is OFF by default, and that is deliberate: you must pass the -x flag or set snippet.exec.enable: true in your config. The maker's warning is worth quoting in full, once: "Run code in presentations at your own risk! Especially if you're running someone else's presentation. Don't blindly enable snippet execution!" — never -x a deck you did not write yourself.

The execution surface runs deeper than one command:

  • +exec_replace runs the block automatically and replaces it with its output (needs -X or snippet.exec_replace.enable).
  • +id:foo plus <!-- snippet_output: foo --> places a block's output anywhere — even on a later slide, executed only once.
  • +auto_exec runs the block without pressing control+e.
  • +pty runs the snippet in a pseudo-terminal, so interactive programs like top and htop work (custom size: +pty:80:30).
  • +image renders the snippet's output as an image, as long as it emits only JPEG or PNG.
  • +validate plus the --validate-snippets flag checks every snippet in the deck before the talk — run this the night before.
  • +expect:failure marks blocks whose exit code is supposed to be non-zero.
  • Alternative executors per language: +exec:rust-script and +exec:rust-script-pedantic for Rust, +exec:pytest and +exec:uv for Python.
  • Lines starting with # (Rust) or /// (Python, Bash, and others) execute but stay hidden from the display.
  • +render pre-renders Mermaid, LaTeX, and Typst into images (LaTeX needs Typst and Pandoc installed).

Can Your Slides Show Images?

Yes — standard markdown image syntax, with paths relative to the presentation file. Images render at their original size (shrunk only if too large for the screen, aspect ratio preserved), and you can size them inline with ![image:width:50%](image.png). Whether you see the real image depends on your terminal: kitty, iTerm2, WezTerm, Ghostty, and foot all work, sixel is enabled by default everywhere as of v0.16.0, and terminals without an image protocol get an ASCII-art fallback instead of nothing. One honest limitation to learn once: remote http:// or https:// image URLs are rejected by design — download the image and reference it locally. If you are shopping for a terminal that shows images well, the Ghostty beginner guide covers one of the supported options. Note for tmux users: image passthrough needs tmux's allow-passthrough option enabled.

How Do You Export Your Deck to PDF or HTML?

Presenterm export PDF needs no plugins. For PDF, run presenterm --export-pdf examples/demo.md and you get examples/demo.pdf — the one requirement is that weasyprint is installed on your system first. For HTML, run presenterm --export-html examples/demo.md and you get a single self-contained file with images and styles embedded, no dependencies at all. Pass --output to choose where the file lands. Pauses can be exported as separate slides. The old standalone presenterm-export tool is deprecated, so use the built-in flags.

Presenterm vs Slides: What's the Difference?

The closest alternative is the aptly named slides CLI — same terminal-presentation lane, different codebase; this guide stays on Presenterm and never needs the comparison again.

7 Beginner Mistakes (and What to Do Instead)

MistakeWhat happensDo this instead
Breaking slides with ---Your whole deck renders as one long slideSplit slides with <!-- end_slide --> — --- is just a horizontal rule
Passing -x on someone else's deckForeign code executes on your machine when you press control+eOnly enable snippet execution for decks you wrote or fully audited
Wondering why +exec does nothingPressing control+e silently does nothingExecution is off by default — pass -x or set snippet.exec.enable: true
Embedding remote image URLsPresenterm errors — remote images are rejected by designDownload the image and reference it with a relative local path
Rehearsing in dev mode and presenting the same wayA stray save during the talk auto-reloads your deck mid-slideRehearse with presenterm slides.md, present with presenterm --present slides.md
Setting font_size above 7Nothing happens — or a kitty user wonders what went wrongThe range is 1–7 and it only works in kitty
Trusting live code the morning of the talkDemo gods strike: a snippet fails on stageRun presenterm --validate-snippets the night before to check every block

Navigation Cheat Sheet

KeysAction
Arrow keys, hjkl, Page Up / Page DownNext / previous slide
gg / GFirst slide / last slide
3G (any number + G)Jump to slide 3
n / pFast-jump next / previous, skipping pauses
sReveal all pauses on the current slide
?Keybindings modal (the full configured list)
control+pSlide-index modal
TLayout grid toggle
control+cExit

Bindings are re-mappable in the config file, and the PRESENTERM_CONFIG_FILE environment variable points Presenterm at an alternate config. When in doubt, press ? — it shows your exact bindings, not a generic list.

Sources

  1. Presenterm README — mfontanini/presenterm on GitHub (tool definition quote, BSD-2-Clause license, ~8,944 stars, 23 releases, repo created 2023-08-27): https://github.com/mfontanini/presenterm
  2. Presenterm releases page (v0.16.1, released 2026-02-19): https://github.com/mfontanini/presenterm/releases
  3. Presenterm CHANGELOG (v0.16.0 highlights: PTY snippet execution, sixel everywhere, +auto_exec, tokyonight themes): https://raw.githubusercontent.com/mfontanini/presenterm/master/CHANGELOG.md
  4. Presenterm install docs (install routes verbatim): https://mfontanini.github.io/presenterm/install.html
  5. Presenterm introduction guide (dev mode, --present, front matter, navigation, demo command): https://mfontanini.github.io/presenterm/features/introduction.html
  6. Presenterm configuration options (end_slide delimiter, end_slide_shorthand, implicit_slide_ends): https://mfontanini.github.io/presenterm/configuration/options.html
  7. Presenterm comment-commands reference (pause, incremental_lists, font_size, include, alignment, speaker_note): https://mfontanini.github.io/presenterm/features/commands.html
  8. Presenterm code-execution docs (+exec, -x, +exec_replace, snippet_output, +auto_exec, +pty, +image, +validate, executors): https://mfontanini.github.io/presenterm/features/code/execution.html
  9. Presenterm themes docs (built-in theme list, --list-themes, custom theme directory): https://mfontanini.github.io/presenterm/features/themes/introduction.html
  10. Presenterm images docs (image protocols, sizing syntax, remote-URL rejection): https://mfontanini.github.io/presenterm/features/images.html
  11. Presenterm exports docs (--export-pdf, --export-html, weasyprint requirement): https://mfontanini.github.io/presenterm/features/exports.html

Frequently Asked Questions

Is Presenterm free to use?

Yes — Presenterm is open source under the BSD-2-Clause license, and every feature (themes, code execution, PDF and HTML export) ships in the same free binary.

Does Presenterm work on Windows?

Yes — install it with scoop install main/presenterm or winget install --id=mfontanini.presenterm -e. Slides render fine on Windows; image support depends on your terminal's image protocol, as on every platform.

Why does my deck show as one long slide?

You split slides with ---. Presenterm only splits on <!-- end_slide --> — replace your thematic breaks with that comment, or set options: { end_slide_shorthand: true } to let --- work too.

Can I really run code inside my slides during a talk?

Yes. Annotate a code block with +exec, enable execution with the -x flag, and press control+e while presenting. Use +exec_replace to swap the block for its output, and run --validate-snippets the night before so nothing surprises you on stage. Never enable execution on a deck you did not write yourself.

Can I export my deck to PDF?

Yes — run presenterm --export-pdf slides.md. You need weasyprint installed first. For a web-friendly version, presenterm --export-html slides.md produces one self-contained HTML file with no extra dependencies.

Featured on Twelve Tools Launch Llama Tools Launch your MCP