home / skills / jykim / claude-obsidian-skills / markdown-slides

markdown-slides skill

/markdown-slides

This skill converts content into Deckset or Marp slides in Markdown, including images, speaker notes, and emoji enhancements for engaging presentations.

npx playbooks add skill jykim/claude-obsidian-skills --skill markdown-slides

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
11.5 KB
---
name: markdown-slides
description: Create presentation slides in Markdown format (Deckset/Marp compatible). Use when user requests to create slides, presentations, or convert documents to slide format. Handles image positioning, speaker notes, and proper formatting.
allowed-tools:
  - Read
  - Write
  - Glob
  - Bash
license: MIT
---

# Markdown Slides Skill

Convert content to presentation slides in Markdown format compatible with Deckset and Marp presentation tools.

## When to Use This Skill

Activate this skill when the user:
- Asks to create slides or a presentation
- Requests to convert a document to slide format
- Mentions Deckset or Marp
- Wants to generate speaker notes
- Needs to format images for presentations

## Input Requirements

- **Source content**: Markdown file, outline, or structured content
- **Images**: Files in `_files_/` directory or paths to be resolved
- **Target platform**: Deckset (default) or Marp
- **Options**:
  - Speaker notes (enabled by default)
  - Slide numbering (optional frontmatter)
  - Emoji enhancement (enabled by default)

## Output Specifications

- **File location**: Same folder as source
- **File naming**: Original name with `- slides` suffix
  - Example: `document.md` โ†’ `document - slides.md`
- **Format**: Deckset-compatible markdown
- **Structure**: Proper slide dividers, image tags, speaker notes
- **Enhancement**: Emojis added for visual appeal

## Main Process

### Step 1: Slide Structure Setup

**Objective**: Create logical slide divisions with proper hierarchy

**Actions**:
1. Read and analyze source content structure
2. Insert slide dividers (`---`) at logical breaks:
   - Between major sections
   - Between distinct topics
   - After section intro slides
   - Before/after major diagrams
3. Maintain content hierarchy:
   - H1 (`#`) for section titles
   - H2 (`##`) for main slide titles
   - H3 (`###`) for sub-topics
4. Preserve original organization and flow
5. Add optional frontmatter: `slidenumbers: true`

**Example**:
```markdown
slidenumbers: true
# 1. Section Title ๐ŸŽฏ

![](section-background.png)

^ Introduction to this section.

---

## Main Topic ๐Ÿ“Š

Content here...

---

### Detailed Subtopic

More details...
```

### Step 2: Image Format Conversion

**Objective**: Convert images to Deckset format with proper positioning

**Critical Requirements**:
โš ๏ธ **MUST resolve relative paths per-image basis**
โš ๏ธ **MUST URL-encode spaces and escape special characters**
โš ๏ธ **MUST verify image files exist**

**Image Position Formats**:

| Format | Usage | Example |
|--------|-------|---------|
| `![]()` | Section intro backgrounds | `![](background.png)` |
| `![inline]()` | Diagrams within text flow | `![inline](diagram.svg)` |
| `![right fit]()` | **PRIMARY**: Content slides | `![right fit](chart.png)` |
| `![right 80%]()` | Specific sizing needed | `![right 80%](image.png)` |
| `![inline fill]()` | Full-width inline | `![inline fill](wide.png)` |

**Actions**:
1. Identify all image references in source
2. For each image:
   ```
   a. Determine appropriate position format
   b. Resolve relative path from slide file location
   c. URL-encode spaces: " " โ†’ "%20"
   d. Escape parentheses: "(" โ†’ "%28", ")" โ†’ "%29"
   e. Verify file exists at resolved path
   f. Use original images when available
   g. Copy missing images to _files_/ directory
   ```
3. Apply positioning based on context:
   - **Section intros**: Use `![]()` for full background
   - **Diagrams in text**: Use `![inline]()`
   - **Default for content slides**: Use `![right fit]()` โญ
   - **Custom sizing**: Use `![right XX%]()` when needed
   - **Full-width inline**: Use `![inline fill]()` for wide images

**Examples**:
```markdown
# Section Title
![](background-image.png)

---

## Content Slide
Key points here:
- Point 1
- Point 2

![right fit](diagram.png)

---

## Inline Diagram
Text before diagram.

![inline](process-flow.svg)

Text after diagram.
```

### Step 3: Speaker Notes Conversion

**Objective**: Convert appropriate content to speaker notes

**Format**: Lines starting with `^ ` (caret + space)

**Placement**: At the end of each slide

**Convert to speaker notes**:
โœ… Multi-sentence paragraphs
โœ… Explanatory text
โœ… Additional context
โœ… Talking points

**DO NOT convert**:
โŒ Single-sentence paragraphs
โŒ Lists (bullet or numbered)
โŒ Block quotes
โŒ Sentences ending with colon (`:`)
โŒ Headers (H1, H2, H3)
โŒ Table content

