Kadal Deck
Slides in MDX. A live room for your audience. One command to publish.
Write the talk in the editor you already use, present it in a browser, and let the room follow,
react, ask and vote from their phones — nothing for them to install.
Get started · Docs · Live demo · Showcase · Changelog · Sponsor
Why Kadal Deck
- You write; it presents. A talk is one
deck.mdxfile: Markdown, plus components when you need them. It lives in git, diffs cleanly and reloads as you type. - The room is part of the deck. Your audience scans a QR code and follows along on their phones: reactions, questions with upvotes, polls, word clouds, timed quizzes, a pace dial and a raised hand, all built in. No add-on, no second app.
- Any framework on a slide. React and web components out of the box; Vue, Svelte, Solid, Preact, Qwik, Angular, Fresh, Rust/WebAssembly and Python as islands, each loaded only when its slide appears.
- Familiar keys. Slides split at
---and----the way reveal.js and Slidev do, the presenter view opens onS, and the keyboard is vim-first. - Yours to run. A built deck is a static site that works offline. Export it to PDF, PNG or PPTX, host it anywhere, or publish it with a live room in one command.
Quick start
You need Node 20.19+ and npm, pnpm, Yarn or Bun.
npm create @kadal/deck@latest my-talk
cd my-talk && npm install
npm run dev # edit deck.mdx; the slide you're on updates in place
---
title: Hello, room
---
# Hello, room
---
## Clicks, one point at a time
<Clicks>
- Slides split at `---`, vertical ones at `----`
- Code steps line by line, and notes follow your clicks
</Clicks>
---
<Poll id="lunch" question="Lunch?" options={["Dosa", "Biryani", "Both"]} />
When it's ready:
npx kadal-deck build # dist/ for any static host (everything but the live room)
npx kadal-deck export # PDF in export/; add --png --pptx for those too
npx kadal-deck publish # deck.kadal.cc/@you/my-talk/ with a live room (free plan)
See it
| The presenter view | The audience, on a phone |
|---|---|
![]() |
![]() |
| Current and next slide, notes that follow your clicks, a timer with pacing, drawing, laser, spotlight, blackout, a frameless share window for calls, and the room panel. | The slide in step with you (or roam ahead and catch up), reactions, questions, polls, quizzes, pace and a raised hand. |
Open the tour →: the engine's own feature deck, nine chapters
showing every layout, component, background, transition and view, with every framework island
running on one slide. Press ? for the keys. Its source is examples/showcase,
and node tools/showcase-check.mjs drives every slide and view of it in a headless browser.
Features
Authoring
|
Presenting
|
The live room
|
Shipping it
|
Use with AI agents
Kadal Deck is built to be written by an agent as well as a person: a skill that teaches the format and the workflow, an MCP server that can edit slides precisely and look at them, and a CLI whose every command answers in JSON.
Claude Code plugin (the skill and the MCP server together):
/plugin marketplace add kadalcc/deck
/plugin install kadal-deck@kadal-deck
(On Claude Code 2.1.275 or later, /plugin install kadal-deck --marketplace kadalcc/deck does both.)
The skill alone, for any agent (Agent Skills format, in
skills/kadal-deck): npx skills add kadalcc/deck
The MCP server alone — kadal-deck mcp speaks the Model Context Protocol on stdio. It works
on the deck in the folder it starts in (or --dir <path>; every tool also takes a dir inside
it). Tools never read or write outside that folder unless the server is started with
--allow-outside.
claude mcp add kadal-deck -- npx -y @kadal/deck mcp # Claude Code
// Claude Desktop (claude_desktop_config.json) and Cursor (.cursor/mcp.json)
{ "mcpServers": { "kadal-deck": { "command": "npx", "args": ["-y", "@kadal/deck", "mcp", "--dir", "/path/to/my-talk"] } } }
// VS Code (.vscode/mcp.json)
{ "servers": { "kadal-deck": { "type": "stdio", "command": "npx", "args": ["-y", "@kadal/deck", "mcp"] } } }
| tools | |
|---|---|
deck_reference, deck_frontmatter_schema |
every component, layout, background and option, from the engine's own catalog |
deck_create, deck_outline, deck_read_slide, deck_check |
scaffold, read the deck as structure, lint it |
slide_add, slide_update, slide_remove, slide_move, deck_update_frontmatter, notes_set |
edits that change only that slide's lines, linted on the spot |
slide_render, deck_preview |
PNG pictures of slides from a dev server kept running between calls, and a live URL for you |
deck_build, deck_export, deck_publish |
a static site, PDF/PNG/PPTX, and a published deck (with your saved kadal-deck login) |
It also serves the catalog, the reference and the guides as resources, and two prompts:
draft_deck (outline → finished deck) and review_deck. Rendering and export need Playwright
in the deck: npm i -D playwright && npx playwright install chromium.
The CLI, for scripts and agents: kadal-deck check (lint, exit 1 on errors),
kadal-deck screenshot (PNGs), kadal-deck info [topic] (the reference), kadal-deck new <dir>
(no questions asked); --json on every command prints one JSON object on stdout. Exit codes:
0 ok · 1 failed · 2 usage · 3 not signed in · 4 missing prerequisite.
Building your own tooling? @kadal/deck/catalog is everything a deck can use as data,
@kadal/deck/authoring reads, lints and edits a deck as text (no Node APIs), and
@kadal/deck/schema/frontmatter.json is the JSON Schema for frontmatter.
Islands, in any framework
Put a component from any of these on a slide. Each runtime is code-split and loads only when its
slide appears; examples/showcase runs all eleven on one slide.
| Framework | Package | Framework | Package | |
|---|---|---|---|---|
| React | built in | Qwik | @kadal/deck-qwik |
|
| Web components | built in | Angular | @kadal/deck-angular |
|
| Vue | @kadal/deck-vue |
Fresh | @kadal/deck-fresh |
|
| Svelte | @kadal/deck-svelte |
WebAssembly / Rust (Leptos, …) | @kadal/deck-wasm |
|
| Solid | @kadal/deck-solid |
Python (Pyodide) | @kadal/deck-python |
|
| Preact | @kadal/deck-preact |
Packages
| Package | Version | What it is |
|---|---|---|
@kadal/deck |
The engine: MDX compiler and Vite plugin, React runtime, components, themes, live client, export, and the kadal-deck CLI |
|
@kadal/create-deck |
npm create @kadal/deck@latest: a new deck from the starter |
|
@kadal/deck-* |
The framework renderers above, released in lockstep with the engine |
Every package is published from this repository's release workflow through npm trusted publishing, with provenance you can check on each npm page.
The live room: self-hosted or hosted
Everything one machine can do is free and stays free: writing, presenting, the presenter view, export and a static build. The live room needs a server that holds a WebSocket per deck.
- Host it yourself. The room protocol is typed in the engine (
@kadal/deck/protocol) and documented endpoint by endpoint, so a room server you write against it can't drift from the client. - Or use deck.kadal.cc.
npx kadal-deck publishgives the deck a live room, analytics, passcodes, version history and teams. There's a free plan, and the paid plans fund the engine, the way Slides.com funds reveal.js.
Documentation
| Getting started | Create a deck and learn what each file is for |
| Writing slides | Slides, frontmatter, layouts and slots |
| Clicks and animation | Steps, auto-animate, motion and transitions |
| Code | Line steps, magic move and highlighting |
| The live room | Polls, quizzes, questions, pace and following |
| Islands | Components from other frameworks |
| Presenter and keyboard | Every view and every key |
| Export | PDF, PNG and PPTX |
| CLI | new, dev, build, check, screenshot, export, login, publish, mcp |
| Self-hosting the room | The protocol and what the AGPL asks of you |
The engine's own reference, with every component and option, is in
packages/deck/README.md.
Sponsors
Kadal Deck is made by @pmithunish, an independent developer in Chennai working as Kadal. Sponsorships go straight to the maintainer and pay for time on the open-source engine: issues, docs, new islands and the features you ask for. Become a sponsor →
| Tier | A month | What you get |
|---|---|---|
| Supporter | $3 | Our thanks and the sponsor badge on your GitHub profile |
| Backer | $10 | Your name in BACKERS.md and on the sponsor page |
| Patron | $25 | Your avatar in this README and on the sponsor page |
| Bronze | $100 | Your company's logo in this README and on the sponsor page |
| Silver | $250 | A larger logo here, on the sponsor page and in the docs |
| Gold | $500 | The largest logo at the top of this README and the docs, priority on your issues, and a monthly call |
One-time sponsorships of $10 and $50 are welcome too. Companies can sponsor by invoice.
Your logo here — be the first company to sponsor Kadal Deck.
Contributing
Bug reports with a small deck.mdx that reproduces them are the most useful thing you can send,
and pull requests are welcome. CONTRIBUTING.md covers the setup (Bun 1.3+),
the tests and the island verifier. Please follow the code of conduct, and
report security issues privately as SECURITY.md describes.
Licence
AGPL-3.0-or-later, with a commercial licence for anyone who wants to build a hosted or proprietary product on the engine without publishing their changes. Presenting with it, self-hosting your own decks or embedding a deck in a site you publish triggers nothing. The details are in LICENSING.md.
Made in Chennai by Kadal · deck.kadal.cc

