Install
openclaw skills install open-slideCreate, edit, preview, and export web-native slide decks with the open-slide React framework.
openclaw skills install open-slideopen-slide is a slide framework built for agents. You write React components on a fixed 1920×1080 canvas; the framework handles scaling, navigation, hot reload, present mode, and export. Every slide is a file — versioned, reviewable, yours.
This OpenClaw skill is an independent companion for the upstream open-slide framework at https://github.com/1weiho/open-slide. It does not vendor or replace open-slide; it guides agents to use the upstream framework and CLI.
If the user explicitly needs a .pptx file for PowerPoint compatibility, use a PowerPoint/PPTX workflow instead of open-slide.
{baseDir}/requirements.txt when exporting.Check availability before exporting:
python3 -m pip install -r {baseDir}/requirements.txt
python3 -m playwright install chromium
Check Node.js availability before starting:
node --version
pnpm --version # or: npm --version
If Node.js, Python 3, and at least one package manager are not available, tell the user what is missing before continuing.
# Prefer pnpm when available; otherwise use npm/npx.
pnpm dlx @open-slide/cli init <deck-name>
# or:
npx @open-slide/cli init <deck-name>
cd <deck-name>
pnpm install # or npm install
This creates:
<deck-name>/
├── slides/
│ └── getting-started/
│ └── index.tsx # starter slide
├── themes/ # optional shared themes
├── open-slide.config.ts # framework config
├── AGENTS.md # agent rules
└── package.json
Keep track of the deck path — all subsequent commands run from there.
Before writing any code, read the authoring reference at {baseDir}/references/authoring.md for the file contract, canvas rules, vertical budget math, type scale, design system, and anti-patterns.
List files under themes/ in the deck root. If theme markdown files exist, ask the user which theme to use (or "no theme — design from scratch"). Read the chosen theme file end-to-end — its palette, typography, and layout are now authoritative.
Before writing any code, lock in these decisions if not already provided. Ask users:
Only skip a question when the user's original request already gave an unambiguous answer — and restate your assumption so they can correct it.
Kebab-case, short, descriptive. Examples: rust-intro, q2-roadmap, team-offsite-2026. Check slides/ to avoid collisions.
Sketch the slide as a list of page roles:
| Role | Purpose |
|---|---|
| Cover | Title + subtitle, strong visual |
| Agenda | What's coming (3–5 items) |
| Section divider | Big label between chapters |
| Content | Heading + 2–5 bullets OR heading + one visual |
| Big number | One statistic the size of the canvas |
| Quote | Pull-quote with attribution |
| Comparison | Two-column before/after or A vs B |
| Closing | CTA, thanks, contact |
One idea per page. If you're tempted to put two, split them.
Share the outline with the user for quick confirmation before writing code.
slides/<id>/index.tsxFollow the authoring reference in {baseDir}/references/authoring.md. Key points:
export const design: DesignSystem = { … } at the top — this makes the slide tweakable from the Design panel.var(--osd-X) CSS variables for visual properties (bg, text, accent, fonts, sizes).<ImagePlaceholder> from @open-slide/core only when a real image the user must supply is genuinely needed (product screenshots, team photos, data charts) — not for decoration.react and standard web APIs. No extra npm packages.Run the checklist in {baseDir}/references/authoring.md before finishing.
When the environment can run a browser, automatically create a visual artifact:
{baseDir}/scripts/export_pdf.py..pdf absolute path to the user.dist/) zipped for hosting.Open slides/<id>/index.tsx and modify the React code. This is the most common workflow — you're just editing code. Always re-verify the vertical budget after changes.
When the user has used the inspector in the browser and has @slide-comment markers in the source:
slides/ for @slide-comment markers@slide-comment marker after applyingcd <deck-path>
pnpm dev # starts on http://localhost:5173
The dev server gives you:
i to toggle; click any element to see/edit propertiesTo visually verify a slide, use an appropriate browser tool to open http://localhost:5173 and take a screenshot.
cd <deck-path>
pnpm build # static build to dist/
open-slide currently has no built-in CLI PDF command. Use the bundled export script, which enters Present mode before capturing to get clean slides without editor chrome:
# Start dev server first
cd <deck-path>
pnpm dev
# In another shell, export to PDF
python3 {baseDir}/scripts/export_pdf.py \
--url http://localhost:5173/s/<slide-id> \
--pages <page-count> \
--out /tmp/deck.pdf
⚠️ Critical: always use Present mode. The editor view (/s/<id>) includes navbars and sidebars. The export script presses F to enter Present mode and hides remaining controls via CSS before screenshotting. Never screenshot the editor view directly for PDF output.
dist/ folder can be zipped and sent, or deployed to any static host (Vercel, Cloudflare Pages, Netlify, etc.)If the user plans multiple decks with a consistent look:
themes/<id>.md with palette, typography, voice, and layout vocabulary{baseDir}/references/authoring.md for the templateconst Cover: Page = () => (
<div style={{
...fill, background: 'var(--osd-bg)', color: 'var(--osd-text)',
display: 'flex', flexDirection: 'column',
justifyContent: 'center', padding: '0 160px',
}}>
<h1 style={{
fontFamily: 'var(--osd-font-display)',
fontSize: 'var(--osd-size-hero)',
fontWeight: 900, lineHeight: 1.05,
}}>
Title
</h1>
<p style={{ fontSize: 'var(--osd-size-body)', color: muted }}>
Subtitle
</p>
</div>
);
const Content: Page = () => (
<div style={{
...fill, background: 'var(--osd-bg)', color: 'var(--osd-text)', padding: 120,
}}>
<h2 style={{
fontFamily: 'var(--osd-font-display)', fontSize: 80, fontWeight: 800, margin: 0,
}}>
Section Title
</h2>
<ul style={{
fontSize: 'var(--osd-size-body)', lineHeight: 1.6, marginTop: 64, paddingLeft: 48,
}}>
<li>One clear point per line</li>
<li>Keep to 3–5 bullets</li>
<li>Let the space breathe</li>
</ul>
</div>
);
@open-slide/core types: Make sure pnpm install ran successfully.width: '100%' and height: '100%' on its root div.git config --global user.email and git config --global user.name, then init the git repo manually.page.pdf() does not render CSS backgrounds by default, so dark-themed slides appear blank. Use the screenshot-based export script (scripts/export_pdf.py) instead — it takes PNG screenshots and converts them to PDF via Pillow, which preserves backgrounds correctly./s/<id>) directly for PDF output — it includes sidebars, thumbnail rails, and toolbar. Always enter Present mode first (press F), then hide remaining controls with CSS injection before capturing.