| name | typst |
| description | Use this skill whenever the user wants to create presentations, slide decks, or beautiful PPT files using Typst. Triggers include: any mention of 'Typst', '.typ', 'PPT', 'presentation', 'slide deck', 'beautiful slides', or requests to create professional presentations. Also triggers when user has a PDF or document they want to turn into a presentation, or when they mention 'beautiful-ppt'. This skill handles the COMPLETE workflow: content analysis via NotebookLM, design style selection, Typst slide generation with visual verification, and final PPT export. Use this skill even if the user just says "make me a presentation" or "프레젠테이션 만들어줘". Do NOT use for simple document typesetting without slides - use a simpler typst workflow for that.
|
Beautiful-PPT: Typst Presentation Creation Skill
Create stunning, professional presentations from any source material. This skill handles the complete
pipeline from content analysis to final PPT export, with built-in design system and visual quality verification.
Prerequisites
Typst Installation
brew install typst
cd /tmp && curl -sL "https://github.com/typst/typst/releases/download/v0.14.2/typst-x86_64-unknown-linux-musl.tar.xz" -o typst.tar.xz && tar -xf typst.tar.xz && cp typst-x86_64-unknown-linux-musl/typst /usr/local/bin/
If which typst succeeds, skip installation.
Python Dependencies
pip install python-pptx
NotebookLM CLI (Required for PDF source analysis)
npm install -g notebooklm-cli
Complete Workflow
Follow these steps in order. The workflow is designed to produce high-quality results through
structured content analysis, thoughtful design selection, and rigorous visual verification.
Phase 1: Content Analysis via NotebookLM
If the user provides a PDF or document as source material:
-
Compile source to PDF (if typst source):
typst compile source.typ source.pdf
-
Create NotebookLM notebook from the source:
- Use the notebooklm skill at
.claude/skills/notebooklm/
- All scripts MUST be run via:
python scripts/run.py [script]
- Check auth:
python scripts/run.py auth_manager.py status
- The user needs to manually upload the PDF to NotebookLM
- Add notebook to library after upload
-
Extract key content by querying the notebook:
python scripts/run.py ask_question.py --question "Summarize the main topics, key points, and structure of this document. List all major sections and their key takeaways." --notebook-url "[URL]"
-
Follow-up queries to fill gaps in understanding before proceeding to slide creation.
Phase 2: User Configuration
Question 1: Page Count
Use AskUserQuestion to ask the user how many slides they want:
- "10 슬라이드 (간결한 요약)" - Concise summary
- "15 슬라이드 (표준 발표)" - Standard presentation
- "20 슬라이드 (상세 발표)" - Detailed presentation
- Other (custom number input)
Question 2: Design Style Selection (25 styles)
Option A: Visual Preview (Recommended)
Start the preview server and open the browser for visual style comparison:
python .claude/skills/typst/preview/server.py &
if [[ "$OSTYPE" == "darwin"* ]]; then open http://localhost:8432;
elif command -v xdg-open &>/dev/null; then xdg-open http://localhost:8432;
else echo "Please open http://localhost:8432 in your browser"; fi
Tell the user: "브라우저에서 디자인 스타일을 탐색해주세요. 갤러리에서 카드를 클릭하면 상세 프리뷰를, Compare 탭에서 2개 스타일을 나란히 비교할 수 있습니다. 마음에 드는 스타일을 알려주세요."
Wait for the user to name their chosen style, then confirm with AskUserQuestion. After selection:
kill $(cat /tmp/beautiful-ppt-preview.pid) 2>/dev/null
Option B: Text-based Fallback
If the preview server is unavailable or user prefers text selection, use AskUserQuestion with category grouping:
Available 25 styles by category:
- 비즈니스 / Business: 미니멀 클린, 코퍼레이트 모던, 파이낸스 트러스트, 컨설팅 스트래터지
- 모던 / Modern: 그라디언트 플로우, 다크 엘레건트, 볼드 지오메트릭, 브랜드 스토리텔링
- 테크 / Tech: 테크 네온, SaaS 프로덕트, AI 퓨처리스틱
- 교육 / Education: 에듀 클래스룸, 에듀 리서치, 클래식 아카데믹
- 의료 / Healthcare: 메디컬 클리니컬, 파마 바이오텍
- 공공 / Public: 거버먼트 액세서블, NGO 임팩트
- 크리에이티브 / Creative: 크리에이티브 포트폴리오, 스타트업 피치, 마케팅 캠페인
- 라이프스타일 / Lifestyle: 네이처 오가닉, 파스텔 소프트, 스칸디나비안 휘게, 리테일 라이프스타일
Use 2-step AskUserQuestion: first select category, then select style within category.
Phase 3: Typst Slide Generation
-
Load the selected color theme from assets/color-themes.json by matching the selected style ID.
-
Read slide templates from references/slide-templates.md for the template functions.
-
Generate the .typ file using the templates and content:
- Start with theme color variable declarations from the selected theme
- Use 16:9 widescreen page setup (25.4cm × 14.29cm)
- Apply the appropriate font based on content language:
- Korean:
"Noto Sans CJK KR"
- English:
"Libertinus Serif" or "DejaVu Sans"
- Check available fonts with
typst fonts
- Structure slides as:
- Title slide (표지)
- Table of contents / Agenda (목차)
- Section dividers between major topics
- Content slides with appropriate layouts
- Closing slide (마무리)
- Keep content concise - NO overflow allowed
-
Compile to PDF:
typst compile presentation.typ presentation.pdf
Phase 4: Visual Verification Loop (MANDATORY - 3 iterations)
This is a MANDATORY 3-iteration ralph verification loop. Each iteration MUST:
Iteration N (repeat 3 times):
Step 1: Export each slide to PNG
typst compile presentation.typ slide-{n}.png --format png
Step 2: Read each PNG and verify
Use the Read tool on each PNG file to visually inspect:
Step 3: Fix any issues found
For each issue:
- If text overflows → reduce content, split across slides, or decrease font size
- If spacing is tight → increase margins or reduce content
- If heading is too long → shorten or use smaller font
- If too many bullet points → split into multiple slides
Step 4: Recompile and verify fix
typst compile presentation.typ presentation.pdf
typst compile presentation.typ slide-{n}.png --format png
After fixing, re-check ALL slides, not just the fixed ones.
IMPORTANT: All 3 iterations MUST run even if no issues are found in earlier iterations.
The purpose is to catch subtle issues that may be missed on first pass.
Log each iteration's findings:
Iteration 1: Found [N] issues → Fixed [M]
Iteration 2: Found [N] issues → Fixed [M]
Iteration 3: Found [N] issues → Fixed [M] (should be 0 if quality is high)
Phase 5: PPT Export
After all 3 verification iterations pass:
-
Ensure PNG slides are up to date:
mkdir -p slides/
typst compile presentation.typ slides/slide-{n}.png --format png
-
Convert to PowerPoint:
mkdir -p output/
python .claude/skills/typst/scripts/export-ppt.py \
--input-dir slides/ \
--output output/presentation.pptx \
--title "Presentation Title"
-
Report to user:
- Show the output path:
output/presentation.pptx
- Report slide count
- Report any issues found and fixed during verification
- Provide the .typ source file path for future editing
Asset Files
assets/design-vocabulary.json — 25 design styles with descriptions and mood (v2.0.0)
assets/color-themes.json — Color palettes for each design style (v2.0.0)
references/slide-templates.md — Typst template functions for various slide types
scripts/export-ppt.py — PNG-to-PPTX conversion script
preview/ — HTML preview system for visual style comparison
index.html — Gallery page with domain filters (25 styles)
compare.html — Side-by-side style comparison view
server.py — Local development server (port 8432)
styles/*.html — Individual style preview pages (25 files)
assets/preview.css — Shared stylesheet for preview pages
Typst Syntax Quick Reference
Typst has three modes: markup, math, and code. In markup, # enters code mode.
Essential Syntax for Slides
// Page setup for 16:9 slides
#set page(width: 25.4cm, height: 14.29cm, margin: 1.5cm, fill: rgb("F4F6F9"))
// Typography
#set text(font: "Noto Sans CJK KR", size: 14pt)
*bold* _italic_ `code`
// Layout
#align(center + horizon)[Centered content]
#grid(columns: (1fr, 1fr), [Left], [Right])
#v(1em) // vertical space
#h(1em) // horizontal space
// Shapes and decoration
#rect(width: 100%, height: 3pt, fill: rgb("FF6B00"))
#circle(radius: 4pt, fill: rgb("FF6B00"))
#line(length: 100%, stroke: 0.5pt + rgb("CBD8E5"))
// Colors
#text(fill: rgb("003366"))[Colored text]
#block(fill: rgb("F4F6F9"), inset: 12pt, radius: 6pt)[Card content]
// Images
#image("photo.jpg", width: 80%)
#figure(image("chart.png", width: 100%), caption: [Caption])
// Page breaks (= slide breaks)
#pagebreak()
Compilation Commands
typst compile presentation.typ presentation.pdf
typst compile presentation.typ slide-{n}.png --format png
typst compile presentation.typ slide.png --format png --pages 1
typst compile presentation.typ slide-{n}.svg --format svg
typst compile --font-path ./fonts presentation.typ
Available Fonts
Check with typst fonts. Common options:
- Korean:
Noto Sans CJK KR, Noto Serif CJK KR
- Sans:
DejaVu Sans, Liberation Sans
- Serif:
Libertinus Serif, Liberation Serif
- Mono:
DejaVu Sans Mono
- Math:
DejaVu Math TeX Gyre
Troubleshooting
| Problem | Solution |
|---|
| Text overflow | Reduce content, split slides, decrease font size |
| Unknown font | Run typst fonts to check available fonts |
| CJK not rendering | Use Noto Sans CJK KR font |
| PNG export fails | Ensure typst v0.10+ for --format png |
| PPT export fails | Run pip install python-pptx |
| NotebookLM auth | Run auth setup with visible browser |
Tips for Professional Results
- Less is more — Max 5-6 bullet points per slide, max 40 chars per heading
- Visual hierarchy — Use font size difference of at least 6pt between heading and body
- Consistent spacing — Use
v(0.8cm) consistently between sections
- Color restraint — Use accent color sparingly for emphasis only
- Slide count — Plan for ~1 minute per slide for typical presentations
- CJK content — Always set appropriate CJK font before any Korean/Japanese/Chinese text