{"id":50521003,"url":"https://github.com/kimmingul/marp-slide-studio","last_synced_at":"2026-06-03T04:01:59.054Z","repository":{"id":351831020,"uuid":"1212682029","full_name":"kimmingul/marp-slide-studio","owner":"kimmingul","description":"Build sophisticated Marp slide decks with AI — 63 design-system-backed themes, multilingual CJK + Latin typography (Korean/Japanese/Chinese/English), and a Playwright visual-QA loop for Claude Code.","archived":false,"fork":false,"pushed_at":"2026-04-16T17:25:05.000Z","size":216,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-16T18:29:16.116Z","etag":null,"topics":["chinese","claude-code","claude-code-plugin","design-system","japanese","korean","marp","multilingual","playwright","presentation","slides","typography"],"latest_commit_sha":null,"homepage":"https://github.com/kimmingul/marp-slide-studio","language":"CSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kimmingul.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-16T16:13:05.000Z","updated_at":"2026-04-16T17:25:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kimmingul/marp-slide-studio","commit_stats":null,"previous_names":["kimmingul/marp-slide-studio"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/kimmingul/marp-slide-studio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kimmingul%2Fmarp-slide-studio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kimmingul%2Fmarp-slide-studio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kimmingul%2Fmarp-slide-studio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kimmingul%2Fmarp-slide-studio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kimmingul","download_url":"https://codeload.github.com/kimmingul/marp-slide-studio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kimmingul%2Fmarp-slide-studio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33847265,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-03T02:00:06.370Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chinese","claude-code","claude-code-plugin","design-system","japanese","korean","marp","multilingual","playwright","presentation","slides","typography"],"created_at":"2026-06-03T04:01:55.997Z","updated_at":"2026-06-03T04:01:59.047Z","avatar_url":"https://github.com/kimmingul.png","language":"CSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# marp-slide-studio\n\n**Build Marp decks that don't look AI-generated.**\n\nA Claude Code plugin that grounds slide generation in real brand design systems, **Gothic (sans-serif) typography by default** for Korean business/tech contexts, and a Playwright-powered visual review loop. Multilingual CJK + Latin support (Korean, Japanese, Chinese, English). Ships with **65 themes** — 6 hand-crafted (4 Gothic + 2 editorial serif variants) plus on-demand generation for 59 brands from a curated registry (Stripe, Apple, Linear, Notion, Tesla, Figma, Spotify, IBM, BMW, Ferrari, and more).\n\n\u003e **v0.8.0 (best-practices reflection)**: every skill now ships with a `## Gotchas` section, user-generated themes cache in `${CLAUDE_PLUGIN_DATA}` (survives plugin upgrades), plus programmatic slide assertions + Playwright video recording for verification. [CHANGELOG.md](CHANGELOG.md#080--2026-04-17)\n\u003e\n\u003e **v0.7.0 typography pivot**: the plugin defaults to Gothic/sans-serif — matching Korean business and tech slide conventions. Editorial serif themes (`kinfolk-serif`, `arctic-serif`) remain available as opt-in via `--typography editorial` or direct theme pick. See [Design systems](#design-systems) below.\n\n## Why this exists\n\nSlide tools have not meaningfully changed in 20 years. PowerPoint (1987) and Keynote (2003) hand you a template and leave the design decisions to you. Modern AI slide generators produce decks that are pixel-perfect but look identical — purple gradients, three-column card mosaics, stock icons, generic sans-serif everything.\n\n`marp-slide-studio` takes a different approach:\n\n1. **Design systems, not templates.** Each theme ships with a documented point of view (mood, palette logic, typography rules, do's and don'ts). The composer reads these before generating.\n2. **Hard anti-patterns encoded.** 18 specific things the composer refuses to produce — three-column card mosaic, purple-on-white gradients, stock icons, \"Thank You / Questions?\" finale.\n3. **Narrative-first composition.** Every slide must declare a one-sentence message. No beat, no slide.\n4. **Visual review loop.** Playwright captures each slide; two specialist agents (structural + aesthetic) critique and auto-edit. PowerPoint has no such loop.\n5. **Multilingual typography baked in.** Korean, Japanese, Chinese (Simplified + Traditional), and English all get language-aware line-height, font stacks, and italic discipline via CSS `:lang()` selectors.\n6. **Force choices over options.** One accent color. Two typefaces max. Three bullets max. Constraint produces style.\n\n## Key features\n\n- **One-command pipeline** (`/slide-auto`) — brief → theme → compose → refine → export, no mid-flight prompts\n- **Gothic-by-default typography** — sans-serif everywhere unless you explicitly request editorial serif. Matches Korean business/tech slide conventions.\n- **65 themes** — 6 hand-crafted (4 Gothic + 2 editorial opt-in serif variants) + 59 brand registry with on-demand generation\n- **Multilingual CJK + Latin** — KR / JP / ZH-Hans / ZH-Hant / EN via `:lang()` selectors\n- **Interactive gallery** (`/slide-gallery`) — browser-based visual selection with filters\n- **Mood Match quiz** — 3 questions → 5–8 theme recommendations\n- **Playwright refine loop** — N rounds of auto-critique and diff application\n- **PDF + PPTX export** — editable PowerPoint mode optional\n- **Video recording** — `scripts/record-deck.mjs` produces a WebM of slide transitions (v0.8.0+)\n- **Programmatic verification** — `scripts/ci/slide-assertions.mjs` runs 8 deterministic checks (slide count, lang, rhythm, accent, body font-size floor, italic CJK, img src, layout) on every rendered deck (v0.8.0+)\n- **Usage measurement** — `PreToolUse` hook logs JSONL to `${CLAUDE_PLUGIN_DATA}/usage.jsonl`; aggregate via `scripts/usage-report.mjs` (v0.8.0+)\n- **GitHub Actions CI** — auto-render changed decks on PR with pixel-diff screenshots\n- **Gotchas sections** on every skill documenting real failure modes observed during development (v0.8.0+)\n\n## Supported languages\n\nThe plugin supports five writing systems with dedicated typography calibration:\n\n| Language | Code | Primary body font | Italic discipline | Line-height (body) |\n|---|---|---|---|---|\n| Korean | `ko` | Pretendard Variable | Weight 500 as emphasis (no italic) | 1.7 |\n| Japanese | `ja` | Noto Sans JP, Hiragino Sans | Weight 500 as emphasis (no italic) | 1.7 |\n| Chinese (Simplified) | `zh-Hans` | Noto Sans SC, PingFang SC | Weight 500 as emphasis (no italic) | 1.7 |\n| Chinese (Traditional) | `zh-Hant` | Noto Sans TC, PingFang TC | Weight 500 as emphasis (no italic) | 1.7 |\n| English + Latin scripts | `en`, `es`, `fr`, `de`, `pt`, `it` | Inter | Italic as designed | 1.55 |\n\nDeclare your deck's language in Marp front matter:\n\n```markdown\n---\nmarp: true\ntheme: obsidian-mono\nlang: ja\n---\n\n# 新しい始まり\n```\n\nThemes automatically swap font family, line-height, ligatures, and emphasis styling via CSS `:lang()` selectors — no manual per-slide fiddling.\n\nThe plugin also ships three layouts unique to CJK writing systems:\n\n- **Vertical writing** (세로쓰기 / 縦書き / 竖排) — ceremonial orientation for classical quotations\n- **Ruby annotation** (한자 병기 / 振り仮名 / 拼音) — phonetic overlay using HTML `\u003cruby\u003e`\n- **Banner-caption** (방주 / 傍注 / 夹注) — main claim + side commentary\n\n## Prerequisites\n\nRun the dependency check first — it prints a colored report and exits 0 when everything is in place:\n\n```bash\nbash scripts/check-deps.sh\n```\n\nExpected output when ready:\n\n```\n▸ marp-slide-studio dependency check\n────────────────────────────────────────\n\nRequired\n  ✓ Node.js ≥ 18             v20.x.x\n  ✓ npx                      …/bin/npx\n  ✓ Chrome / Chromium        /Applications/Google Chrome.app/…\n  ✓ marp-cli                 cached via npx — instant first run\n  … (or ○ not cached — first run fetches ~30–60s, one-time)\n\nOptional\n  ⚠ Playwright               not installed — /slide-refine visual QA will be skipped\n    enable with: npm i -D playwright \u0026\u0026 npx playwright install chromium\n\nStatus: READY\n```\n\n### Required\n\n- **Node.js ≥ 18** — install from [nodejs.org](https://nodejs.org) or use a version manager (`nvm`, `fnm`, `volta`). `npx` ships with it.\n- **Google Chrome or Chromium** — marp CLI uses headless Chrome for PDF/PPTX export.\n  - **macOS**: install from [google.com/chrome](https://www.google.com/chrome/) or `brew install --cask google-chrome`\n  - **Linux**: `sudo apt install google-chrome-stable` (Debian/Ubuntu) or `sudo apt install chromium-browser`\n  - **Windows**: install from [google.com/chrome](https://www.google.com/chrome/)\n  - Or set the `CHROME_PATH` env var to point at a custom Chrome/Chromium binary.\n\n### Installed automatically on first use\n\n- **marp-cli** — the plugin invokes it via `npx --yes @marp-team/marp-cli@latest`. No manual install needed; the first `/slide-compose` or `/slide-export` downloads it into npm's cache (~30–60 seconds), subsequent runs are instant. Override with `MARP_BIN=/your/path` if you prefer a pinned local install.\n\n### Optional (enable extra features)\n\n- **Playwright** — enables the `/slide-refine` visual QA loop (per-slide screenshots + AI aesthetic review). Without it, the refine loop is skipped silently and the rest of the pipeline continues.\n  ```bash\n  npm i -D playwright \u0026\u0026 npx playwright install chromium\n  ```\n\n- **Offline font bundle** — by default fonts (Pretendard, Noto Sans JP/SC/TC, Inter, editorial serifs) load from CDN at render time. For air-gapped environments or reproducible team distribution, bundle them locally:\n  ```bash\n  bash scripts/fetch-fonts.sh\n  ```\n  This downloads ~8 MB into `assets/fonts/` and writes `assets/fonts/offline.css`. Swap theme `@import` lines to use it.\n\n## Installation\n\n### Option 1 — Standalone plugin directory\n\n```bash\ngit clone https://github.com/kimmingul/marp-slide-studio.git\nclaude --plugin-dir /absolute/path/to/marp-slide-studio\n```\n\n### Option 2 — Single-plugin marketplace\n\n```\n# In Claude Code\n/plugin marketplace add https://github.com/kimmingul/marp-slide-studio\n/plugin install marp-slide-studio@nanumspace-marketplace\n```\n\n### Option 3 — Team marketplace entry\n\nAdd to your existing team marketplace:\n\n```json\n{\n  \"plugins\": [\n    {\n      \"name\": \"marp-slide-studio\",\n      \"source\": \"github:kimmingul/marp-slide-studio\",\n      \"version\": \"0.6.0\"\n    }\n  ]\n}\n```\n\n### Team settings (optional)\n\nCreate `.claude/marp-slide-studio.local.md` in your project root:\n\n```yaml\n---\nteam_brand_primary: \"#0A0A0A\"\nteam_brand_accent: \"#FF5B13\"\ndefault_track: \"minimalist-premium\"\ndefault_language: \"en\"\nauthor_default: \"Our Team\"\n---\n```\n\n## Quick start\n\n### Autopilot (recommended)\n\n```\n/slide-auto \"Rethinking cloud billing for AI workloads\"\n```\n\nClaude asks 3 questions (preset, length, memory sentence), then runs the full pipeline autonomously. 5–10 minutes total.\n\n```\n/slide-auto \"スライドの未来について\" --preset launch-keynote --lang ja\n/slide-auto \"产品发布\" --preset product-launch --lang zh-Hans\n/slide-auto \"한글 슬라이드 타이포\" --preset research-talk --lang ko\n```\n\n### Step-by-step (when you want control)\n\n| Stage | Command | What happens |\n|---|---|---|\n| 1. Brief | `/slide-new [topic]` | 5 questions → `./slides/\u003cslug\u003e/brief.md` |\n| 2. Theme | `/slide-theme [slug]` | Pick from curated + registry themes → `theme.css` |\n| 3. Compose | `/slide-compose [slug]` | Brief + theme → `deck.md` + HTML preview |\n| 4. Refine | `/slide-refine [slug] [iter]` | Playwright screenshots + AI critic loop |\n| 5. Export | `/slide-export [slug] [pdf\\|pptx\\|both]` | Final PDF + PPTX |\n\n### Gallery\n\n```\n/slide-gallery\n```\n\nOpens a browser-based filterable grid of all 65 themes. Click any card to see all 7 sampler slides rendered in that theme. Copy the `/slide-theme \u003cslug\u003e` command back into Claude to apply.\n\nThree gallery modes:\n- **Mood Match** (default, ~30s) — 3 quiz questions → 5–8 recommendations\n- **Full Gallery** (browser) — all 65 themes\n- **Personal Preview** — your own deck rendered against 5 candidate themes\n\n## Design systems\n\n### Default themes (Gothic, business/tech-first)\n\nThese are the primary themes used by all autopilot presets in default mode. **All sans-serif, Pretendard-based**, calibrated for Korean/CJK business slides.\n\n| Theme | Palette | Use case |\n|---|---|---|\n| **Obsidian Mono** | cream + deep ink + terracotta | Executive briefings, architecture talks |\n| **Arctic Sans** (new in 0.7) | cool gray + navy + deep blue | Research presentations, policy briefings with footnote rail |\n| **Kinfolk Sans** (new in 0.7) | warm cream + burgundy | Team narratives, brand storytelling in warm palette |\n| **Wired Grid** | monochrome + electric orange, Pretendard 900 display | Keynotes, trend reports, cultural criticism |\n\n### Editorial themes (opt-in, serif display)\n\nFor explicit editorial atmosphere — classical quotations, literary narratives, academic publications where serif carries meaning. Same palettes as the Gothic variants above, paired with Noto Serif KR / JP / SC / TC display.\n\n| Theme | Gothic variant | Use case |\n|---|---|---|\n| **Kinfolk Serif** | kinfolk-sans | Editorial brand narratives, cultural/mission talks with serif gravitas |\n| **Arctic Serif** | arctic-sans | Scholarly publications with serif journal aesthetic |\n\nHow to opt in:\n```bash\n# Direct theme pick\n/slide-theme kinfolk-serif\n/slide-theme arctic-serif\n\n# Autopilot override (preset auto-swaps to serif variant)\n/slide-auto \"팀 공유\" --preset team-narrative --typography editorial\n\n# Team-wide default (in .claude/marp-slide-studio.local.md)\ndefault_typography: editorial\n```\n\n### Brand registry (Tier 3, 59 themes on-demand)\n\nEvery brand listed in [`assets/design-systems/registry.json`](assets/design-systems/registry.json). Categories:\n\n- **AI \u0026 LLM** — Claude, Cohere, ElevenLabs, Mistral, Ollama, Replicate, RunwayML, Together, VoltAgent, x.ai, MiniMax\n- **Dev tools** — Cursor, Expo, Lovable, Raycast, Superhuman, Vercel, Warp, Opencode\n- **Backend / DevOps** — ClickHouse, Composio, HashiCorp, MongoDB, PostHog, Sanity, Sentry, Supabase\n- **Productivity** — Cal, Intercom, Linear, Mintlify, Notion, Resend, Semrush, Zapier\n- **Design \u0026 creative** — Airtable, Clay, Figma, Framer, Miro, Webflow\n- **Fintech** — Coinbase, Kraken, Revolut, Stripe, Wise\n- **Automotive** — BMW, Ferrari, Lamborghini, Renault, Tesla\n- **Media \u0026 consumer** — Apple, IBM, NVIDIA, Pinterest, SpaceX, Spotify, Uber\n- **Travel / commerce** — Airbnb\n\n```bash\n# See everything available\nnode scripts/forge-theme.mjs list\n\n# Generate any brand on first request\n/slide-theme stripe           # on-demand forge → cached\n/slide-theme linear.app\n/slide-theme tesla --force    # regenerate even if cached\n```\n\nGenerated themes (v0.8.0+ cache location):\n- Written to **`${CLAUDE_PLUGIN_DATA:-~/.marp-slide-studio}/themes/\u003cslug\u003e.{design.md,marp.css}`** — stable location that survives plugin upgrades\n- Pass the same structural validator as hand-crafted themes\n- Load Pretendard + all CJK + Inter via `theme-foundation.css`\n- Include \"Inspired by \u003cbrand\u003e. Not affiliated.\" disclaimers\n- Regenerable — delete cache and re-request to pick up upstream changes\n\nLookup priority when resolving a theme name:\n1. `assets/design-systems/{minimalist-premium,editorial}/` — hand-crafted Tier 2\n2. `${CLAUDE_PLUGIN_DATA}/themes/` — user-forged cache\n3. `examples/seed-themes/` — five shipped reference samples (stripe, linear-app, apple, notion, tesla)\n4. `assets/design-systems/generated/` — legacy fallback for pre-v0.8.0 installs\n\nAcknowledgement: brand metadata is synthesized from publicly visible aesthetics, inspired by [VoltAgent/awesome-design-md](https://github.com/VoltAgent/awesome-design-md) (MIT) and [getdesign.md](https://getdesign.md). No proprietary content is redistributed.\n\n## Autopilot presets\n\nSix presets cover 80% of deck types. **All presets default to Gothic typography** (v0.7.0+). Two presets have defined serif variants that swap in when `--typography editorial`.\n\n| Preset | Default theme (Gothic) | Serif variant (opt-in) | Narrative pattern | Lang | Refine | Export |\n|---|---|---|---|---|---|---|\n| `investor-pitch` | stripe | — | problem-insight-solution-ask | en | 3 | PDF + editable PPTX |\n| `team-narrative` | **kinfolk-sans** | kinfolk-serif | five-beats | ko | 2 | PDF |\n| `research-talk` | **arctic-sans** | arctic-serif | question-exploration-answer | en | 3 | PDF + editable PPTX |\n| `launch-keynote` | wired-grid | — | five-beats (provocative) | en | 4 | PDF + PPTX |\n| `executive-brief` | obsidian-mono | — | situation-complication-resolution | en | 3 | PDF + editable PPTX |\n| `product-launch` | apple | — | hero-support-detail-proof-cta | en | 3 | PDF + editable PPTX |\n\nOverride any field at invocation:\n\n```bash\n# Default (Gothic)\n/slide-auto \"Topic\" --preset team-narrative              # → kinfolk-sans\n\n# Explicit serif override\n/slide-auto \"Topic\" --preset team-narrative --typography editorial    # → kinfolk-serif\n\n# Other flags combine\n/slide-auto \"Topic\" --preset investor-pitch --lang ja --force-theme notion\n```\n\n## Project output structure\n\n```\nyour-project/\n├── .claude/\n│   └── marp-slide-studio.local.md      # optional team defaults\n└── slides/\n    └── \u003cdeck-slug\u003e/\n        ├── brief.md                     # narrative brief\n        ├── theme.css                    # applied theme (copied / customized)\n        ├── deck.md                      # Marp markdown source\n        ├── out/\n        │   ├── deck.html                # preview\n        │   ├── deck.pdf\n        │   ├── deck.pptx\n        │   └── screenshots/             # per-slide PNGs for refine loop\n        ├── .qa-log.md                   # refine-loop iteration log\n        └── .auto-log.md                 # autopilot decision audit trail\n```\n\nRecommended `.gitignore`:\n\n```\nslides/*/out/\nslides/*/.qa-log.md\nslides/*/.auto-log.md\n.claude/*.local.md\n```\n\n## Typography\n\n**Default: Gothic (sans-serif)** — `Pretendard Variable` across all default themes, all languages. Matches the Korean business/tech slide convention where serif is an editorial opt-in, not a baseline.\n\n**Editorial serif**: opt-in via `--typography editorial` CLI flag, `default_typography: editorial` in team settings, or direct `kinfolk-serif` / `arctic-serif` theme pick.\n\nTwo authoritative references:\n\n- [`assets/typography/cjk-scale.md`](assets/typography/cjk-scale.md) — unified Korean / Japanese / Chinese scale, per-language font stacks, line-height calibration, mixed-script handling\n- [`assets/typography/latin-scale.md`](assets/typography/latin-scale.md) — English and other Latin-script calibration, ligatures, hyphenation, smart quotes\n\nEvery theme imports [`assets/theme-foundation.css`](assets/theme-foundation.css), which provides:\n\n- Pretendard Variable + Noto Sans JP/SC/TC + Inter (CDN)\n- Per-language CSS variables (`--font-body-ko`, `--font-body-ja`, etc.)\n- `:lang()` cascade rules for line-height, font family, italic discipline\n- Numeral feature-settings for data contexts (tabular figures)\n- Latin ligature settings for English/Latin decks\n\n## CI integration\n\n`.github/workflows/slide-ci.yml` automatically renders changed decks on pull request:\n\n1. Detects changed files under `slides/*/deck.md` and `slides/*/theme.css`\n2. Renders each deck with marp-cli\n3. Captures per-slide 1920×1080 PNG screenshots with Playwright\n4. Diffs against the base branch screenshots using pixelmatch\n5. Posts a markdown table on the PR with per-slide change percentages\n6. Uploads HTML + PDF + PPTX + PNG as workflow artifacts\n\nSecurity: all user-controllable inputs (`inputs.slug`, git-discovered directory names) are validated against `[a-zA-Z0-9._-]{1,64}` and routed through `env:` blocks to prevent workflow injection.\n\nSeparate workflow `.github/workflows/publish-gallery.yml` auto-deploys the theme gallery to GitHub Pages whenever theme CSS / registry / sampler / template changes. Live at `https://\u003cowner\u003e.github.io/\u003crepo\u003e/`.\n\n## Verification utilities (v0.8.0+)\n\nRun these manually outside the CI workflow or from slide-visual-qa:\n\n```bash\n# 8 deterministic assertions on a rendered deck.html\nnode scripts/ci/slide-assertions.mjs \u003cslug\u003e\nnode scripts/ci/slide-assertions.mjs \u003cslug\u003e --strict   # turn warnings into failures\n\n# Record a navigable WebM video of the deck (Playwright required)\nnode scripts/record-deck.mjs \u003cslug\u003e\nnode scripts/record-deck.mjs \u003cslug\u003e --seconds 3        # 3s per slide\n\n# Pre-flight check for all plugin dependencies\nbash scripts/check-deps.sh\n\n# Aggregated skill usage report (from PreToolUse hook log)\nnode scripts/usage-report.mjs\nnode scripts/usage-report.mjs --days 7\n```\n\n## Extending\n\n### Add a new theme (hand-crafted, Tier 2)\n\n```bash\ncp assets/design-systems/minimalist-premium/obsidian-mono.{design.md,marp.css} \\\n   assets/design-systems/\u003ctrack\u003e/\u003cnew-theme\u003e.{design.md,marp.css}\n```\n\nEdit the `@theme` line, redefine tokens in `:root`, ensure all 7 required layout classes (hero, monumental, split, metric, divider, quote, enumerated) still render, update the DESIGN.md philosophy section. See [`skills/marp-theme-engineer/SKILL.md`](skills/marp-theme-engineer/SKILL.md) for the checklist.\n\n### Add a new brand to the registry (Tier 3)\n\nEdit [`assets/design-systems/registry.json`](assets/design-systems/registry.json) and add an entry matching the schema. Then:\n\n```\n/slide-theme \u003cyour-brand\u003e\n```\n\nThe theme-forger agent reads [`assets/transform-prompt.md`](assets/transform-prompt.md), synthesizes a complete `.design.md` + `.marp.css` pair, and validates via `scripts/validate-theme.mjs`.\n\n### Add a new layout\n\n1. Create `assets/layouts/\u003clayout-name\u003e.md` with markdown template + CSS requirements\n2. Add a `section.\u003clayout-name\u003e` rule to every theme CSS (required for all hand-crafted; optional for Korean-only layouts like `vertical-writing`, `ruby`, `banner-caption`)\n3. Update [`assets/layouts/README.md`](assets/layouts/README.md) layout index\n4. Update [`skills/slide-composer/SKILL.md`](skills/slide-composer/SKILL.md) layout-class mapping\n\n### Add a new narrative pattern\n\nEdit [`assets/narrative-patterns.md`](assets/narrative-patterns.md) with the new pattern's act structure. Available immediately to `/slide-new` and `/slide-auto`.\n\n## Components reference\n\n| Component | Count | Files |\n|---|---|---|\n| **User-invoked skills** | 6 | `slide-autopilot`, `slide-brainstorming`, `slide-theme-curator`, `slide-theme-gallery`, `slide-composer`, `slide-visual-qa`, `slide-export`, `theme-forger` |\n| **Reference skills** | 2 | `marp-theme-engineer`, `cjk-typography` |\n| **Agents** | 3 | `slide-director`, `marp-design-critic`, `theme-forger` |\n| **Design systems** | 63 | 4 curated + 59 registry-driven |\n| **Layouts** | 10 | 7 core + 3 CJK-specific (vertical-writing, ruby-annotation, banner-caption) |\n| **Typography guides** | 3 | `cjk-scale.md`, `latin-scale.md`, `mixed-language.md` |\n| **Anti-patterns** | 18 | Documented in [`assets/anti-patterns.md`](assets/anti-patterns.md) |\n| **Narrative patterns** | 5 | Documented in [`assets/narrative-patterns.md`](assets/narrative-patterns.md) |\n| **Autopilot presets** | 6 | `investor-pitch`, `team-narrative`, `research-talk`, `launch-keynote`, `executive-brief`, `product-launch` |\n\n## Troubleshooting\n\n### Korean / Japanese / Chinese text missing in the exported PDF\n\nSymptom: PDF rendered on another machine (especially via Cowork, Docker, CI, or a sandboxed Claude Desktop) shows Latin text correctly but CJK characters appear missing or replaced with rectangles.\n\nRoot cause (v0.6.2 and earlier): the font stylesheet was loaded via CDN `@import` with `font-display: swap`. Headless Chrome would snapshot the PDF using a fallback font before the real CJK font finished loading. On runners whose bundled Chromium lacks CJK system fallbacks, glyphs disappeared entirely.\n\n**Fix**: upgrade to v0.6.3+. `assets/theme-foundation.css` now declares Pretendard via a direct `@font-face` with `font-display: block` (forcing Chrome to wait up to 3 seconds for the font file) and points at a single non-subsetted woff2 URL so there are no unicode-range subset timing holes. All Google Fonts imports switched to `display=block`.\n\nIf upgrading isn't an option, or if the issue persists on a particularly locked-down environment:\n\n1. **Bundle fonts locally** — on the affected machine:\n   ```bash\n   bash scripts/fetch-fonts.sh\n   ```\n   Downloads Pretendard, Noto Sans JP/SC/TC, JetBrains Mono into `assets/fonts/`. The v0.6.3+ `@font-face` declarations try these local files before reaching the CDN, so once bundled no internet is required for rendering.\n\n2. **Install the primary font on the system** — Chrome's `local()` source lookup will then win over any network fetch:\n   - Korean: [Pretendard](https://github.com/orioncactus/pretendard/releases)\n   - Japanese: Hiragino Sans (macOS preinstalled), Noto Sans JP from [Google Fonts](https://fonts.google.com/noto/specimen/Noto+Sans+JP)\n   - Chinese (Simplified): PingFang SC (macOS preinstalled), Noto Sans SC\n   - Chinese (Traditional): PingFang TC, Noto Sans TC\n\n3. **Point marp-cli at user's Chrome** instead of the Puppeteer-bundled Chromium — the user's Chrome usually has full OS font access:\n   ```bash\n   CHROME_PATH=/usr/bin/google-chrome bash scripts/export-pdf.sh YOUR_SLUG\n   ```\n   (Also settable in the autopilot: `/slide-auto \"topic\"` reads `$CHROME_PATH` from the environment.)\n\n4. **Diagnose** — run `bash scripts/check-deps.sh` to confirm Chrome presence and suggest installs.\n\n### PDF export \"Chrome not found\"\n\n`CHROME_PATH` env var lets you point at any Chromium-family binary. On macOS this is typically `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`; on Linux `/usr/bin/google-chrome` or `/usr/bin/chromium`. The `check-deps.sh` script prints the correct path for your OS.\n\n### Refine loop silently skipped\n\nThe `/slide-refine` loop requires Playwright. If it isn't installed, the loop logs a warning and continues. Install with:\n```bash\nnpm i -D playwright \u0026\u0026 npx playwright install chromium\n```\n\n### Skill-specific gotchas (v0.8.0+)\n\nEvery SKILL.md file has a `## Gotchas` section listing real failure modes observed during development. When debugging a specific step, read the relevant skill's gotchas first:\n\n| Issue | Skill |\n|---|---|\n| \"markdown inside `\u003cdiv\u003e` not bolding\" | [slide-composer](skills/slide-composer/SKILL.md#gotchas) |\n| \"Korean disappeared in PDF\" | [cjk-typography](skills/cjk-typography/SKILL.md#gotchas) |\n| \"--typography editorial did nothing\" | [slide-theme-curator](skills/slide-theme-curator/SKILL.md#gotchas) |\n| \"Playwright installed but refine still skipped\" | [slide-visual-qa](skills/slide-visual-qa/SKILL.md#gotchas) |\n| \"brand not in registry\" | [theme-forger](skills/theme-forger/SKILL.md#gotchas) |\n| \"PDF only 50KB, something's wrong\" | [slide-export](skills/slide-export/SKILL.md#gotchas) |\n| \"gallery shows 65 but only 11 renders\" | [slide-theme-gallery](skills/slide-theme-gallery/SKILL.md#gotchas) |\n| \"theme CSS imports fail silently\" | [marp-theme-engineer](skills/marp-theme-engineer/SKILL.md#gotchas) |\n| \"autopilot setup can't be resumed\" | [slide-autopilot](skills/slide-autopilot/SKILL.md#gotchas) |\n| \"brief assumes defaults I don't want\" | [slide-brainstorming](skills/slide-brainstorming/SKILL.md#gotchas) |\n\n### Usage measurement (v0.8.0+)\n\nThe plugin ships with a `PreToolUse` hook that appends one JSONL line per `Task` tool invocation to `${CLAUDE_PLUGIN_DATA:-~/.marp-slide-studio}/usage.jsonl`. Aggregate with:\n\n```bash\nnode scripts/usage-report.mjs              # all time summary\nnode scripts/usage-report.mjs --days 7     # last 7 days\nnode scripts/usage-report.mjs --raw        # sample + log path\n```\n\nHelps identify which skills are popular vs under-triggering. Log is silent on failure — never blocks a session.\n\n## Limitations\n\n- **PPTX non-editable mode renders as images.** Editable mode preserves text but sacrifices some CSS fidelity. Decide per deck.\n- **Fonts require internet at render time** unless you bundle locally via `scripts/fetch-fonts.sh`.\n- **Refine loop currently runs at 1920×1080 only.** Responsive / mobile decks are out of scope.\n- **Generated themes are ~80–90% of hand-crafted quality.** For production-critical decks, always run `/slide-refine` after composing, and consider promoting heavily-used generated themes to Tier 2 by hand-editing.\n- **Brand attribution is aesthetic-only.** Registry metadata synthesizes publicly visible brand aesthetics. Themes carry \"Inspired by \u003cbrand\u003e. Not affiliated.\" disclaimers. For production decks representing a brand, consult that brand's official guidelines.\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n\nDesign-system references acknowledge:\n- [VoltAgent/awesome-design-md](https://github.com/VoltAgent/awesome-design-md) (MIT) — inspiration for the registry format\n- [getdesign.md](https://getdesign.md) — inspiration for the brand catalog\n\nFonts bundled via CDN are licensed under SIL Open Font License 1.1:\n- [Pretendard](https://github.com/orioncactus/pretendard)\n- [Noto Sans JP / SC / TC / KR](https://fonts.google.com/noto)\n- [Inter](https://rsms.me/inter/)\n- [JetBrains Mono](https://www.jetbrains.com/lp/mono/)\n\n## Credits\n\nBuilt on [Marp](https://marp.app) — the markdown presentation ecosystem by the Marp team. This plugin adds a Claude Code workflow layer on top of marp-cli, marp-core, and Marpit.\n\nContributions welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) (if present) or open an issue.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkimmingul%2Fmarp-slide-studio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkimmingul%2Fmarp-slide-studio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkimmingul%2Fmarp-slide-studio/lists"}