Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Converts a markdown deck (slides separated by `---` HR boundaries or by `# ` H1 headings, with optional `<!-- notes: ... -->` presenter notes blocks) into a single-file HTML presentation with arrow-key / space / PgDn / PgUp / Home / End / P / Esc keyboard navigation, presenter mode (split view with current slide + speaker notes + clock + next-slide preview), URL-hash deep linking, and `@media print` page-per-slide for PDF export. Triggers when the markdown-html-orchestrator classifies an input a
.claude/skills/itamarzand88-md-slides/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | -56% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 93% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -25% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -47% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 154% | 0% |
<!-- source: md-slides-html — https://raw.githubusercontent.com/alirezarezvani/claude-skills/main/markdown-html/skills/md-slides/SKILL.md -->
The slide-deck converter. Reads a markdown deck (HR or H1 boundaries, optional presenter notes), emits a single-file HTML presentation that runs in any browser with keyboard navigation, presenter mode, and print-to-PDF.
Three stdlib tools pipeline together:
slide_splitter.py → presenter_notes_parser.py → deck_html_renderer.py
(md → ordered (extract <!-- notes: (slides + design-system
slides with --> blocks, attach tokens → single-file
titles) per slide) HTML with keyboard nav)| Symptom | Action | |---|---| | markdown-html-orchestrator routes input as SLIDES | Invoke this skill | | User runs /cs:md-slides <path>.md directly | Invoke this skill | | Input has 3+ --- HR lines OR 5+ H1 headings with short bodies | Invoke this skill | | Input is a long-form spec | Route to md-document instead | | Input is a code review | Route to md-review instead | | Input has no clear slide boundaries | Refuse, route to md-document | | Input would produce 1 slide | Refuse (it's a poster) |
bash# 1. Split slides on --- or H1 (auto-detect by default) python3 markdown-html/skills/md-slides/scripts/slide_splitter.py \ --input <path>.md --output /tmp/slides.json # 2. Extract <!-- notes: ... --> blocks from each slide python3 markdown-html/skills/md-slides/scripts/presenter_notes_parser.py \ --slides /tmp/slides.json --output /tmp/deck.json # 3. Render single-file HTML deck python3 markdown-html/skills/md-slides/scripts/deck_html_renderer.py \ --slides /tmp/deck.json --title "My Talk" --output deck.html
<section class="slide"> — one visible at a time, controlled by JS→ / Space / PgDn advance; ← / PgUp previous; Home/End jump; P presenter mode; Esc exits presenter#3 jumps to slide 3; browser back/forward walks slides; share deck.html#5 to send someone directly thereCmd+P produces a PDF with one slide per page@media (prefers-reduced-motion: reduce) honored--strict-notes refuses < 50% notes coverage. A deck where most slides have no notes isn't set up for presenter mode. Exit 7.--syntax.---) or H1 boundaries? Recommended: HR for typical decks; H1 for outline-driven decks. Canon: Marp / reveal.js / pandoc convergence.--syntax needed? Recommended: only for decks with substantial code blocks. Default off. Canon: single-file shareability discipline.md-document — that's one continuous document. This is N discrete slides.md-review — that renders diff hunks + annotations. This renders prose slides.marketing/landing/ — that's a landing page, not a deck.{default_output_dir}/deck-{slug}.html (path resolved by orchestrator's output_path_resolver.py; collision suffix -2, -3, … by default).
references/ for full citations (presentation_ux, keyboard_nav_patterns, single_file_deck_conventions)| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | fail→pass | 29,782 | 6,052 | -80% | 1 | 1 | 0% | 6,177 | 2,701 | -56% | 0 | 0 | — |
case-01 | fail→fail | 27,139 | 4,581 | -83% | 1 | 1 | 0% | 6,193 | 1,813 | -71% | 0 | 0 | — |
case-02 | fail→fail | 24,702 | 5,542 | -78% | 1 | 1 | 0% | 6,194 | 1,900 | -69% | 0 | 0 | — |
case-03 | fail→fail | 27,180 | 4,541 | -83% | 1 | 1 | 0% | 6,188 | 1,856 | -70% | 0 | 0 | — |
case-04 | fail→pass | 7,089 | 4,612 | -35% | 1 | 1 | 0% | 1,245 | 2,401 | +93% | 0 | 0 | — |
case-05 | fail→pass | 15,587 | 5,314 | -66% | 1 | 1 | 0% | 3,354 | 2,514 | -25% | 0 | 0 | — |
case-07 | fail→pass | 20,100 | 6,699 | -67% | 1 | 1 | 0% | 5,336 | 2,830 | -47% | 0 | 0 | — |
case-08 | fail→pass | 4,040 | 2,606 | -35% | 1 | 1 | 0% | 824 | 2,096 | +154% | 0 | 0 | — |
case-09 | fail→pass | 8,378 | 3,635 | -57% | 1 | 1 | 0% | 1,602 | 2,225 | +39% | 0 | 0 | — |
case-10 | pass→pass | 5,015 | 1,184 | -76% | 1 | 1 | 0% | 1,001 | 1,752 | +75% | 0 | 0 | — |
case-11 | pass→pass | 3,521 | 1,475 | -58% | 1 | 1 | 0% | 696 | 1,814 | +161% | 0 | 0 | — |
case-12 | fail→pass | 8,212 | 6,799 | -17% | 1 | 1 | 0% | 1,757 | 2,873 | +64% | 0 | 0 | — |
case-13 | fail→pass | 5,968 | 1,696 | -72% | 1 | 1 | 0% | 1,224 | 1,807 | +48% | 0 | 0 | — |
case-14 | fail→pass | 5,155 | 1,850 | -64% | 1 | 1 | 0% | 996 | 1,907 | +91% | 0 | 0 | — |
case-15 | fail→pass | 12,145 | 4,694 | -61% | 1 | 1 | 0% | 2,432 | 2,402 | -1% | 0 | 0 | — |
case-16 | fail→pass | 10,190 | 1,726 | -83% | 1 | 1 | 0% | 1,866 | 1,822 | -2% | 0 | 0 | — |
case-17 | pass→pass | 2,243 | 2,118 | -6% | 1 | 1 | 0% | 465 | 1,873 | +303% | 0 | 0 | — |
case-18 | fail→pass | 19,899 | 2,082 | -90% | 1 | 1 | 0% | 1,602 | 2,004 | +25% | 0 | 0 | — |
case-19 | fail→pass | 10,677 | 1,990 | -81% | 1 | 1 | 0% | 2,149 | 1,919 | -11% | 0 | 0 | — |
case-20 | fail→pass | 8,598 | 2,631 | -69% | 1 | 1 | 0% | 1,871 | 2,135 | +14% | 0 | 0 | — |
case-21 | pass→pass | 7,333 | 2,454 | -67% | 1 | 1 | 0% | 1,424 | 1,991 | +40% | 0 | 0 | — |
case-22 | fail→pass | 5,591 | 1,409 | -75% | 1 | 1 | 0% | 1,210 | 1,784 | +47% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +68 percentage points is the difference between those two pass rates over the 18 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.