Update: This feature has been reworked and merged into marp-cli. See the follow-up post.

I switched from beamer/LaTeX to Marp a few years ago for creating slide decks. Marp is an incredible open-source ecosystem, and over the years, I’ve invested significant time customising its various aspects to meet my needs. The return on investment has been clear. Most of my efforts have gone into creating custom themes (which I plan to open-source soon) and developing a custom Marp engine with some tweaks and additional markdown-it plugins.

However, I’ve been missing one essential feature: When audience members have questions about a previous slide, especially at the end of the presentation, the presenter needs to navigate back to that specific slide. This often involves cycling through slides one by one in front of everyone.

I find this distracting and unprofessional. Instead, I want to have thumbnails of all slides in my presenter view (which the audience doesn’t see), allowing me to quickly locate and switch to any slide with a click.

This feature seems basic and essential to me, but surprisingly, it’s missing from most mainstream presentation programs. Back when I used beamer, I used pdfpc for presenting the PDF file, which supports this functionality quite nicely:

While Marp allows exporting to PDF (so I could still use pdfpc), I prefer sticking with the HTML format for its flexibility, ubiquity, and support for various effects and interactivity (good luck including a video or GIF animation in your beamer presentation!).

Marp’s built-in HTML template is relatively basic, and while it does have a presenter view, it lacks this slide navigation feature. I’ve been thinking about adding it myself for a while, but I don’t know enough JavaScript/TypeScript to dive into a large codebase. However, this seemed like a perfect project for an LLM code assistant. I tried vibe-coding this a few months ago without success, but I gave it another go this weekend. After some back-and-forth with Cursor + Claude, I got exactly what I was looking for:

While not perfect, especially the thumbnail loading speed, it gets the job done. When I have some free time and better understand the generated code, I plan to submit a PR to marp-cli. The Marp developer is potentially open to accepting a PR for this feature, but I want to fully understand the code before submitting it.

In the meantime, you can use npm or bun to install my version of marp-cli:

npx github:mil-ad/marp-cli#slide-navigator

or

bunx github:mil-ad/marp-cli#slide-navigator