Your reveal.js deck deserves a URL. Not an email attachment.
You built the talk in HTML because you wanted control. Then sharing time comes and someone suggests exporting to PDF. Which flattens every fragment, kills the speaker notes, and takes the live demo on slide nine with it (naturally). It's not a printout. The deck is a website. Host it like one.
Drop your Reveal.js report here — get a live link
.zip, folder, or single .html — free, no account, live for 30 days.
The artifact dead-end
PDF export is where reveal.js decks go to die: fragments collapse into one crowded slide, transitions vanish, and the speaker notes you wrote for yourself stay behind.
The alternative—"just open index.html"—asks your audience to receive a folder, keep the directory intact, and double-click the right file. Most won't.
Two lines to a live link
Hand the file to the action — or straight to the API:
.github/workflows/ci.yml
- uses: bitgate/ship-page-action@v1
if: always()
with:
path: index.htmlOr with plain curl — no account needed
curl -fsS -X POST https://ship.page/deploy \
-H "Content-Type: text/html" \
--data-binary @index.html | jq -r .urlpath: index.html deploys exactly what the tool wrote — no detection to configure. The link goes in the job summary — add comment: true and it lands on the pull request too.
What you get
- The deck is already static HTML. Upload the file (or the whole folder as a zip) and it's live. No conversion step.
- Fragments, vertical slides, transitions, and the speaker-notes plugin all work. Nothing about the deck changes.
- Hash deep links survive hosting. Initialize with hash: true and #/3/1 opens that exact slide—'go to the appendix' becomes an actual link.
- Pin the reveal.js version on the CDN, or zip dist/ and plugin/ alongside your index.html. That way the deck renders the same in five years.
- Anonymous links live 30 days (long enough for the conference). Claiming extends that to 90.
Downloadable example
A four-slide deck, deployed live.
A small sample deck with fragments, vertical slides, and speaker notes. Arrow keys to navigate; press S for speaker view. Loads reveal.js 6.0.2 from the CDN (pinned, naturally).
Questions
Do speaker notes work from the hosted link?
Yes. Load the notes plugin and press S; speaker view opens in a second window as usual. Verified against reveal.js 6.0.2 served from the CDN: dist/reveal.js plus dist/plugin/notes.js.
Should the deck load reveal.js from a CDN, or just bundle it?
Either way works. The CDN keeps the HTML tiny (this page's example does exactly that). Bundling dist/ and plugin/ into the zip makes the deck immune to CDN outages and version drift. For a talk you can't re-give, bundle.
Can I deep-link to a specific slide?
Yes. With hash: true, every slide gets its own #/x/y URL, served as-is. Link straight to the numbers slide in the follow-up email.
Does live multiplexing across devices actually work?
No. Multiplexing needs a socket server, and drops are pure static hosting. Speaker view and notes run locally in the browser—those work fine.
How to keep the deck online after the event.
Anonymous drops expire after 30 days (claiming extends that to 90). Deploy with an sp_ API key on a paid plan and the deck stays live indefinitely.
Related recipes
- Quarto: Ship the Quarto report. Not the repository.
- Single HTML file: One HTML file, one POST, one URL
- Zip upload: Upload a zip, get a URL — that's the whole API
Try it on your next run
Anonymous deploys need no account and no key — paste the step, get a link. When you want stable URLs that redeploy in place, an API key and a name are all it takes.
Need to share the report with someone outside GitHub? How to share a GitHub Actions artifact without a login.