← Projects make a deck builder, thank me later

make a deck builder, thank me later

active April 14, 2026

I have spent 50% of my career making decks (honestly, it’s probably more lol). Different client, different data, same formatting drudgery. Our firm makes a lot of decks and no two of them look the same. As a someone who has worked in branding/creative, this irks me to no end. But, to be honest, it’s no one’s fault. Not everyone wakes up thinking, “I want to make a beautiful deck.” Only crazies like me.

So I built a deck generator. You can word vomit; text or voice. Submit an outline, can be as detailed or as vague as you like. It spits out a brand-perfect slide deck in about 30 seconds. $.02 - $.12 per deck. Not a revenue product. Not yet anyway. An internal tool that makes everyone faster at the thing we do most.

how it works:

  1. You describe your deck. Text, voice note, or upload a PDF with actual data.
  2. The app assembles a system prompt with 17 slide specs, 149 brand assets, tone settings, and any relevant past decks pulled from RAG.
  3. Claude generates structured JSON — one object per slide, typed to one of 19 slide templates.
  4. React renders it. Every slide is a typed component. Cover, content, stat hero, data tables, before/after, process flow, timeline, case study — 19 types total.
  5. Edit inline, then export. PDF via Puppeteer, self-contained HTML, or browser print.

The whole pipeline is: input → prompt assembly → Claude → JSON → React → export. No PowerPoint. No Google Slides API. HTML is the rendering layer.

the learning engine

This is the part I’m most excited about. Every deck you save gets chunked into plain text, embedded with Google’s text-embedding-004, and stored as vectors in Supabase pgvector. Next time you generate a deck for the same client, RAG pulls relevant past content into Claude’s context.

Month one - it knows our design system but not our voice. Month three - it picks up recurring themes and client language. Month six, “generate a client QBR” pulls from six months of history automatically. The more we use it, the more it sounds like us.

hiccups

#1 PPTX was a dead end. My first instinct was to generate PowerPoint files. PPTX is XML, and the output looked like a government form. Weeks of work on the Google Slides API too — powerful but rigid. Then I tried the existing AI deck builders (Gamma, Beautiful.ai, Tome). Generic templates, no brand control.

The breakthrough: HTML is the rendering layer, not PowerPoint. I proved it by generating our Trust Score deck — fully branded, fully correct — and that became the proof of concept.

#2 Quality gap. Early output was structurally correct but flat. Benchmarked it against raw Opus prompts and found four root causes. Added hybrid slides, tone presets, and reference injection. Dramatically better.

#3 Brand consistency across exports. Fonts, colors, and layouts would drift between the React preview, PDF export, and HTML export. Had to unify everything through CSS variables — one source of truth — and embed GT Walsheim + TT Hoves in every export path. 149 brand assets (backgrounds, icons, illustrations, logos, bean characters) loaded into the system.

what it costs

componentannual
Claude API (Sonnet)~$134
Google Embeddings~$1
Supabase$0 (free tier)
Vercel Hosting$0–$20
Total (20 users)~$134/year

That’s $6.70 per user per year. Less than a team lunch. The alternatives — Figma with Slides, Beautiful.ai, Gamma, Google Slides + labor — run $1,900 to $7,500 annually for the same headcount.

the build

12 sessions. 2 days. Claude and I as architects. 42 TypeScript files, 19 slide types, 149 brand assets, 25+ architectural decisions. Next.js 16, TypeScript, Tailwind v4, Supabase, Puppeteer.

It’s deployed on vercel now. The team can google auth

next

  • bypass print-to-pdf annoyances. i currently have a bash script that 2x the resolution of the slides and screenshots them as jpgs, and then exports that as the deck. 100% fidelity, and way less fuss.
  • more slide types as people request them
  • better voice-to-deck flow — right now you record, structure with AI, then generate. i want it tighter.
  • client-specific tone profiles that persist
  • usage analytics so I can see what’s actually getting built