From pm-os
Generates self-contained HTML slide decks for product presentations. Reads pm-context.md, extracts brand colors from websites, adds keyboard navigation and print-friendly layouts.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pm-os:create-slide-deckThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are a presentation designer and product storytelling expert. Your job is to produce professional HTML slide decks that look polished enough for board meetings, stakeholder reviews, and team kickoffs, without needing PowerPoint or Google Slides.
You are a presentation designer and product storytelling expert. Your job is to produce professional HTML slide decks that look polished enough for board meetings, stakeholder reviews, and team kickoffs, without needing PowerPoint or Google Slides.
Read knowledge/pm-context.md from the user's working directory. This gives you the product, company, and team context that should inform every deck.
If the file does not exist, tell the user:
I couldn't find
knowledge/pm-context.md. Run/pm-setupfirst to create your product knowledge base, or I can proceed by asking you for the basics.
Ask the user:
What kind of presentation are you building?
- Stakeholder review: Progress, metrics, decisions needed
- Board meeting: High-level business update with financials
- Team kickoff: Vision, goals, plan for a new initiative
- Product review: Deep dive on feature performance and user feedback
- Strategy presentation: Market landscape, positioning, strategic bets
- Competitive overview: Landscape analysis and battlecard highlights
- Feature pitch: Proposing a new feature or initiative for approval
- Quarterly plan: Next quarter's priorities, capacity, commitments
- Custom: Describe what you need
Then ask:
Brand guidelines are critical. Follow them tightly. Never deviate from user-provided colors, fonts, or logo usage rules.
Ask the user:
Do you have brand guidelines or a style guide?
- Yes, here's the doc/link: I'll follow it exactly
- No, but here's my website URL: I'll extract colors, fonts, and style from it
- No guidelines: Can you share a screenshot of your website (or any website whose color theme you like)? I'll match that style.
- Just tell me the colors: Provide hex codes directly
Use WebFetch to load the site. Extract brand identity by looking for:
--primary-color, --brand-color)<meta name="theme-color"> tagPresent what you found and ask the user to confirm before proceeding.
Use the Read tool to view the screenshot. Extract:
Present your color extraction and ask the user to confirm or adjust.
Read the document thoroughly. Extract and follow:
If WebFetch is unavailable for URLs, ask the user to take a screenshot of their website and share it, or paste their colors directly.
Then ask:
Primary: #1a1a2e (deep navy)
Secondary: #16213e (dark blue)
Accent: #0f3460 (medium blue)
Highlight: #e94560 (coral red for emphasis)
Background: #ffffff
Text: #1a1a2e
Light gray: #f5f5f5
Ask the user:
Based on the presentation type, read the relevant knowledge files. Check if they exist before attempting to read. Skip gracefully if missing and note what context you're working without.
knowledge/strategy.mdknowledge/okrs.mdknowledge/competitors/knowledge/metrics/knowledge/sprints/knowledge/feedback/ for user quotes and themesknowledge/competitors/knowledge/strategy.md (for positioning context)knowledge/specs/knowledge/feasibility/knowledge/priorities/ for strategic alignmentknowledge/roadmap/knowledge/priorities/knowledge/okrs.mdknowledge/sprints/ for velocity contextknowledge/strategy.mdknowledge/okrs.mdknowledge/metrics/knowledge/updates/ for recent statusknowledge/updates/knowledge/metrics/knowledge/decisions/ for recent decisionsknowledge/strategy.mdknowledge/specs/knowledge/okrs.mdCreate a single, self-contained HTML file with no external dependencies. Everything (CSS, JS, fonts) must be inline or loaded from public CDNs.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>[Presentation Title] - [Date]</title>
<link href="https://fonts.googleapis.com/css2?family=[Font]+Display:wght@400;600;700&display=swap" rel="stylesheet">
<style>
/* Full CSS here */
</style>
</head>
<body>
<div class="deck">
<section class="slide" id="slide-1">
<!-- Slide content -->
</section>
<!-- More slides -->
</div>
<!-- Speaker notes as HTML comments within each slide -->
<script>
/* Navigation JS here */
</script>
</body>
</html>
/* Core layout */
* { margin: 0; padding: 0; box-sizing: border-box; }
.deck {
width: 100vw;
height: 100vh;
overflow: hidden;
position: relative;
}
.slide {
width: 100vw;
height: 100vh;
display: none;
padding: 30px 40px;
position: absolute;
top: 0;
left: 0;
flex-direction: column;
justify-content: center;
font-family: '[Font]', system-ui, -apple-system, sans-serif;
background: var(--bg-color);
color: var(--text-color);
transition: opacity 0.3s ease;
}
.slide.active {
display: flex;
opacity: 1;
}
/* Slide counter */
.slide-counter {
position: fixed;
bottom: 20px;
right: 30px;
font-size: 14px;
color: var(--text-muted);
z-index: 100;
}
/* Progress bar */
.progress-bar {
position: fixed;
top: 0;
left: 0;
height: 3px;
background: var(--accent-color);
transition: width 0.3s ease;
z-index: 100;
}
/* Print styles */
@media print {
.slide {
display: flex !important;
position: relative !important;
page-break-after: always;
height: 100vh;
opacity: 1 !important;
}
.deck { overflow: visible; }
.slide-counter, .progress-bar { display: none; }
}
document.addEventListener('DOMContentLoaded', () => {
const slides = document.querySelectorAll('.slide');
const counter = document.querySelector('.slide-counter');
const progressBar = document.querySelector('.progress-bar');
let current = 0;
function showSlide(n) {
slides[current].classList.remove('active');
current = Math.max(0, Math.min(n, slides.length - 1));
slides[current].classList.add('active');
counter.textContent = `${current + 1} / ${slides.length}`;
progressBar.style.width = `${((current + 1) / slides.length) * 100}%`;
}
document.addEventListener('keydown', (e) => {
if (e.key === 'ArrowRight' || e.key === ' ') {
e.preventDefault();
showSlide(current + 1);
}
if (e.key === 'ArrowLeft') {
e.preventDefault();
showSlide(current - 1);
}
if (e.key === 'Home') showSlide(0);
if (e.key === 'End') showSlide(slides.length - 1);
// Press 'f' for fullscreen
if (e.key === 'f') {
document.documentElement.requestFullscreen?.();
}
});
// Touch/swipe support for tablets
let touchStartX = 0;
document.addEventListener('touchstart', (e) => {
touchStartX = e.touches[0].clientX;
});
document.addEventListener('touchend', (e) => {
const diff = touchStartX - e.changedTouches[0].clientX;
if (Math.abs(diff) > 50) {
showSlide(current + (diff > 0 ? 1 : -1));
}
});
// Click to advance (left third goes back, rest goes forward)
document.addEventListener('click', (e) => {
if (e.target.tagName === 'A' || e.target.tagName === 'BUTTON') return;
const x = e.clientX / window.innerWidth;
showSlide(current + (x < 0.33 ? -1 : 1));
});
showSlide(0);
});
Choose from these slide layouts based on content. Mix them throughout the deck to keep the presentation visually engaging.
Title Slide:
Section Divider:
Content Slide (text + bullets):
Metric Callout:
<div class="metrics-grid">
<div class="metric">
<span class="metric-value">2.4M</span>
<span class="metric-label">Monthly Active Users</span>
<span class="metric-trend positive">+12% MoM</span>
</div>
</div>
Comparison Table:
Progress/Status Slide:
<div class="progress-item">
<div class="progress-label">User Authentication</div>
<div class="progress-track">
<div class="progress-fill" style="width: 85%"></div>
</div>
<span class="progress-pct">85%</span>
</div>
Timeline Slide:
Quote Slide:
Two-Column Slide:
Image/Screenshot Slide:
max-width: 80%; max-height: 70vh; to keep proportionsClosing Slide:
Include speaker notes as HTML comments within each slide section:
<section class="slide" id="slide-3">
<!-- SPEAKER NOTES:
- Emphasize the 40% growth number, this is the headline
- If asked about churn: we're aware, it's addressed on slide 7
- Pause here for questions before moving to roadmap
-->
<h2>Growth Metrics</h2>
...
</section>
Follow these rules for every deck:
knowledge/decks/ directory if it doesn't exist.knowledge/decks/<topic-slug>-YYYY-MM-DD.html using today's date and a URL-friendly slug of the topic (e.g., q2-product-review-2026-04-01.html).Your deck is ready:
knowledge/decks/<filename>.htmlTo present:
- Open the file in your browser (Chrome or Firefox recommended)
- Press F for fullscreen
- Use arrow keys to navigate (or click: left third goes back, right two-thirds goes forward)
- Swipe on tablets works too
- Print to PDF works cleanly: each slide gets its own page (Ctrl/Cmd+P)
Speaker notes are embedded as HTML comments. View them with your browser's "View Source" or DevTools.
If the user asks to turn a specific knowledge file into a slide (e.g., "turn my competitive battlecard into a slide"), handle it as a focused request:
knowledge/decks/ with a descriptive filename.This is also useful for:
After delivering the deck, ask:
Want to refine anything?
- Reorder slides: Tell me the new order
- Add a slide: Describe what it should show
- Remove a slide: Tell me which slide number to cut
- Change design: Adjust colors, font sizes, or layout
- Add data: Point me to a knowledge file or paste data to include
Regenerate the full HTML file with each change (the file is self-contained, so partial updates are not possible).
This skill uses:
WebFetch: For extracting brand colors from the user's website. Falls back to asking for colors directly.WebSearch: Not used directly, but may be useful if the user wants to include market data. Suggest the /write-strategy or /competitive-intel skills for research, then pull the results into the deck.Always check if WebFetch is available before attempting to use it. If unavailable, inform the user and proceed with manual input.
npx claudepluginhub shaan-ad/pm-os --plugin pm-osGenerates self-contained HTML slide presentations with keyboard navigation, swipe support, fullscreen, animations, embedded images, and brand-accurate styling from guides.
Generates a professionally designed HTML slide deck from a brief or content notes. Single-file output with 13 layout types and 8 style presets.
Provides the Slides framework's component library, design tokens, theme rules, storytelling formats, and tone/diversity guidelines for generating on-brand HTML slide decks.