**For Marp platform**: Use HTML comments instead
```markdown
<!-- This is a speaker note for Marp -->
```

**Examples**:
```markdown
## Slide Title

Main content visible to audience.

^ This paragraph becomes a speaker note because it's multi-sentence explanatory text. It provides context that the speaker needs but the audience doesn't need to read on the slide.

---

## Another Slide

- Bullet points stay visible
- Not converted to notes

^ Additional speaking points go here.
```

### Step 4: Content Enhancement

**Objective**: Polish the presentation for maximum impact

**Actions**:
1. **Add emojis** to section and slide titles:
   - Use relevant emojis that enhance meaning
   - Don't overuse - keep it professional
   - Examples: ๐ŸŽฏ๐Ÿ“Š๐Ÿค–๐Ÿ’ก๐Ÿš€๐Ÿ“š๐Ÿ”งโšก

2. **Clean up comments**:
   - Remove markdown comments not meant for slides
   - Remove TODO items
   - Remove internal notes

3. **Ensure clean format**:
   - Consistent spacing
   - Proper header hierarchy
   - Clear slide breaks

4. **Add frontmatter** (if requested):
   ```markdown
   slidenumbers: true
   ```

5. **Final review**:
   - Each slide has clear focus
   - Images positioned correctly
   - Speaker notes placed at end
   - No orphaned content

## Critical Guidelines

### Image Handling

โš ๏ธ **CRITICAL RULES**:

1. **NEVER invent images** - Only reference images that exist in the source document or `_files_/` folder. Do NOT create placeholder references like `background-xxx.png` for images that don't exist.
2. **Use original images** from source when available
3. **Copy missing images** to `_files_/` directory rather than substituting
4. **Resolve paths per-image** - don't assume same directory
5. **URL-encode spaces**: `my file.png` โ†’ `my%20file.png`
6. **Escape special characters**:
   - Parentheses: `(` โ†’ `%28`, `)` โ†’ `%29`
   - Other special chars as needed
7. **Verify existence** before referencing - run `ls` or glob to confirm file exists
8. **Maintain semantic relevance** - image should match slide content
9. **Section intros without images are OK** - If no background image exists for a section intro slide, just use the title and speaker notes without an image reference

### Image Position Standards

**Decision tree for image positioning**:

```
Is it a section intro slide with just title?
  โ†’ Does a background image exist?
    โ†’ YES: Use ![]() for full background
    โ†’ NO: Skip image, use title + speaker notes only

Is it a diagram embedded in flowing text?
  โ†’ YES: Use ![inline]() or ![inline fill]()

Is it the main visual for the slide with bullet points?
  โ†’ YES: Use ![right fit]() โญ PRIMARY FORMAT

Does it need specific sizing?
  โ†’ YES: Use ![right 80%]() or other percentage
```

### Speaker Notes Rules

**When to convert to speaker notes**:
- Multi-sentence explanatory paragraphs
- Contextual information not needed on slide
- Talking points for the speaker
- Additional details for verbal explanation

**When NOT to convert**:
- Single-sentence paragraphs (might be slide content)
- Bullet or numbered lists (usually slide content)
- Block quotes (usually featured content)
- Sentences ending with `:` (usually introducing lists)
- Any header level
- Table content

**Format**:
```markdown
Slide content here.

^ Speaker note paragraph one. Can be multiple sentences providing context.

^ Speaker note paragraph two. Each note paragraph gets its own ^ prefix.
```

### Content Standards

1. **File Naming**:
   - Always use `- slides` suffix
   - Preserve original filename otherwise
   - Example: `AI for PKM.md` โ†’ `AI for PKM - slides.md`

2. **Emoji Usage**:
   - Add to H1 and H2 headers
   - Choose relevant, professional emojis
   - Don't overuse - quality over quantity
   - Examples:
     - ๐ŸŽฏ Goals/Objectives
     - ๐Ÿ“Š Data/Charts
     - ๐Ÿค– AI/Technology
     - ๐Ÿ’ก Ideas/Insights
     - ๐Ÿš€ Future/Launch
     - ๐Ÿ“š Learning/Knowledge

3. **Hierarchy**:
   - H1 for major sections (usually numbered)
   - H2 for main slide titles
   - H3 for subtopics within slides
   - Consistent numbering scheme

4. **Slide Breaks**:
   - Use `---` (three dashes) on its own line
   - Blank line before and after recommended
   - Logical breaks between topics

## Platform-Specific Notes

### Deckset (Default)

**Format**:
- Speaker notes: `^ ` prefix on each line
- Image positioning: All formats fully supported
- Frontmatter: Simple key-value pairs

**Features**:
- Automatic slide numbering with `slidenumbers: true`
- Full control over image positioning
- Rich presenter notes support

**Example Frontmatter**:
```markdown
slidenumbers: true
autoscale: true
theme: Plain Jane, 3
```

### Marp (Optional)

