Open-source AI-powered presentation builder. Describe your talk, AI generates beautiful animated slides. Edit with chat, click, or visual controls.
⚠️ IMPORTANT: No authentication is included. This app uses your Anthropic API key on the backend (ANTHROPIC_API_KEY). Every presentation generation and chat edit makes real API calls — Opus for planning, Sonnet for each slide and edit. Do NOT deploy publicly without adding authentication, or anyone can use your API key and run up costs. This is designed for local use or private/internal deployments only.
npm install
echo "ANTHROPIC_API_KEY=sk-ant-..." > .env.local
npm run devVisit http://localhost:3000
- Describe your talk — 4-step intake form: topic, audience, tone, duration, max slides, dos/don'ts
- Pick a color palette — 10 curated palettes (6 dark + 4 light) or let AI choose
- AI plans the structure — Claude Opus generates a rich outline with key messages, talking points, and suggested layouts per slide
- AI creates slides — Claude Sonnet generates each slide using the detailed outline context
- Edit 5 ways — Chat, click-to-edit text, visual toolbar, JSON editor, or AImprovise with Opus
- Manage slides — Add (with AI generation), duplicate, delete (with confirmation), and reorder
- Present — Full-screen animated presentation with keyboard navigation
- 4-step intake wizard (Identity, Context, Structure, Constraints)
- 12 slide types — title, agenda, context, content, comparison, data, demo, story, quote, action, closing, thankyou
- Max slides limit — control deck length (Auto / 8 / 12 / 16 / 20 / 25)
- 10 curated color palettes — Midnight, Ocean, Sunset, Forest, Royal, Ember, Neon (dark) + Slate, Cream, Arctic (light)
- Rich outlines — each slide gets slide type, key message, talking points, suggested components, and tone
- Editable outlines — modify every field (summary, type, key message, talking points) before generating
- Web search enrichment — Tavily API enriches slides with real facts/stats (optional, free tier: 1,000/month)
- Image search — Unsplash API finds relevant images for visual slides (optional, free tier: 50 req/hr)
- AI-generated custom themes (or use a palette — skips AI call, saves cost)
- SSE streaming — watch slides appear one by one as they generate
- Saved presentations list on landing page with edit/present/delete
- Form draft persistence — intake form saves to localStorage, survives page refresh
- AImprovise ✨ — Opus-powered slide redesign. Click the wand button, describe what to improve (or pick from 6 quick suggestions), and Opus rethinks the entire slide structure and content
- Chat-based editing — "make S2 more concise", "add a comparison table", "change the tone" (powered by Sonnet)
- Click-to-edit — Click any text (titles, bullets, body, quotes) to edit directly — no AI needed
- Section toolbar — Focus a section to get visual controls: alignment, font size, spacing, glass panel, color
- JSON editor — Press
Efor full control over slide data - AI-powered slide addition — Click +, describe what the slide should cover, AI generates it with full presentation context
- Slide management — Duplicate, delete (with confirmation), move up/down
- Palette switcher — Change the entire theme instantly from the toolbar
- Section IDs — Each section labeled (S1, S2, S3) for easy reference in chat
- Per-slide style overrides — Background color, text color, accent color, font, background image, overlay
- Per-section styles — Alignment, font scaling (zoom), glass panels, accent borders, spacing, color
- Per-column styles — Style individual columns independently
- Confirmation dialogs — All destructive operations (slide delete, presentation delete) require confirmation
- Welcome hints — First-time overlay explaining all editing methods
- Text: Body (with callout/quote variants), BulletList (muted/highlighted/numbered variants), QuoteBlock, CTABox
- Cards: IconCard (vertical/horizontal, with action text, tags, footer), CardGrid, ShowcaseCard
- Data: ComparisonTable, StatCallout, MetricRow, ChartBlock (bar/pie/line)
- Steps: NumberedSteps (compact/hero style)
- Media: ImageBlock, CodeBlock, HeroIcon
- Utility: Divider, TagList, PromptBlock, Spacer, Heading, TwoColumn
- Spring-physics slide transitions (Motion/React)
- Keyboard navigation (arrows, space, F for fullscreen)
- Background decorations (glow-pulse, gradient-blob, shimmer)
- Toggle between Workspace and Present mode from nav bar
- Next.js (App Router) + TypeScript
- Multi-provider AI — Anthropic, OpenRouter, or Ollama (configurable via env)
- Tailwind CSS v4 + Motion/React (spring animations)
- Lucide React (icons, 60+ brand fallback mappings) + Recharts (charts) + react-qr-code
- localStorage for persistence (no database)
- 10 curated color palettes with guaranteed readability
Presentify supports 3 AI providers. Configure in .env.local:
AI_PROVIDER=anthropic
ANTHROPIC_API_KEY=sk-ant-...AI_PROVIDER=openrouter
OPENROUTER_API_KEY=sk-or-...
AI_MODEL_PLANNING=anthropic/claude-opus-4.6
AI_MODEL_GENERATION=anthropic/claude-sonnet-4.6AI_PROVIDER=ollama
OLLAMA_BASE_URL=http://localhost:11434
AI_MODEL_PLANNING=llama3.3
AI_MODEL_GENERATION=llama3.3Model roles:
AI_MODEL_PLANNING— used for outline generation and AImprovise (needs strong reasoning)AI_MODEL_GENERATION— used for slide content, theme, and chat edits (needs fast JSON output)
You can mix providers by setting different models per role. Check current config at /api/provider-info.
Add real-world facts and images to your presentations. Both are optional -- if keys aren't set, generation works fine without them.
TAVILY_API_KEY=tvly-...- Free tier: 1,000 searches/month (no credit card required)
- Sign up: tavily.com
- What it does: During generation, searches for real facts/stats related to each slide topic and injects them into the AI prompt. Results in more specific, grounded content instead of generic AI filler.
UNSPLASH_ACCESS_KEY=...- Free tier: 50 requests/hour (demo), unlimited with approval
- Sign up: unsplash.com/developers
- What it does: Finds relevant high-quality photos for visual slides (title, context, story, quote, closing). Images include proper attribution.
| Route | What |
|---|---|
/ |
Landing page with saved presentations list |
/create |
Intake form → outline approval → AI generation |
/p/[id] |
Workspace: preview + chat + slide controls + section toolbar |
/p/[id]/present |
Full-screen presentation mode |
/p/sample/present |
Built-in sample presentation |
/help |
Component reference with JSON examples |
| Key | Action |
|---|---|
→ / Space |
Next slide |
← |
Previous slide |
F |
Fullscreen |
E |
JSON editor |
Each slide is ~15 lines of JSON:
{
"title": "AI is Your Superpower",
"titleAccent": "Superpower",
"subtitle": "What AI handles vs what you do",
"gap": "1.5rem",
"style": { "backgroundColor": "#1a1a2e", "primaryColor": "#FF9900" },
"sections": [
{
"type": "columns",
"columns": [
{ "component": "BulletList", "props": { "items": ["Write S3 policies", "Scaffold CDK"], "icon": "check-circle", "variant": "highlighted" } },
{ "component": "IconCard", "props": { "title": "Ship Fast", "desc": "Days not months", "layout": "horizontal", "action": "Try it today", "tags": ["AWS", "AI"] } }
],
"style": { "fontSize": "110%" }
}
]
}"style": {
"align": "center",
"fontSize": "125%",
"glass": true,
"accent": "#FF9900",
"spacing": "tight",
"color": "#FFFFFF",
"maxWidth": "600px"
}Per-column styles also supported for independent column styling.
"style": {
"backgroundColor": "#1a1a2e",
"textColor": "#e0e0e0",
"primaryColor": "#e74c3c",
"fontFamily": "Playfair Display",
"backgroundImage": "linear-gradient(135deg, #0f0c29, #302b63)",
"overlay": "rgba(0,0,0,0.5)"
}src/
app/ # Next.js routes + API
create/ # Intake form + generation flow
p/[id]/ # Workspace (chat editing)
p/[id]/present/ # Full-screen presentation
api/ # API routes (generate, edit-slide)
help/ # Component reference docs
agents/ # Claude AI agents
generateOutline.ts # Rich outline (Opus) — key messages + talking points
generateTheme.ts # Theme (Sonnet or palette bypass)
generateSlideContent.ts # Slides (Sonnet)
editSlide.ts # Chat editing (Sonnet)
improviseSlide.ts # AImprovise redesign (Opus)
orchestrator.ts # Batch generation
components/
slides/ # 21 slide components
renderer/ # SlideRenderer, PresentationRenderer, ThemeProvider, SectionToolbar
workspace/ # ChatPanel, SlideControls, WelcomeHints, ImproviseButton, PaletteSelector, ConfirmDialog
intake/ # IntakeWizard (4 steps)
outline/ # OutlineEditor
generation/ # GenerationView, GenerationProgress
lib/ # Types, store, icon resolver, markdown parser, palettes
styles/ # Global CSS + theme variables
- Authentication (protect API routes)
- BYOK (Bring Your Own Key) per user
- Export as standalone HTML
- Export as downloadable project
- Web search enrichment (Tavily)
- Image search (Unsplash)
- MCP server support (Brave Search, Exa)
- Undo/redo for edits
- Drag-to-reorder slides
- Dark/light theme toggle
- Multiple theme presets
- Presentation sharing/hosting
Works on Vercel, Netlify, or any Node.js host. Set ANTHROPIC_API_KEY as environment variable.
Before deploying publicly: Add authentication (e.g. NextAuth, Clerk) to protect the API routes. Without auth, anyone can trigger API calls on your key. See the roadmap for planned auth support.
MIT


