Guide2026-04-138 min

Declarative Slides for PowerPoint (Structured Intent)

Build PowerPoint slides declaratively: pick a catalog pattern, fill its typed content, render via /v1/render/intent. Same input, same .pptx — 40+ components, <1s, $0.05.

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.

CategoryComponents
MetricsMetric, StatCard, UnitEconomics
ChartsBarList, BurndownChart, CapTable, Funnel, Heatmap, LineTrend, StackedBar, Waterfall
LayoutsCard, ComparisonTable, IconGrid, SplitView, Table
ContentCallout, Hero, Image, List, Testimonial
DiagramsMaturityModel, OrgChart, Pyramid, Quadrant, Radial, Steps, ThreeHorizons, Timeline
ProcessArrowFlow, Gantt, Roadmap, Swimlane
StatusRAGScorecard, 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

ApproachBest forSpeedCost
Intent renderA known pattern + your data, reproducible<1s$0.05
Brief (auto)Natural language → the engine picks the pattern<1s$0.05
CodePixel-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.

Try SlideForge free

60 free slides, no card required. Generate your first slide in under a minute.