| 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