When this Reveal.js publishing path fits
Use this workflow for an already authored Reveal.js deck when deck-specific viewing, same-URL updates, or public/unlisted sharing matters. Use a general static host when you need server behavior, arbitrary deployment configuration, or full control outside a presentation reader. Slidesfly publishes the built artifact; it does not generate or edit Reveal.js source.
Keep the Reveal.js runtime and assets local
Slidesfly accepts local relative script files inside a multi-file archive and rejects remote <script src> references. The verified source uses the Reveal.js 6 ES module runtime:
reveal-deck/
├── index.html
└── dist/
├── reveal.css
├── reveal.mjs
├── theme/black.css
└── plugin/Add only the plugins, themes, fonts, images, video, and data files your deck actually references. The proof fixture copies the full installed dist directory for a reproducible baseline, which is larger than a minimal deck.
Build and create a root-level archive
Install the pinned runtime
Commitreveal.js 6.0.1and its lockfile with the deck source.Build or copy the local runtime
Confirmbuild/index.htmlreferences./dist/reveal.mjsand local styles.Zip from inside build
This keepsindex.htmlat the archive root rather than underbuild/.
npm install --save-exact reveal.js@6.0.1
npm run build
test -f build/index.html
cd build
zip -r ../reveal-deck.zip .
cd ..
unzip -l reveal-deck.zip | headThe verified artifact is 2,675,652 compressed bytes and 5,127,395 uncompressed bytes. If you add local assets, recheck both file count and uncompressed plan size.
Publish and later update the same reader URL
slidesfly login --json
slidesfly publish ./reveal-deck.zip --title "Reveal.js product review" --visibility unlisted --json
# Later: keep the same reader URL
slidesfly publish ./reveal-deck-v2.zip --id YOUR_DECK_ID --jsonA successful publish returns the generated deck ID and reader URL:
{
"ok": true,
"data": {
"deck_id": "YOUR_GENERATED_DECK_ID",
"url": "https://slidesfly.xyz/d/YOUR_GENERATED_DECK_ID",
"visibility": "unlisted",
"anonymous": false
}
}Public indexing, expiry, deletion, and quarantine remain separate policies enforced around the sandboxed reader. Multi-file decks support public or unlisted visibility, not private visibility.
Reveal.js reader compatibility checklist
| Check | Verified behavior | What can still vary |
|---|---|---|
| Runtime | dist/reveal.mjs loads from the versioned reader path. | Custom bundlers and older Reveal.js import paths. |
| Navigation | The live deck advanced from slide 1 to slide 2. | Vertical slides, fragments, touch, and custom key bindings. |
| Plugins | Local relative plugin modules are allowed. | Every plugin must be included and tested; CDN imports are rejected. |
| Storage and links | The iframe has an opaque origin and no top-navigation permission. | Code that expects cookies or persistent browser storage. |
sandbox="allow-scripts allow-popups allow-popups-to-escape-sandbox allow-forms"Reveal.js publishing failures and recovery
| Failure | Recovery |
|---|---|
AUTH_REQUIRED | Run the supported login flow, then retry the zip publish. |
FORBIDDEN | Use an eligible Pro account and public or unlisted visibility. |
INVALID_HTML | Move index.html to the archive root and remove unsafe or excess files. |
MALICIOUS_CONTENT | Replace CDN script imports with local relative runtime files. |
| Missing theme, plugin, or media | Inspect reader requests, correct relative paths, rebuild, and republish. |
Reveal.js 6.0.1 live proof
The generated and reader index.html files are both 1,654 bytes with SHA-256 c21712a5f88d90c5ad8c99292696c22dff6c69a7ba34550b1e7356e534a31bc3. The local and reader dist/reveal.mjs files are both 139,091 bytes with SHA-256 4bbf460b02602dd2d73c86622a84b7004aca667f8719b9ce3e89fcb64a7dcfaa.