Johannes Kaindl137 downloadsTurn a Markdown note into a slide deck and export it to PDF or a PNG image series, with live readability checks.
Turn a Markdown note into a slide deck and export it to PDF or a PNG image series, with live readability checks.

shiro 白 (light, default), kuro 黒 (dark), sumi 墨 (true-black, high-contrast), kairo 回路 (dark, cyan), kurenai 紅 (dark, red) — selected per deck via the theme: frontmatter key; each carries a matching code-highlight and Mermaid theme. Legacy 0.4.x keys (default, dark, serif, high-contrast) still work — they resolve silently to their Nordstern successor.from frontmatter / from default / ● unsaved) that shows where the active theme comes from, and a Set button that writes theme: directly into the note's frontmatter. Frontmatter is the source of truth; the Settings default applies only to notes without a theme: key..css files into a configurable themes folder (default Slide-Deck-Themes/); the frontmatter theme: value is the filename without the .css extension. Each file is a --sd-* token block with optional extra CSS on top of the plugin's design system (type scale, spacing, rhythm) — a 7-token theme already looks finished; user themes inherit the shiro theme's code-highlight and Mermaid styles unless overridden. See the theming guide. The Settings tab shows all valid theme keys live..css starting point; a toggle hides the themes folder in Obsidian's file explorer.default, title, section, quote, image-focus, two-column, columns-3, stat, cover-image — set per slide with a layout directive (an HTML comment); columns are separated by a column directive, and in multi-column templates the leading heading spans all columns. See the layout guide.compact (tighter type) or code-heavy (smaller code) to any template in the same layout directive.section, a lone block quote becomes quote, a lone image or diagram becomes image-focus, and column splits pick two-column / columns-3. An explicit layout directive always wins.header:, footer:, and paginate: frontmatter keys render as floating corner slots on every slide (pagination shows n / N).object-fit: contain), for both Obsidian ![[embeds]] and standard  images.---; YAML frontmatter controls theme, aspect ratio, and font floor per note.minFontPx); slides that would need smaller text are flagged as overflowing instead of becoming unreadable.modern-screenshot and writes numbered PNGs into a configurable export folder (Settings, default Slide-Deck-Export/); typographically accurate inter-word spacing.$…$ / $$…$$) rendered by KaTeX.> [!note], [!warning], [!danger], [!tip], [!info] blocks rendered with redundant coding: border color + geometric shape + visible label word (not color-only; satisfies WCAG 1.4.1).```mermaid ``` blocks rendered as SVG, per-theme.
isDesktopOnly: false) — runs on desktop (Windows, macOS, Linux) and on mobile (iOS/iPadOS); desktop-only APIs are platform-guarded.<export-folder>/<note-name>.html.Slide-Deck-Export/). PDF export on desktop goes through the system print dialog, where you choose the location.Planned: once accepted into the Obsidian community plugin registry it will be installable via Settings → Community plugins → Browse → search "Slide Deck".
main.js, manifest.json, and styles.css from the latest release..obsidian/plugins/slide-deck/ inside your vault.https://codeberg.org/jkaindl/slide-deck (or its GitHub mirror https://github.com/johannes-kaindl/slide-deck).git clone https://codeberg.org/jkaindl/slide-deck.git
cd slide-deck
npm install
npm run build # produces main.js
cp main.js manifest.json styles.css /path/to/vault/.obsidian/plugins/slide-deck/
| Setting | Key | Default | Description |
|---|---|---|---|
| Default preset | defaultTheme |
shiro |
Preset used when a note has no theme frontmatter directive |
| Minimum body font size (px) | minFontPx |
24 |
Legibility floor — slides that would need smaller text are flagged as overflowing |
| Image export scale | imageScale |
2 |
Pixel multiplier for PNG export (2 = 2×, crisp on HiDPI screens) |
| Custom CSS | customCss |
(empty) | CSS appended to the deck styles in preview and exports, for branding or tweaks |
| Export folder | exportFolder |
Slide-Deck-Export |
Vault folder for the PNG image-series export |
| Themes folder | themesFolder |
Slide-Deck-Themes |
Vault folder scanned for user .css themes |
| Hide themes folder | hideThemesFolder |
true |
Hide the themes folder in Obsidian's file explorer |
Add a YAML frontmatter block at the top of your note to control presentation-level settings:
---
theme: kuro
aspect: 16:9
minFontPx: 24
header: My talk
footer: ACME Corp
paginate: true
---
| Key | Values | Description |
|---|---|---|
theme |
shiro · kuro · sumi · kairo · kurenai · user-theme-key (legacy default/dark/serif/high-contrast still resolve) |
Visual preset name; user theme key = the .css filename without the extension |
aspect |
16:9 (default), 4:3 |
Canvas size: 1280×720 (16:9) or 960×720 (4:3) |
minFontPx |
any positive number | Per-note legibility floor; overrides the plugin setting |
header |
any text | Floating header slot shown on every slide |
footer |
any text | Floating footer slot shown on every slide |
paginate |
true · yes · on |
Show a page indicator (n / N) on every slide |
Nine per-slide templates (default, title, section, quote, image-focus, two-column, columns-3, stat, cover-image), combinable density modifiers (compact, code-heavy), the layout and column directives, and smart layout inference are documented in the Slide layouts & syntax guide.
Use a line containing only --- to split slides:
---
theme: shiro
aspect: 16:9
---
# Slide 1
Content here.
---
# Slide 2
More content.
Note: the --- in the YAML frontmatter block is the standard YAML delimiter and is not a slide separator.
--- lines into individual slide bodies. A YAML frontmatter block (if present) sets deck-level directives.minFontPx (the legibility floor). If the content would still overflow at that scale, the slide is flagged with a warning in the preview pane rather than scaled further.modern-screenshot (domToCanvas) capture (PNG). On desktop, PDF is printed via contentWindow.print(); on mobile, a self-contained HTML file is written to the vault and handed to the OS via openWithDefaultApp.The Generate presentation from note command sends note content to an OpenAI-compatible
LLM endpoint that you configure (default http://localhost:1234, i.e. a local LM Studio).
No cloud service is involved unless you point the endpoint at one.
Streaming runs over XMLHttpRequest under the Obsidian origin, so the endpoint must allow
cross-origin requests. LM Studio's CORS toggle must be on; Ollama needs
OLLAMA_ORIGINS=app://obsidian.md (or *). If the endpoint answers the reachability ping but
refuses the stream, the plugin automatically falls back to a non-streaming request (you lose
the live token view, but the deck still generates).
Code: AGPL-3.0-or-later. Documentation: CC BY-SA 4.0. Author: Johannes Kaindl — https://jkaindl.de