| name | pitch-deck |
| description | Build a responsive, interactive pitch-deck website from a brand book + a PRD/example deck.
Use when the user asks to "build a pitch deck", "make an investor deck", "create a sales deck",
generate a deck site from a brand book, or scaffold a deck from a PRD or existing slides.
Pulls brand tokens (colors, typography, voice) from a brandbook-builder-style repo, runs a
guided brief (investor vs sales, copy approval, image/logo intake, reference mining), then
scaffolds a Vite + React + TS + Tailwind + motion deck site mirroring the utopia-os-deck
section-scroll pattern.
|
Pitch Deck โ guided build
Take the user from nothing to a deployed, responsive pitch-deck site. Mirrors the
brandbook-builder plugin pattern (brief โ build โ QA/deploy) but the deliverable is a
section-scroll deck app, not a brand book.
The output stack is fixed: Vite + React + TypeScript + Tailwind CSS + motion (Framer Motion).
The structural pattern is the utopia-os-deck section-scroll model (one component per slide,
AnimatePresence loader, fixed Navbar, scroll-snap optional, motion reveals on enter).
Hard rules
- Brand book is the source of truth for visual tokens. Colors, typography, radii, motion
timings, logo usage โ all sampled from the brand book repo. Visual references from the user
(Pinterest, existing decks) only influence layout density, contrast feel, type pairings,
imagery direction โ never override brand colors or type.
- Never invent copy silently. If the user has no copy and no PRD, draft copy must be
shown back for line-by-line approval before it is written into the deck.
- Audience drives voice. Investor vs sales is asked once at brief time and threads through
every section (see
references/investor-tone.md and references/sales-tone.md).
- No layout-copying third-party references. Sample moves (palette temperature, contrast,
density, type style, spacing rhythm) โ do not reproduce a competitor's slide.
- Responsive is non-negotiable. Mobile (โค640), tablet (โค1024), desktop (โฅ1280) verified
before handoff. No horizontal overflow at any breakpoint.
Phase 0 โ Confirm scope (โค 30s)
Ask only what you can't infer. Combine into one AskUserQuestion call.
- Deck name / working title.
- Audience type โ investor | sales (read the matching tone file).
- Source of brand book โ pick one:
- existing repo on disk (path),
- git URL to clone (skill clones into
.cache/brand-source/ inside output dir),
- none yet โ fall back to inline brand intake (palette, primary font, logo).
- Source of deck content โ pick one:
- PRD file path (markdown/PDF/txt),
- existing pitch deck (PDF/keynote/pptx export, or another deck repo),
- none โ generate draft copy from a short founder/product blurb.
- Output target โ where to scaffold the deck site (absolute path).
- Visual references โ optional, accept 0โ10:
- Pinterest board URL(s), image URLs, or local image paths.
- These feed
references/reference-mining.md; mine moves, not layouts.
If anything is ambiguous, ask in the same turn โ never spawn the scaffold blind.
Phase 1 โ Brand extraction
Default behaviour: read if present, ask if not. If the user gave a path or URL, try to
extract every token from the brand book first; only prompt for tokens that cannot be
resolved. If no brand book at all, fall through to inline intake.
Follow references/brand-extraction.md. Produce a single brand.json at the output target's
root with this shape (fields the build phase reads):
{
"name": "...",
"tone": "investor|sales",
"colors": { "ink": "#101010", "inkSoft": "#3c3c3c",
"brand": { "DEFAULT": "...", "deep": "...", "mint": "...", "light": "..." },
"bg": "#fff", "surface": "#f7f7f7" },
"fonts": { "display": "...", "sans": "...", "mono": "..." },
"logo": { "src": "/assets/logo.svg", "alt": "..." },
"radii": { "sm": 4, "md": 8, "lg": 16 },
"motion": { "ease": "easeOut", "durationMs": 600, "stagger": 80 }
}
If a brand book repo is provided, read tokens from tailwind.config.js (extend.colors,
extend.fontFamily), index.css (CSS custom props), and any brand.{ts,json} / tokens.*
files. If the brand book uses Shadcn-style theming, also read :root CSS vars from globals.
If no brand book exists, prompt for: 1 primary color, 1 accent, 1 ink color, display font,
body font. Confirm before writing.
Phase 2 โ Deck brief
For each canonical section (see references/section-map.md), produce a one-line intent
plus a copy block status:
provided โ pulled verbatim from PRD or existing deck.
draft โ generated; must be approved by user before write.
defer โ section dropped this round.
Output the brief as deck-brief.md at the output root. Show it to the user. Wait for explicit
"approved" or edits before Phase 3.
Audience handling:
- Investor โ lead with problem, market, traction, ask. See
references/investor-tone.md.
- Sales โ lead with prospect's pain, solution fit, proof, next step. See
references/sales-tone.md.
Phase 3 โ Scaffold
At the chosen output path, scaffold a fresh Vite + React + TS project (npm create vite@latest . -- --template react-ts), then add: Tailwind, postcss, autoprefixer, motion, @fontsource for
brand fonts. Mirror this repo's layout:
src/
App.tsx # AnimatePresence loader โ main scroll
main.tsx
brand.ts # typed import of brand.json
assets.ts # central image manifest (local + optional figma URL)
index.css # Tailwind layers + brand CSS vars + font @imports
components/
Loader.tsx # branded boot animation
Navbar.tsx # fixed, anchors to sections
Reveal.tsx # motion in-view wrapper
icons.tsx # inline SVGs (lucide-react optional)
slides/
Cover.tsx
Problem.tsx
Solution.tsx
Market.tsx
Product.tsx
Traction.tsx # investor only by default
BusinessModel.tsx # investor only by default
GTM.tsx
Proof.tsx # sales: case studies; investor: traction continued
Team.tsx
Roadmap.tsx
Ask.tsx # investor: round ask; sales: next step CTA
tailwind.config.js # extends colors/fonts from brand.json
index.html
public/assets/ # logo + slide imagery
One component per slide โ section-scroll, not a slide carousel. Each slide is a <section>
with id, mx-auto max-w-[1440px], px-6 md:px-[120px], motion Reveal on enter. Match the
hero/stats/cta motion style in templates/slide-skeleton.tsx.
Investor vs sales drives which slides ship. Cover/Problem/Solution/Market/Product/GTM/Team/Ask
are universal. Traction + BusinessModel default-on for investor, default-off for sales. Proof
default-on for sales.
Phase 4 โ Image & copy intake
For every slide:
- Logo โ required. Ask for SVG; PNG acceptable.
- Hero/product imagery โ required for Cover, Solution, Product. If user has none, write a
[IMAGE NEEDED: <description>] placeholder in assets.ts and a neutral SVG placeholder in
public/assets/. Never leave broken refs.
- Founder/team photos โ only if Team slide ships. Same placeholder rule.
- Copy approval โ print every
draft block from Phase 2 and require explicit approval per
slide before committing to JSX. Investor numbers (traction, ask) must be user-supplied;
never fabricate.
Reference uploads (Pinterest URLs, deck PDFs) go into references/reference-mining.md flow:
extract palette temperature, contrast level, type pairing direction, image density, motion
intensity โ write the conclusions into deck-brief.md under "Visual direction" and apply at
JSX time. Brand tokens win every conflict.
Phase 5 โ Build, verify, deploy
Run npm install, then npm run build. Run the skill's validator before booting:
node <skill-root>/scripts/validate-pitchdeck-project.mjs <deck-output-path>
(Resolved from pitch-deck/scripts/validate-pitchdeck-project.mjs inside the skills
collection.) Then boot npm run dev and verify:
- No console errors.
- No horizontal scroll at 360, 768, 1280, 1920.
- Logo + every required image renders (no broken refs).
- Navbar anchors jump to the correct sections.
- Loader exits cleanly; main fades in.
- Tab order through anchors is sensible; CTAs are keyboard-reachable.
The validator fails the deploy if brand.json, deck-brief.md, Cover, Ask, slide
components, or assets.ts are missing/malformed.
Deploy target โ ask. Default Vercel; offer GitHub Pages / Netlify / static export. For Vercel,
confirm vercel.json (output, framework=vite). Do NOT push or deploy without explicit user OK.
Output contract
When done, summarise in โค6 lines:
- Output path + deploy URL (if deployed).
- Audience (investor|sales) + section list shipped.
- Brand source (path/URL/inline) and any token gaps.
- Images: provided vs placeholder count.
- Copy: provided vs draft-approved count.
- Open follow-ups (missing photo, unapproved copy block, deferred section).
Reference files
references/section-map.md โ canonical slide list + per-audience defaults.
references/investor-tone.md โ voice, structure, what investors need per slide.
references/sales-tone.md โ voice, structure, what prospects need per slide.
references/brand-extraction.md โ how to read tokens from a brandbook-builder repo.
references/reference-mining.md โ how to sample Pinterest / existing decks safely.
references/deck-template-structure.md โ full file tree + slide skeleton conventions.
templates/slide-skeleton.tsx โ copy-paste motion-aware slide template.
scripts/validate-pitchdeck-project.mjs โ pre-deploy validator.