webflow2reveal
Turn a structured, sectioned Webflow page into an interactive Reveal.js slide deck — without authoring slides by hand.
A Webflow export is already a stack of full-width <section>s with consistent
class names. webflow2reveal treats each qualifying section as one slide, infers
the slide layout and background colour from the page's own CSS, discards chrome
(nav, footer, menu, banner), and wraps everything in a Reveal scaffold sized for
a 1440×900 stage.
It ships as two implementations that share one approach:
| Package | Runs | Input → Output | |
|---|---|---|---|
| Python | webflow2reveal (PyPI) |
Build time | URL / local HTML → static index.html |
| JavaScript | webflow2revealjs (npm) |
Run time, in browser | Live page / fetched URL / raw HTML → in-place deck |
📖 Full documentation: https://code.twardoch.com/webflow2reveal/ · 🖥️ Live demo
Quick start
Python (build a static deck)
# Convert a hosted Webflow page (no install needed)
uvx webflow2reveal https://example.webflow.io/deck --output index.html
# Convert a local export and preview it on a dev server
uvx webflow2reveal ./export/index.html --serve --port 8080
from webflow2reveal import convert
convert("https://example.webflow.io/deck", output="index.html")
JavaScript (convert in the browser)
Add one script to a Webflow Page Custom Code block before </body>:
<script src="https://cdn.jsdelivr.net/npm/webflow2revealjs@latest/dist/index.global.js"></script>
<a href="#" class="w2r-trigger">View as Slides</a>
Clicking a .w2r-trigger element — or loading the page with ?reveal=1 —
converts the live page to slides in place. Or call it yourself:
import { convertToReveal } from 'webflow2revealjs';
await convertToReveal(); // current page, in place
await convertToReveal({ sourceUrl, corsProxy }); // fetch and convert another page
How it works
Webflow page → parse CSS bg-colours → pick slide <section>s →
normalize DOM (split / image / text / badge layouts) →
score luminance (light/dark) → inject Reveal.js 5.1 →
static index.html / in-place browser deck
- Resolve colours — scan inline and linked stylesheets into a
class → background-colourmap. - Select slides — every
<section>becomes a slide unless its classes/id mark it as nav, footer, menu, header, or banner. - Normalize the DOM — rewrite each slide into a small layout vocabulary
(
slide-split-layout,slide-column,slide-text-container,slide-image-cover,slide-badge). - Classify backgrounds — set
data-background-colorand tag each slideslide-light-bg/slide-dark-bgby perceptual luminance for correct text contrast. - Inject Reveal.js 5.1 plus a bundled stylesheet that sizes everything to the stage and hides Webflow chrome.
Add ?view=scroll to any generated deck to switch into Reveal's native scroll
view. See How it works
for the full algorithm.
Repository layout
py/src/webflow2reveal/ Python package (compiler.py = the converter)
js/src/index.ts TypeScript library (convertToReveal + DOM helpers)
docs/ Jekyll site (just-the-docs) + live demo under docs/demo/
build.sh Build JS bundle + Python wheel; copy bundle into docs/demo
publish.sh Tag, build, and publish to PyPI + npm
dev_server.py Local CORS-proxying dev server for testing fetched pages
Build & publish
./build.sh # builds js/dist/* and dist/*.whl, copies bundle to docs/demo/dist/
./publish.sh # version-tags, rebuilds, publishes to PyPI and npm
The JS build emits CJS, ESM, and an IIFE global (Webflow2Reveal) via tsup.
The Python package versions from git tags via hatch-vcs; a single tag releases
both packages.
License
MIT © Adam Twardoch.
Release files for webflow2reveal 1.0.19
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| webflow2reveal-1.0.19.tar.gz | 129.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| webflow2reveal-1.0.19-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 146.6 kB
Release files / webflow2reveal-1.0.19.tar.gz
| Download URL | webflow2reveal-1.0.19.tar.gz |
|---|---|
| Size | 129.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0b9ea852125f5c9f1178ad9bec84a6af0e34a43a94549e5bf28283a2c49939aa
|
|
BLAKE2b-256 checksum How to use checksums |
f3e98eac16c733b25819a1e3cb9d8eb8bc6f0e423b4980c239ced6bb495e07df
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / webflow2reveal-1.0.19-py3-none-any.whl
| Download URL | webflow2reveal-1.0.19-py3-none-any.whl |
|---|---|
| Size | 17.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a030443c5873690cc3c7053a84c81c5e91b4090c8fa62a8baf898cefc4056622
|
|
BLAKE2b-256 checksum How to use checksums |
4ff58b3c605a83185ccb7aab2cf7ae6cb6cac5bb313dd439d78eb611b3f086d2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|