# Share a reveal.js Presentation — One Link, Comments on Slides

Canonical: https://commareports.com/share-revealjs-presentation
Published: 2026-08-29

> reveal.js decks are a folder of HTML, CSS and plugins that nobody can open from a zip. Publish the deck to a URL that keeps the transitions, the speaker notes and the fragments — and takes comments per slide.

# Share a reveal.js presentation

A reveal.js deck is an HTML document that is genuinely good at being a
presentation — and genuinely bad at being sent to someone. It is
`index.html` plus `dist/`, plus `plugin/`, plus whatever images and video
you dropped in. Zip the folder and you have handed someone homework.

So decks end up exported to PDF, which throws away the fragments, the
transitions and the embedded chart that was the whole point.

## Drop the folder

```bash
# whatever your deck directory is
ls my-deck/
# index.html  dist/  plugin/  images/
```

Drag `my-deck/` (or a zip of it) into [Comma](https://commareports.com/):

- `index.html` becomes the **report body** — the page carrying the comment
  layer.
- `dist/reveal.js`, `dist/reveal.css`, your theme, the plugins and the
  images upload alongside it.
- Relative `src` and `href` references are rewritten to the uploaded
  assets, so the deck resolves everything it needs.

Scripts run inside a sandboxed iframe (`allow-scripts`, no
`allow-same-origin`), which is what reveal.js needs to boot. Arrow keys,
fragments, transitions, the `Esc` overview and the plugins you bundled all
work at the URL exactly as they do locally.

## If your deck loads reveal from a CDN

Then it really is one file, and it publishes in a single call:

```bash
curl -fsS -X POST "https://commareports.com/api/v1/reports" \
  -H "Authorization: Bearer $COMMA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --rawfile html index.html \
        --arg title "Q3 architecture review" \
        '{title: $title, html: $html}')"
```

The folder drop is still the better default — a CDN-linked deck breaks the
day the version you pinned moves, and a self-contained one doesn't.

## Speaker notes

The notes plugin opens a **second window**. A sandboxed iframe won't, so
speaker view stays a local-run feature. Two options that work: keep the
published deck for the audience and run speaker view off your own copy, or
move the notes into fragments and an appendix slide if the reader is
meant to see them anyway.

## Why publish instead of exporting a PDF

Because of what happens next. A PDF gets forwarded and commented on in a
mail thread, where the feedback is detached from the slide it is about. A
published deck takes **anchored comments** — select the claim on slide 12,
leave a thread, and it stays on slide 12 across every revision. See
[commenting on HTML](/comment-on-html).

And when the deck changes, it changes at the same URL. `PATCH` a saved
report id and each update appends a revision, so the link you sent before
the meeting is still the current deck after it.

## Who can see it

Per report: private, your team, anyone signed in at your domain, or anyone
with the link — with view, comment or edit rights for link holders. An
unannounced roadmap deck doesn't need a public URL to get reviewed. Full
model in [sharing & access control](/docs/sharing).

## Limits

- **Entry HTML: 5 MB.** Assets: 25 MB per file, 250 MB and 500 files total.
  That covers a media-heavy deck; a 4K background video may not fit.
- **Scripts run, sandboxed** — no same-origin access. A slide that fetches
  from your internal API on a same-origin path won't; use absolute URLs.
- **60 requests/minute per token.**

## Try it

Comma is free — unlimited reports, unlimited commenters, unlimited
revision history.

**[Publish a deck →](https://commareports.com/)**

### Related

- [Share Marp slides](/share-marp-slides) — the markdown-authored version
- [Interactive HTML reports](/interactive-html-reports)
- [Embed a report](/embed-html-report) · [Host an HTML file](/host-html-file)
- [Comma vs Google Docs](/vs/google-docs)
