# PlutoSlides.jl — Beamer-style presentations for Pluto notebooks

**URL:** <https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655>\
**Category:** Package Announcements\
**Tags:** package, announcement\
**Created:** [November 4, 2025, 3:09pm UTC](https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655 "2025-11-04T15:09:27Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![dmetivie](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dmetivie/32/6926_2.png) [@dmetivie](https://discourse.julialang.org/u/dmetivie)\
**Post date:** [November 4, 2025, 3:09pm UTC](https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655/1 "2025-11-04T15:09:27Z")

</div>

# PlutoSlides.jl — Beamer-style presentations for Pluto notebooks

**Repository:** [https://github.com/dmetivie/PlutoSlides.jl](https://github.com/dmetivie/PlutoSlides.jl)

I’m happy to share **PlutoSlides.jl** , a package that brings Beamer-like slide formatting to [Pluto.jl](https://plutojl.org/) notebooks.

I love the interactivity and reactivity of Pluto, but I wanted a more natural slideshow experience for talks and lectures than the Pluto presentation mode.

Another way to put it: this package provides interactive beamer-like slides powered by Pluto! That’s the dream, at least.

I feel like this is new: Quarto can do slideshows but cannot have interactive codes (beside some sliders) e.g. adding/removing cells and so on. Pluto has interactivity but no real slideshow format.

Is it **really** useful? I don’t know yet. It is very experimental. See below for development details, it is far from perfect, but at this point I needed feedback and probably people with better knowledge of JavaScript/Pluto to help for a cleaner implementation.

I did try it live at JuliaCon Paris 2025 with an earlier version, see the [YouTube video](https://www.youtube.com/watch?v=JtAr2P_xJi4) (it did bug out a bit toward the end).

![Demo](https://global.discourse-cdn.com/julialang/original/3X/d/1/d104f979c64e1e507d6b2c1b3c15ad30e918b770.gif)

## What it does

`PlutoSlides.jl` defines a slide mode that can be turned on/off (as the presentation mode) to transform your Pluto notebook into a slide deck with:

- **Automatic slide detection** : `# Section`, `## Subsection`, and `### Subsubsection` headings define slide boundaries. The difference with Pluto’s built-in presentation mode is that the slides are truly separated, as opposed to having spacing as separators.  
This allows having slide counters.

- **Beamer-like `pause(n)`**: Moreover, one can reveal content step-by-step with `pause()` (sequential) or `pause(n)` (numbered fragments like `\pause[n]` in LaTeX Beamer)

- **Title bands** : Section and subsection titles appear in persistent header bands at the top of each slide → I feel like it helps the audience.

And other features that already existed before:

- **Customizable appearance** : Adjust fonts, colors, max-width, and footer text to match your style or institution’s branding

- **Title slide support** : Display a formatted title slide with logos and author information using the `myTitle()` helper

- **Slide navigation** : Arrow keys, PageUp/PageDown, or click left/right to navigate; Escape to exit slide mode

## Current development state (⚠ experimental)

This package is **experimental** and built with heavy use of LLM-powered coding assistance (I have minimal JavaScript/CSS experience — **pure vibe coding**!). It works well for some of my notebooks. Terrible for others in terms of performances.

The biggest development issue I encountered is how to keep Pluto’s reactivity while having separated slides that must update without breaking the slideshow.

- **Performance** : On some larger notebooks, slide mode can slow down noticeably. I’m still investigating whether this is related to the number of slides, DOM size, or the MutationObserver setup. See [issue #3](https://github.com/dmetivie/PlutoSlides.jl/issues/3).

- **Display variability** : Layout depends on screen size and font settings. The `max_width` option helps, but keep in mind that the size of slides depends on width and height of your screen.

## Installation

`PlutoSlides.jl` is not yet in the General registry. Hence to deal with the Pluto package manager smoothly the simplest way is to add my Local Registry :

```julia
import Pkg

Pkg.pkg"registry add https://github.com/dmetivie/LocalRegistry"

```

then the Pluto `using PlutoSlides` should work on the notebook.

You can also use a [global environment of Pluto](https://plutojl.org/en/docs/packages-advanced/) and add it from the GitHub repo directly:

```julia
Pkg.add("https://github.com/dmetivie/PlutoSlides.jl")

```

I’m hesitating to register `PlutoSlides.jl` in the General registry until stability and performance improve. I want to collect more real-world feedback first and address the major known issues.

## Example workflow

My typical workflow for preparing a talk:

1. Open Pluto with auto-reload: `import Pluto; Pluto.run(auto_reload_from_file=true)`

2. Edit the `.jl` notebook file in my IDE where I can use LLM assistance for quick HTML/CSS/LaTeX/Markdown/Code tweaks (especially useful for converting existing Beamer slides or more complex HTML layout).

3. Preview on a second screen (the laptop I’ll use for the actual presentation) in full-screen browser mode

4. Iterate: changes to the `.jl` file reload instantly in Pluto

On the road without a second screen, I just open the notebook directly on my presentation laptop and toggle slide mode with the button or hotkey.

## Feedback wanted

If you try `PlutoSlides.jl` for a talk, demo, or lecture, I’d love to hear:

- What worked well?

- What broke? Performance or reactivity?

- Feature requests or design suggestions?

Please open issues or discussions on GitHub. Small PRs are also very welcome — this is a community experiment!

If you have experience with JavaScript and want to help, don’t hesitate!

---

<div class="post-metadata">

**Author:** ![sylvaticus](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sylvaticus/32/203883_2.png) [@sylvaticus](https://discourse.julialang.org/u/sylvaticus)\
**Post date:** [November 5, 2025, 6:52am UTC](https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655/2 "2025-11-05T06:52:23Z")

</div>

Do you have examples?

---

<div class="post-metadata">

**Author:** ![jondea](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jondea/32/39086_2.png) [@jondea](https://discourse.julialang.org/u/jondea)\
**Post date:** [November 5, 2025, 7:57am UTC](https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655/3 "2025-11-05T07:57:35Z")

</div>

Very cool! Thank you. I’ve been looking for a better way to present pluto notebooks for a while and my hacks never got me very far.

---

<div class="post-metadata">

**Author:** ![dmetivie](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dmetivie/32/6926_2.png) [@dmetivie](https://discourse.julialang.org/u/dmetivie)\
**Post date:** [November 5, 2025, 9:02am UTC](https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655/4 "2025-11-05T09:02:33Z")

</div>

The Gif is an example from my [test example here](https://github.com/dmetivie/PlutoSlides.jl/blob/master/example/notebook_test.jl).

The other example is my JuliaCon presentation [here](https://dmetivie.github.io/Pluto_export/html/pluto_SWG_juliacon2025_Paris_talk.html).

Both works well on my computer.

Remember it is not register so either add my local registry to use it or global pluto environment (see [installation](https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655))

---

<div class="post-metadata">

**Author:** ![vchuravy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vchuravy/32/8_2.png) [@vchuravy](https://discourse.julialang.org/u/vchuravy)\
**Post date:** [November 27, 2025, 1:33pm UTC](https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655/5 "2025-11-27T13:33:46Z")

</div>

Is there a reason for not registering?

---

<div class="post-metadata">

**Author:** ![dmetivie](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dmetivie/32/6926_2.png) [@dmetivie](https://discourse.julialang.org/u/dmetivie)\
**Post date:** [November 27, 2025, 4:24pm UTC](https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655/6 "2025-11-27T16:24:58Z")

</div>

Yes:

1. I would have preferred to fix the performance issue first (with some help, I cannot figure it out). I guess registering can encourage people to help.
2. I was suggested to change the name to avoid the confusion with the original Pluto presentation mode. Any suggestions?
3. Need to find time!

---

<div class="post-metadata">

**Author:** ![vchuravy](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vchuravy/32/8_2.png) [@vchuravy](https://discourse.julialang.org/u/vchuravy)\
**Post date:** [November 27, 2025, 5:12pm UTC](https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655/7 "2025-11-27T17:12:20Z")

</div>

> [@dmetivie](#):
>
> I was suggested to change the name to avoid the confusion with the original Pluto presentation mode. Any suggestions?

Maybe: PlutoBeamerSlides.jl?

---

<div class="post-metadata">

**Author:** ![kellertuer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kellertuer/32/220707_2.png) [@kellertuer](https://discourse.julialang.org/u/kellertuer)\
**Post date:** [November 27, 2025, 5:53pm UTC](https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655/8 "2025-11-27T17:53:50Z")

</div>

> [@vchuravy](#):
>
> Maybe: [PlutoBeamerSlides.jl](https://juliaregistries.github.io/General/packages/redirect_to_repo/PlutoBeamerSlides)?

Or Shorter: PlutoBeamer.jl?

---

<div class="post-metadata">

**Author:** ![dmetivie](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dmetivie/32/6926_2.png) [@dmetivie](https://discourse.julialang.org/u/dmetivie)\
**Post date:** [October 1, 2026, 1:53pm UTC](https://discourse.julialang.org/t/plutoslides-jl-beamer-style-presentations-for-pluto-notebooks/133655/9 "2026-10-01T13:53:27Z")

</div>

Dear all,  
Thanks for suggestions. After some thoughs I believe PlutoSlides.jl is the most meaningful name. The readme do specify the regular Pluto presentation mode.

Updates with the **v0.3.0**

- I think the perfomance issue is greatly reduced/fix (?). Do report if you experience lags (especially with slider and such). Note that if this lag happens it is only in slide mode, so you can always exit it.
- There is now a [documentation](https://dmetivie.github.io/PlutoSlides.jl/dev/)
- Some reasonable fontsize default, screen wide.
- A **PDF print export** , to get you slide in pdf format. Always after a conferences people ask for your pdf, and I have to give an html. This is experimental (see here for an exemple). Not sure if useful but I think it is cool!
- Tiny improvements and options (maybe too much?)

**In need your opinion**  
Now I think it is time for registration (it is harder to use unregistrerd package with Pluto).  
However:

- Julia pkg guidelines specifically mention the [LLMs policy](https://github.com/JuliaRegistries/General#is-there-any-policy-regarding-the-use-of-llms-in-registered-packages). I tried to read all `.js` produced by the LLMs but I cannot say I understand every lines. I guided the LLMs everystep of the way.
- I don’t have a regular test section (I don’t know how to test beside visual test)

Do you think I can still register ?
