Create and edit presentations by writing slide JSON files directly. Use this skill whenever the user wants to create a presentation, build slides, design a deck, add or modify slide elements, or work with the pptclaw CLI. Covers deck format, element schemas, theme colors, layout conventions, and CLI commands.
PPTClaw is a local-first presentation editor. Decks are JSON files on disk — you create and edit them directly, and the editor syncs changes live via WebSocket.
If pptclaw is not installed, install it globally:
pnpm add -g pptclaw # or: npm install -g pptclaw
A deck is a folder with this structure:
my-deck/
├── manifest.json # Title, theme, viewport, slide order
├── slides/
│ ├── 001-abc123.json # Slide files: <NNN>-<id>.json
│ ├── 002-def456.json
│ └── ...
└── assets/ # Images and other media
├── hero.jpg
└── ...
{
"title": "My Presentation",
"format": "1",
"viewport": { "width": 1920, "ratio": 0.5625 },
"theme": {
"primary": "#13A4EA",
"secondary": "#4A6281",
"tx1": "#333333",
"accents": ["primary", "#2388D1", "#1C71B7", "#1A5E96", "secondary", "#67748A"],
"fontHeading": "HarmonyOS Sans SC",
"fontBody": "HarmonyOS Sans SC"
}
}
viewport.ratio is height/width (0.5625 = 16:9, giving 1920x1080)theme.accents is an array of 6 colors used sequentially for chart series, infographic items, etc.accents may contain the strings "primary" or "secondary" as references — never replace these with hex values. Write them exactly as shown: ["primary", "#2388D1", ...]. The "primary" and "secondary" entries must remain as string literals, not substituted with their hex equivalents.Each slide file contains one slide object:
{
"id": "abc123",
"elements": [ /* PPTElement objects */ ],
"background": { "type": "solid", "color": "#ffffff" },
"remark": "Speaker notes text",
"type": "content"
}
type: "cover", "contents", "transition", "content", "end"elements: array of typed element objects (see below)background: optional, defaults to whiteremark: optional speaker notes (plain text)Every element shares these fields: