Updated June 2026 to reflect SlideForge v5. The public CSS-Flexbox spec endpoint (/v1/render/spec) was retired; declarative rendering now runs through structured intent (/v1/render/intent). The principle is unchanged — same input, same .pptx, every time.
SlideForge lets you build PowerPoint slides declaratively: pick a render pattern, fill its typed content, and get an editable .pptx — same input, same output, every time. 40+ design system components (Metric, BarList, OrgChart, ThreeHorizons, UnitEconomics, Tracker, etc.), 150+ catalog patterns, nested composition for exec dashboards and pricing tables, deterministic rendering in under 1 second. $0.05 per slide.
The problem with AI-generated slides
AI slide generation is powerful but unpredictable. Same brief, different layout. The AI picks fonts, spacing, and component placement every time. For dashboards, status reports, and data-heavy slides where you need exact control over the visual structure, “describe what you want” is the wrong interface.
What you want is: “render this exact pattern with this data, in the consulting_graphite theme.” Declarative, reproducible, fast.
Structured-intent rendering
POST /v1/render/intent renders a slide from a structured intent — no AI in the draw path. The most direct declarative form is a catalog pattern: pass a prior_id (the pattern) and a content object (your data). Same prior_id + same content = the same .pptx, byte for byte.
{
"prior_id": "kpi_status_dashboard__rag_metric_grid",
"content": {
"title": "Q1 2026 Dashboard",
"subtitle": "Executive Summary",
"metrics": [
{"value": "$12.4M", "label": "Revenue", "trend": "+18%", "status": "green"},
{"value": "847", "label": "New Clients", "trend": "+23%", "status": "green"},
{"value": "71%", "label": "Margin", "trend": "-2pp", "status": "amber"},
{"value": "4.6", "label": "NPS", "trend": "+0.3", "status": "green"}
],
"takeaway": "Revenue growth accelerating. Margin compression from APAC launch — expected to normalize Q3."
},
"theme_id": "consulting_graphite"
}The render call
curl -X POST https://api.slideforge.dev/v1/render/intent \
-H "Authorization: Bearer sf_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d @intent.json
# Response (200, synchronous):
# {
# "job_id": "intent-a1b2c3",
# "status": "complete",
# "pptx_url": "https://...",
# "preview_url": "https://...",
# "cost_charged": 0.05,
# "latency_ms": 340
# }Synchronous 200 response. No polling. Same intent = same output, every time.
Discover patterns + their content shape
Every catalog pattern carries a sample content and brief, so you never guess the shape. Browse with GET /v1/catalog, then GET /v1/catalog/{slug} for one pattern's detail — the slug is the prior_id you pass to /v1/render/intent.
curl "https://api.slideforge.dev/v1/catalog?q=kpi+dashboard&segment=metrics" \
-H "Authorization: Bearer sf_live_YOUR_KEY"
# Each item carries a slug (= prior_id), a sample content, and a sample brief.Available components
40+ components across 7 categories, with nested composition in SplitView and Card for richer layouts. Names follow Tremor-inspired conventions — if you've built dashboards in React, these names will feel familiar.
| Category | Components |
|---|---|
| Metrics | Metric, StatCard, UnitEconomics |
| Charts | BarList, BurndownChart, CapTable, Funnel, Heatmap, LineTrend, StackedBar, Waterfall |
| Layouts | Card, ComparisonTable, IconGrid, SplitView, Table |
| Content | Callout, Hero, Image, List, Testimonial |
| Diagrams | MaturityModel, OrgChart, Pyramid, Quadrant, Radial, Steps, ThreeHorizons, Timeline |
| Process | ArrowFlow, Gantt, Roadmap, Swimlane |
| Status | RAGScorecard, Tracker |
Browse the full form menu with JSON-Schema contracts at GET /v1/catalog/forms (per-form detail at GET /v1/catalog/forms/{form}); for code-mode building blocks use GET /v1/widgets and GET /v1/helpers.
Just have a brief? Let the engine route it
Don't want to pick a pattern yourself? POST /v1/render/auto takes a natural language brief and the SSG intent engine routes it to a deterministic pattern. And before you spend anything, /v1/render/intent with preview: true returns a free ephemeral PNG of a catalog pattern — see the quality first, pay only when you render for real.
# Free preview of a catalog pattern — no job, no charge, nothing downloadable
curl -X POST https://api.slideforge.dev/v1/render/intent \
-H "Authorization: Bearer sf_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"prior_id": "kpi_status_dashboard__rag_metric_grid", "content": {...}, "preview": true}'When to use intent vs brief vs code
| Approach | Best for | Speed | Cost |
|---|---|---|---|
| Intent render | A known pattern + your data, reproducible | <1s | $0.05 |
| Brief (auto) | Natural language → the engine picks the pattern | <1s | $0.05 |
| Code | Pixel-exact custom layouts (python-pptx) | ~0.5s | $0.05 |
Intent render sits between brief and code: more reproducible than a brief (you name the exact pattern), less work than code (you don't write any). All three are deterministic and $0.05.
Composition: components nested inside containers
Many catalog patterns compose components. SplitView's left / right and Card's cards[] can hold a nested {component, params} panel — a Metric block on the left of a SplitView, a BarList on the right — a real exec dashboard in one pattern. Allowlist, depth limit 2, structured errors; banned as nested children: Gantt, Swimlane, Timeline, Roadmap, OrgChart, ThreeHorizons, Testimonial. Full details in the composition guide.
Get started
Browse the form menu (/v1/catalog/forms), read the render docs, or sign up for 60 free slides.