Open index.html
No build, no dev server, no toolchain. A deck is a folder.
HTML slide decks · built on web standards
HTML + Web Components · ~14 KB gzip · zero build · MIT
It's one HTML file. Open it in any editor, change a word, save. Drop the folder on any static host and send the link. No build, no export, no toolchain to keep happy.
01 Why
index.htmlNo build, no dev server, no toolchain. A deck is a folder.
Web standards only. Custom Elements, Shadow DOM, ES Modules, CSS variables.
Lit and 30 components. Anything bigger, you opt in.
02 Two products, one folder
Same components. Same theming. Same ~14 KB bundle. This wasn't planned. It falls out of building the engine on Web Components and CSS custom properties, so you get it for free.
<deck-root autoplay="4000" loop swipe transition="slide"> <deck-cover>...</deck-cover> <deck-feature>...</deck-feature> <deck-feature>...</deck-feature> </deck-root>
Three attributes. That's the whole change. Same markup as any other deck. The engine stops waiting on you and starts auto-advancing, with touch swipe.
Leave the three off. Keep 2D nav, the presenter window, speaker notes, step-reveal.
Add the three. Get touch swipe, autoplay that pauses on hover, an end that wraps to the start.
03 Anatomy
<deck-feature eyebrow="Module">
<h1 slot="title">Side effects</h1>
<p slot="lead" class="lead">
A module can act on import.
</p>
<deck-code lang="ts" hero>
import './polyfill';
</deck-code>
</deck-feature> <deck-feature> and friends give you structure. Title, lead, body.
Drop content where it goes. slot="title", slot="lead", slot="left", slot="right".
The pieces inside. <deck-code>, <deck-md>, <deck-callout>, <deck-card>, <deck-mermaid>.
04 Library
The opener. XL title on dark, brand mark if you want one, meta block.
A chapter break. Number and centered title on dark.
One thing in focus. Code, a table, a mermaid diagram, a big stat.
Two columns or three. cols="1-1", "1-2", "3".
Hero up top, two detail cards under it.
The line they remember. Centered, on dark.
And there's more. <deck-photo> for full-bleed images, plus ~23 other
building blocks · md, code, callout,
card, mermaid, stat, badge,
metric, tier-list, step-list,
kicker, stack, grid, punch,
shortcut, kbd · and the rest.
05 Two themes
Every component reads its colors, type and spacing from CSS custom
properties. Want a third theme? Copy themes/rikiki.css,
change the values, ship it.
06 60 seconds, no install
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="rikiki/tokens.css">
<script type="module" src="rikiki/dist/index.js"></script>
</head>
<body>
<deck-root>
<deck-cover brand="my-talk">
<h1>Hello, <span class="accent">world</span>.</h1>
</deck-cover>
<deck-feature eyebrow="One slide">
<h1 slot="title">That's all you need.</h1>
<deck-md>Write **markdown**, drop <deck-*> blocks, navigate with arrows.</deck-md>
</deck-feature>
</deck-root>
</body>
</html>
Drop this file on any static host. GitHub Pages, S3, Netlify, your local
python -m http.server. No build, no environment to set up.
Want the guided version? → Your first deck in 5 components.
07 Plugin shelf
The ~14 KB core ships none of these. Each one fetches on first use. A deck that never asks for a feature never pays for it.
Total if you enable everything · ~6.4 KB gzip on top of core
deck-transition.js Slide, fade, zoom, flip. Picks its own direction. Cross-fades old and new, no background flash.
Activate transition="slide"
deck-presenter.js A popup with the current slide, the next one, your notes and a timer. Syncs over BroadcastChannel.
Activate press P
shiki.js Real syntax highlighting for deck-code. TextMate grammars, JSX, TSX, template literals.
Activate installShiki()
click-stages.js Reveal elements one click at a time. data-click and data-anim. Builds on the step engine, reverses cleanly.
Activate installClickStages()
deck-notes A hidden slot that surfaces in the presenter window. Free text, kept as written.
Activate <deck-notes>
DX Livereload
A tiny built-in poller watches your deck files and reloads the page the moment one changes · landing you right back on the slide you were editing. Zero config, authoring-only, never shipped to the audience. Try it live below.
Enable it on any deck by appending ?live to the URL · the core
lazy-imports the poller on demand. Prefer it always on while authoring?
Load dist/livereload.js directly and it auto-starts on import.
08 Comparison
Read this fairly. Slidev, reveal.js, Marp and Spectacle are all good. Rikiki is for one case. You want to open a folder five years from now and still give the talk. Or drop a touch-friendly carousel on a landing page. That one constraint explains every column below.
| Rikiki our case | Slidev | reveal.js | Marp | Spectacle | |
|---|---|---|---|---|---|
| Source format | HTML | Markdown + Vue | HTML + JS | Markdown | JSX |
| Build step | ✓ no | × yes (Vite) | ~ optional | × yes (CLI) | × yes (webpack) |
| Runtime bundle (gz) | ~14 KB | ~600 KB | ~80 KB | ~50 KB | ~250 KB |
| Per-deck deps | 1 CSS + 1 JS | package.json | reveal.js dir | marp-cli | package.json |
| Works in 5 years | ✓ yes | ~ depends on Vue | ✓ yes | ~ depends on CLI | ~ depends on JSX |
Honest limits
Rikiki is opinionated. Here's what it deliberately doesn't do, so you can rule it out fast.
.pptx output isn't on the roadmap.
Print to PDF from the browser instead (Chromium, print backgrounds on).
FAQ
<deck-notes> inside any slide, then press P during the talk. A popup opens with the current and next slide, the notes, a timer and a slide counter. Sync runs over BroadcastChannel. No network call.themes/rikiki.css, change the values, link it instead of the default. ~140 CSS custom properties, in two layers (palette, then semantic). For a one-off, override the --deck-*-* tokens inline on the element.<script> inside any slide and run whatever JS you like. The slide is just an HTML host. Most of the time the four built-in transitions (slide, fade, zoom, flip) cover it. For one-off effects, GSAP and friends are a script tag away.autoplay loop swipe on <deck-root> turns the same engine into a touch-friendly carousel. Same components, same theming, same ~14 KB bundle. The dual use falls out of building on web standards.Documentation
Six entry points into the full reference. Pick the one that matches what you came for.
Three install paths · CDN, npm, git clone. First slide in one minute.
Read →How layouts, slots and atoms compose. Read this before writing.
Read →Every <deck-*> element · attributes, slots, tokens, one example each.
Read →2D keyboard model, overview mode, help overlay, route-state.
Read →~140 CSS variables, BEM naming, palette + semantic layers.
Read →Concrete patterns · code-on-left, big-number cover, side-by-side comparison.
Read →The whole point
Source = output.
A deck is a folder. Open it in 2031, change one character, give the talk again.