Presentation
Build reveal.js presentations from Org or Markdown and keep every build, outline and PDF as versioned swamp data.
Org decks render through org-re-reveal, so #+REVEAL_ options, fragments, speaker notes and themes behave as they do in Emacs. Markdown decks render through pandoc, or in the browser through reveal.js's markdown plugin. Decks load reveal.js 6.0.1 from jsDelivr with subresource integrity, or carry every file inline (selfContained) and work offline. Local images are always inlined, so a stored deck never depends on files beside its source.
Every download is pinned to an exact version and SHA-256: reveal.js from jsDelivr, org-re-reveal 3.39.0 and htmlize 1.59 by commit. Nothing is read from your Emacs configuration. A deck is treated as untrusted: building it runs no code it names (Babel, eval macros, preamble functions) and reads no file outside its own directory.
Requirements
- Emacs 27.2 or later for Org decks (its built-in Org, 9.4 or newer, is used)
- pandoc 3 for the pandoc engine
- Chromium or Chrome for export_pdf
Quick start
swamp extension pull @webframp/presentation
swamp model create @webframp/presentation/deck talks
swamp model method run talks build --input source=talk.org
swamp model method run talks outline --input source=talk.org
swamp model method run talks export_pdf --input name=talk
# The deck itself, ready to open in a browser:
swamp data query 'model("talks") && name == "html-talk"' \
--select content > talk.htmlOr outline, build and print in one run:
swamp workflow run @webframp/presentation-build \
--input source=talk.org --input pdf=true2026.10.21.1
Added: First release. The @webframp/presentation/deck model builds
reveal.js 6.0.1 presentations from Org or Markdown and stores each build as
versioned swamp data.
buildrenders a deck with org-re-reveal (Org), pandoc (Markdown) or reveal.js's markdown plugin. Decks load reveal.js from jsDelivr with subresource integrity, or inline every file withselfContainedand work offline. Local images are always inlined. A rebuild with identical output writes no new HTML version.outlinereads a source without rendering it: slides, speaker-notes coverage and missing images.export_pdfprints the latest build with headless Chromium.- The
@webframp/presentation-buildworkflow outlines, builds and optionally prints one deck. - The
@webframp/presentation/deck-summaryreport summarises each method run.
Downloads are pinned by SHA-256: reveal.js files from jsDelivr, and
org-re-reveal 3.39.0 and htmlize 1.59 by commit. Org decks build in Emacs -Q,
so your configuration plays no part.
Decks are treated as untrusted. A build runs nothing the deck names: no Babel,
#+BIND, file-local variables, (eval ...) macros or preamble functions. It
reads and inlines files only from the source's own directory, outside .git and
.swamp, within size limits, and Emacs, pandoc and Chromium each run under a
timeout.
Global Arguments
| Argument | Type | Description |
|---|---|---|
| emacs? | string | Emacs executable for the org-re-reveal engine |
| pandoc? | string | pandoc executable for the pandoc engine |
| chromium? | string | Chromium or Chrome executable for export_pdf |
| chromiumNoSandbox? | boolean | Pass --no-sandbox to Chromium. Needed in some containers and WSL; leave off otherwise |
| buildTimeoutSeconds? | number | Longest an Emacs or pandoc run may take before it is stopped |
| cacheDir? | string | Where pinned downloads are cached (default: $XDG_CACHE_HOME/webframp-presentation or ~/.cache/webframp-presentation) |
| Argument | Type | Description |
|---|---|---|
| selfContained? | boolean | Inline every reveal.js file so the deck works offline (larger file) |
| Argument | Type | Description |
|---|---|---|
| source? | string | Source path, used only to derive the deck name |
| timeoutSeconds? | number | Longest wait for reveal.js to lay out its print view |
Resources
Files
Build one deck: outline the source, render it, and optionally print it to PDF. Each step runs only if the one before it succeeded, so a source that fails to build never reaches the PDF step. Requires an @webframp/presentation/deck instance, named by the `deck` input (default `talks`): swamp model create @webframp/presentation/deck talks The deck's data name comes from the source file name. To choose another name or an engine other than the default, run the methods directly: swamp model m
Summarises a deck build, outline or PDF export: slides, speaker-notes coverage, external resources and warnings
- Has README or module doc2/2earned
- README has a code example1/1earned
- README is substantive1/1earned
- Most symbols documented1/1earned
- No slow types (deprecated)1/1earned
- Dependencies pass trust audit2/2earned
- Has description1/1earned
- Platform support declared (or universal)2/2earned
- License2/2earned
- Verified public repository2/2earned