liustack/pptpress
Stable, editable PPTX generation for AI agents — semantic IR in, native DrawingML out. DSH plugin + Claude Code plugin + CLI. | 给 AI agent 的稳定可编辑 PPTX 生成:语义 IR 进,原生 DrawingML 出。DSH 插件 / Claude Code 插件 / CLI。
项目介绍Project Overview
pptpress 是 DeepSeek Harness 的原生 PPT 生成插件,通过 JSON 中间表示描述幻灯片,调用 validate、render、preview 等命令即可输出可编辑的 PPTX 文件,所有文本、形状在 PowerPoint 中均可直接修改。适合需要 AI 辅助快速产出品牌一致演示稿的用户。注意:图表和表格数字需让 AI 重建页面才能更新;渲染需 Node 22.19+ 或 Bun。
pptpress is a native DeepSeek Harness plugin that turns a JSON IR into an editable PPTX, handling layout, theme, and typography. It supports validate, render, preview, serve, and audit commands, with 24 built-in themes and brand extraction. Install with one command on DSH or as a skill folder for other agents. Note: chart and table numbers require the AI to rebuild the page; rendering needs Node 22.19+ or Bun.
安装Install
npx -y @deepseek-ai/dsh plugin --profile web add @liustack/pptpress@0.21.0
把 liustack/pptpress 加入你的 DSH 配置(web profile)即可启用。
READMEREADME

pptpress
Make your deck in minutes, not hours.
🥇 The FIRST deck-generation plugin for DeepSeek Harness (dsh) 🥇
简体中文 · Install (hand it to your AI) · Commands · IR · Themes · Agent skill · ModLens (vision)
Talk to us
Issues are welcome any time. Open one, or follow @liustack on X. Share what you made with pptpress, which harness you use, and what the next release should solve. New releases land there first.
Highlights
⚡ Tell your AI what to cover, get the deck. You bring the content, the engine handles layout, color, type size, and spacing. The same content renders the same deck every time, so there is nothing to redo and no luck involved.
✏️ A real deck, not a picture of one. Every heading, bullet, and chart bar opens in PowerPoint for you to retype and restyle. Chart and table figures are the exception: to change the numbers, have your AI rebuild that page. 24 ready-made styles, and you can pull the colors and fonts out of a deck your company already uses.
🔌 Installs into the agent you already use. One command puts pptpress into DeepSeek Harness, Claude Code, or any agent that reads a skill folder (Codex and friends), and it knows how to build a deck the moment it lands.
🔁 Revisions without describing everything again. One command opens a live preview in your browser. Tell your AI what to change in plain words — the page refreshes itself as each revision lands.
🔒 No account, no API key to render, no network at render time. Install it and it works. Node 22.19+ or Bun is all you need on the machine. Optional stock-photo search uses the user's own Pexels key.
Install
Step 1, hand it to your AI. Send it this line:
Install the pptpress deck skill following https://raw.githubusercontent.com/liustack/pptpress/main/INSTALL.md, then run the health check and tell me the result.
There is no step 2. Your AI puts the skill folder where your harness reads it, and the skill brings its own version-pinned launcher, so there is no CLI to install by hand. pptpress renders a PPTX entirely locally: no API key, no account, nothing to configure for render. Optional stock-photo search needs the user's own Pexels key. The only prerequisite is Node 22.19+ (or Bun).
On DeepSeek Harness, it is one command instead. pptpress is a native DSH plugin there, not a skill folder:
npx -y @deepseek-ai/dsh plugin --profile web add @liustack/pptpress@0.21.0
Name the version. Without it, the install quietly lands on an older release and you miss the newest features. npm view @liustack/pptpress version prints the current one. The plugin card shows up as "pptpress", registers the deck-generation skill, and carries the CLI inside its own package. Uninstalling removes the skill with no residue.
Quick start
An IR is one JSON file describing the whole deck. Write a minimal one, then run the validate → render → preview loop:
cat > deck.json <<'EOF'
{
"filename": "hello.pptx",
"theme": { "id": "consulting" },
"slides": [
{ "type": "cover", "heading": "Hello pptpress", "subheading": "A first deck in ten minutes" },
{ "type": "content", "heading": "Why it works", "components": [
{ "type": "bullets", "items": ["Semantic IR in", "Native DrawingML out", "Every shape stays editable"] } ] },
{ "type": "ending", "heading": "Thanks" }
]
}
EOF
pptpress validate deck.json # → OK — 3 slides, theme "consulting"
pptpress render deck.json -o out/hello.pptx # → wrote out/hello.pptx (3 slides, ~24 KB)
pptpress render deck.json -o out/tech.pptx --theme tech # same deck, different theme
pptpress preview deck.json -o out/svgs # SVG per slide, for a visual self-check
One shape rule: cover/chapter/ending slides are heading + subheading only, components live on content slides. validate says exactly this if you mix them up.
No install at all also works: npx -y @liustack/pptpress validate deck.json. In a source checkout, node dist/cli.js replaces pptpress, and examples/ has ready-made IR files to try.
The commands you will reach for most:
| Command | Does |
|---|---|
validate <target> |
Check the IR, with page numbers on every error |
render <target> [-o <https://github.com/liustack/pptpress/blob/HEAD/out.pptx>] [--theme <id>] |
Render a .pptx. Omit -o to write .pptpress/<deck>/<deck>.pptx |
preview <target> [-o <dir>] [--html] |
One SVG per slide, plus a self-contained review page. Omit -o to write .pptpress/<deck>/ |
serve <target> |
Live preview that reloads on every change |
audit <target> |
Geometry review: overflow, out-of-bounds, low contrast, overlap |
themes |
List the built-in themes |
doctor |
Check the install: runtime, skill copies, optional capabilities, self-test render |
Full reference: docs/cli.md.
Documentation
| Doc | Read it when |
|---|---|
| Install guide | Handing installation to an agent or checking prerequisites |
| Agent skill | Learning the workflow pptpress teaches an agent |
| CLI manual | Looking up commands, flags, audits, previews, and health checks |
| IR reference | Writing a deck, slide, component, or narrative in JSON |
| Themes | Picking a built-in theme or extracting your own brand |
| Core concepts | Understanding themes, layouts, components, narratives, and capacity |
| Architecture | Working on the render chain or adding a theme, layout, or component |
| Deck projects | Building a multi-file deck with locked specs, assets, and live review |
| Layout selection and seed | Explaining why a layout was picked or keeping revisions stable |
| Contrast system | Debugging text color, painted backgrounds, or contrast findings |
| Designing themes | Drawing a theme redesign that can actually compile to PPTX |
| Testing | Running the right gate, inspecting snapshots, or changing exported XML |
| Internal API | Understanding why the JavaScript internals carry no semver promise |
| Release guide | Preparing and publishing an npm release |
| CHANGELOG | Finding what changed in a version |
Credits
Icon primitives are extracted from lucide (ISC License). pptpress itself was extracted from a production AI-deck-generation system and CJK-typography-tuned (full-width punctuation width, Chinese line breaking, a Chinese-first font stack, explicit east-asian font-slot declarations) from day one.
ruvnet/ruflo
amruthpillai/reactive-resume
volcengine/OpenViking
Molunerfinn/PicGo
titanwings/colleague-skill
nocobase/nocobase
Tencent/WeKnora