From stacey-voice
Create Slidev markdown presentations from scratch or by converting blog posts. Use when asked to "create a presentation", "make slides", "convert this post to slides", "build a slide deck", or "set up Slidev".
How this skill is triggered — by the user, by Claude, or both
Slash command
/stacey-voice:slidev-presentationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create markdown-based slide presentations using [Slidev](https://sli.dev). Supports building talks from scratch and converting existing blog posts into presentation format.
baselines/headmatter.yamlbaselines/slide-frontmatter.yamlexamples/blog-conversion-walkthrough.mdreferences/animations.mdreferences/code-features.mdreferences/components.mdreferences/diagrams-and-math.mdreferences/export-and-deploy.mdreferences/layouts.mdreferences/styling.mdreferences/syntax.mdtemplates/blog-post-conversion.mdtemplates/lightning-talk.mdtemplates/talk-from-scratch.mdtemplates/technical-demo.mdCreate markdown-based slide presentations using Slidev. Supports building talks from scratch and converting existing blog posts into presentation format.
| Type | Slides | Template | Best For |
|---|---|---|---|
| Conference talk | 20-40 | talk-from-scratch.md | Full-length presentations |
| Blog conversion | 10-25 | blog-post-conversion.md | Turning articles into talks |
| Technical demo | 10-20 | technical-demo.md | Code-heavy walkthroughs |
| Lightning talk | 7-10 | lightning-talk.md | 5-minute rapid talks |
Slides are separated by --- with blank lines above and below:
---
theme: default
title: My Presentation
---
# Slide 1
Content here
---
# Slide 2
More content
The first --- block is the headmatter (presentation-level config). Subsequent --- blocks are per-slide frontmatter.
---
layout: center
class: text-center
background: /images/bg.png
transition: slide-left
---
Use HTML comments at the end of each slide:
# My Slide
Content here
<!--
These are speaker notes visible in presenter mode.
Supports **markdown** formatting.
-->
| Layout | Purpose | Slots |
|---|---|---|
cover | Title slide | — |
center | Centered content | — |
default | Standard content | — |
section | Section divider | — |
two-cols | Side-by-side | ::right:: |
two-cols-header | Header + two columns | ::left::, ::right:: |
image-right | Content left, image right | image prop |
image-left | Image left, content right | image prop |
quote | Prominent quotation | — |
fact | Large data/fact display | — |
statement | Bold assertion | — |
end | Final slide | — |
Two-column example:
---
layout: two-cols
---
# Left Column
Content on the left
::right::
# Right Column
Content on the right
Image layout example:
---
layout: image-right
image: /images/diagram.png
---
# Explanation
Text alongside the image
Basic v-click (elements appear on click):
<v-click>
This appears on first click
</v-click>
<v-click>
This appears on second click
</v-click>
v-clicks on lists (each item appears on click):
<v-clicks>
- First point
- Second point
- Third point
</v-clicks>
Directive form:
<div v-click>Appears on click</div>
<div v-click.hide>Disappears on click</div>
Syntax highlighting with line highlights:
```ts {2,3}
function greet(name: string) {
const message = `Hello, ${name}!` // highlighted
console.log(message) // highlighted
}
```
Click-stepped line highlighting:
```ts {1|2-3|5}
const a = 1 // click 1
const b = 2 // click 2
const c = a + b // click 2
// gap
console.log(c) // click 3
```
Shiki Magic Move (animated code transitions):
````md magic-move
```js
const greeting = 'hello'
```
```js
const greeting = 'hello'
const audience = 'world'
```
```js
const greeting = 'hello'
const audience = 'world'
console.log(`${greeting}, ${audience}!`)
```
````
For Mermaid diagrams see references/diagrams-and-math.md. For UnoCSS styling see references/styling.md.

Or with styling:
<img src="/images/photo.png" class="w-60 rounded shadow" />
Images in the public/ directory are served at the root path /.
Ask the user for:
Create a structured outline with:
Read baselines/headmatter.yaml for presentation-level configuration reference.
Select the appropriate template from templates/ and use it as the skeleton.
Apply these principles:
Every slide should have speaker notes with:
Create the presentation directory and files:
presentations/<talk-slug>/
├── slides.md # The presentation
├── public/ # Images and static assets
│ └── images/
├── components/ # Custom Vue components (if needed)
└── snippets/ # External code files (if needed)
Read the blog post and identify:
Create a mapping table:
| Post Section | Slide(s) | Layout | Notes |
|---|---|---|---|
| Title + intro | 1 (cover) | cover | Use post title, add subtitle |
| Opening story | 2-3 | default | Distill to key moments |
| H2: Section Name | 4 (section) | section | Section divider |
| Paragraph content | 5-7 | default/two-cols | One idea per slide |
| ... | ... | ... | ... |
Blog content must be dramatically condensed for slides:
Read templates/blog-post-conversion.md for the skeleton structure.
The speaker notes should contain the deeper context from the original post that didn't make it onto the slides. This preserves the content for the speaker.
After the basic conversion:
All presentations live in the blog-content repository. The presentations/ directory has a shared package.json with Slidev dependencies installed once for all presentations.
presentations/
├── package.json # Shared Slidev deps + npm scripts
├── node_modules/ # Shared dependencies (gitignored)
└── talk-slug/
├── slides.md # Main presentation file
├── public/ # Static assets
│ └── images/ # Presentation images
├── components/ # Custom Vue components (optional)
└── snippets/ # External code snippets (optional)
cd presentations
npm install
Important: Do NOT use npx slidev — it fails to install the theme non-interactively. Always use the npm scripts.
From within a presentation folder:
cd presentations/talk-slug
npm run dev -- slides.md # Development server (opens browser)
To export:
cd presentations/talk-slug
npm run export -- slides.md # PDF
npm run export -- slides.md --format png # PNG per slide
npm run export -- slides.md --format pptx # PowerPoint
| File | When to Read |
|---|---|
baselines/headmatter.yaml | Starting any new presentation — full config reference |
baselines/slide-frontmatter.yaml | Need per-slide options beyond layout/class |
references/layouts.md | Need details on a specific layout or named slots |
references/syntax.md | MDC syntax, external imports, scoped styles, variables |
references/animations.md | Complex click sequences, v-motion, transitions |
references/code-features.md | Magic Move, Monaco editor, code snippets, runners |
references/diagrams-and-math.md | Mermaid config, PlantUML, KaTeX math |
references/components.md | Built-in components (Arrow, Toc, Tweet, etc.) |
references/styling.md | UnoCSS, dark mode, fonts, theme variables |
references/export-and-deploy.md | PDF/PPTX/PNG export, SPA deployment |
templates/talk-from-scratch.md | Building a conference talk |
templates/blog-post-conversion.md | Converting a blog post to slides |
templates/technical-demo.md | Code-heavy demonstrations |
templates/lightning-talk.md | Short 5-minute talks |
examples/blog-conversion-walkthrough.md | Seeing a full conversion example |
A complete 5-slide presentation:
---
theme: default
title: Why Tests Matter
author: Stacey Vetzal
transition: slide-left
---
# Why Tests Matter
A short talk on the value of automated testing
<!--
Welcome everyone. Today I want to share why I think testing is one of the
most important practices we can adopt as developers.
-->
---
layout: section
---
# The Problem
---
## We Ship Bugs
<v-clicks>
- Manual testing misses edge cases
- "It works on my machine" is not a deployment strategy
- Regression bugs erode user trust
</v-clicks>
<!--
We've all been there. You ship something, it passes QA, and then a customer
finds a bug in an edge case nobody thought to check.
-->
---
layout: quote
---
# "The first rule of testing is that untested code is broken code."
<!--
This mindset shift is what changed everything for me. If you assume untested
code is broken, you start writing tests before you write the code.
-->
---
layout: end
---
# Thank You
Start testing today.
For generating custom images (cover art, concept illustrations, backgrounds, section breaks), use the presentation-image-generator skill at .claude/skills/presentation-image-generator/. It produces images designed to integrate with Slidev's layout system and supports multiple visual styles.
npx slidev fails with theme not found: Do not use npx slidev. Use npm run dev -- slides.md from within a presentation folder — the shared presentations/package.json provides the dependencies. Run npm install in presentations/ if node_modules is missing.--- separators have blank lines above and belowlayout: is in the slide's frontmatter block, not the content<v-clicks> component and list items{1,3-5} syntax after the language identifierpublic/ directory, reference with / prefix (e.g., /images/photo.png)<!-- comment --> syntax at the end of each slide, press p in dev mode for presenter viewnpx claudepluginhub svetzal/guidelines --plugin stacey-voiceCreates Slidev presentations with markdown slides, Vue components, modular imports, layouts, themes, animations, code highlighting, and best practices for developers.
Guides Slidev slide syntax and structure: separators, frontmatter, layouts, MDC syntax, presenter notes, click animations, and transitions.
Creates reveal.js presentations with themes, multi-column layouts, code highlighting, animations, speaker notes, and custom styling. Generates HTML + CSS with no build step. Use for slides, decks, or slideshows.