**Format**:
- Speaker notes: HTML comments `<!-- speaker note -->`
- Image positioning: May use different syntax
- Frontmatter: YAML with `marp: true`

**Conversion for Marp**:
```markdown
---
marp: true
paginate: true
---

<!-- This is a speaker note in Marp -->
```

**Differences**:
- HTML comments instead of `^` prefix
- Different frontmatter structure
- May need `![bg]()` for backgrounds instead of `![]()`

## Quality Checklist

Before marking task complete, verify:

- [ ] **No invented images** - every image reference points to a real file
- [ ] All images have valid, URL-encoded paths
- [ ] Image files exist at specified locations (run `ls` to confirm)
- [ ] Spaces in paths converted to `%20`
- [ ] Special characters properly escaped
- [ ] Speaker notes use `^ ` prefix (or HTML for Marp)
- [ ] Speaker notes placed at END of each slide
- [ ] Slide dividers (`---`) at logical breaks
- [ ] Consistent header hierarchy (H1 โ†’ H2 โ†’ H3)
- [ ] Emojis added appropriately to titles
- [ ] File saved with '- slides' suffix
- [ ] Content hierarchy maintained from source
- [ ] No orphaned content or broken sections
- [ ] Internal comments removed
- [ ] Frontmatter added if requested

## Error Handling

### Missing Images
**Problem**: Source references image that doesn't exist

**Solution**:
1. Check source `_files_/` directory
2. Check parent directory `_files_/`
3. Search for image by name in project
4. If found: Copy to presentation `_files_/` directory
5. If not found: Note in speaker notes and skip image

### Broken Relative Paths
**Problem**: Path doesn't resolve correctly

**Solution**:
1. Determine slide file location
2. Calculate relative path from slide to image
3. Test path resolution
4. URL-encode the working path

### Invalid Characters in Paths
**Problem**: Special characters break image links

**Solution**:
- Spaces: Convert to `%20`
- Parentheses: `(` โ†’ `%28`, `)` โ†’ `%29`
- Brackets: `[` โ†’ `%5B`, `]` โ†’ `%5D`
- Other special chars: Use URL encoding

## Tips for Best Results

1. **Start with outline**: Create clear section and slide structure first
2. **One idea per slide**: Each slide should have single clear message
3. **Visual hierarchy**: Use H1 for sections, H2 for slides, H3 for sub-points
4. **Image positioning**: Default to `![right fit]()` for content slides
5. **Speaker notes**: Add context that helps speaker but clutters slide
6. **Emoji consistency**: Use similar emojis for similar concepts
7. **Test in Deckset**: Preview the slides to verify formatting
8. **Iterate**: First pass for structure, second for polish

Overview

This skill converts source content into clean, presentation-ready Markdown slides compatible with Deckset and Marp. I produce properly divided slides, position images, and extract speaker notes while preserving the original content hierarchy. Output files are saved alongside the source with a "- slides" suffix and optional frontmatter like slide numbers.

How this skill works

I parse the source Markdown or outline, insert logical slide dividers (---), and map headers to H1/H2/H3 for sections, slides, and subtopics. I resolve and verify each image path, URL-encode and escape special characters, and apply Deckset/Marp positioning formats (e.g., ![right fit]()). Multi-sentence explanatory paragraphs are converted to speaker notes (^ prefix for Deckset; HTML comments for Marp). I then polish titles with selective emojis, remove internal comments, and add frontmatter if requested.

When to use it

  • When you need to create a slide deck from Markdown, outline, or a document.
  • When converting content to Deckset or Marp-compatible slide format.
  • When slides require precise image placement, sizing, or path resolution.
  • When you want speaker notes extracted from explanatory paragraphs.
  • When you need consistent header hierarchy and slide breaks added automatically.

Best practices

  • Start with a clear outline and one main idea per slide.
  • Keep images only if files exist; I will not invent images for you.
  • Use H1 for sections, H2 for slide titles, H3 for subpoints to preserve hierarchy.
  • Default to ![right fit]() for content slides and ![]() for section backgrounds.
  • Enable speaker notes for multi-sentence explanations; keep lists on-slide.

Example use cases

  • Turn a long Markdown article into a concise Deckset presentation with speaker notes.
  • Prepare a product roadmap deck from an outline, with charts positioned right-fit.
  • Convert a technical document into training slides and extract talking points.
  • Polish slides for a conference by adding emojis, slide numbers, and frontmatter.
  • Migrate content for Marp by switching speaker-note format to HTML comments.

FAQ

Will you create image files that are missing?

No. I never invent images. If an image is missing I search the project, copy existing matches to the presentation _files_/ folder, or note the absence and skip the image.

How are speaker notes formatted for Deckset and Marp?

Deckset speaker notes use a caret and space (^ ) at the end of each slide. Marp uses HTML comments (<!-- note -->). I convert multi-sentence explanatory paragraphs only, leaving lists and headers on-slide.