DeckForge
Allows generating slide content using Google's Gemini model.
Allows exporting presentations directly to Google Slides.
Allows generating slide content using locally hosted Ollama models.
Allows generating slide content using OpenAI's GPT models.
Provides billing and payment processing for API usage.
Provides a TypeScript SDK for programmatic access to DeckForge API.
Executive-ready slides, one API call away. Send a JSON intermediate representation (IR) or a natural-language prompt and get back a .pptx file or Google Slides deck -- with professional layout, consistent branding, and verified quality.
🚀 Using DeckForge in production — or want higher limits, priority support, or a specific slide/chart capability? Tell me about your use case → — I read every one.
What this solves
Your agent needs to turn a structured slide spec into a real PowerPoint — without a headless Office install or hand-written python-pptx code. Send a Presentation IR (slides, elements, theme) to
renderand get a themed.pptx(or Google Slides) deck plus a quality score and a count of layout/QA issues.Your agent needs a deck from a one-line prompt — without designing the narrative itself.
generateruns a 4-stage content pipeline (intent → outline → expand → refine) that picks slide types and writes content, returning a structured IR you can thenrender.You need finance-flavored slides — without rebuilding DCF, comp-table, waterfall, or returns layouts every time. 9 finance slide types and finance-oriented chart types (waterfall, tornado, football field, sensitivity table) are first-class IR, so a model output of numbers becomes an auditable, themed slide.
Your agent must choose valid
slide_type,theme, and chart values at runtime — without guessing.themes(15) andslide_types(32: 23 universal + 9 finance, with required/optional elements) are discovery tools that return the exact identifiers and element requirements to build correct IR.You need a deterministic cost before spending on a render — without trial calls.
cost_estimatecomputes credits fromceil(slides/10)plus per-finance-slide and per-chart surcharges, returning a breakdown and USD equivalent so an autonomous agent can budget before it acts.You want decks to be consistent and machine-checked — without a human design pass. Every render runs a QA pipeline with auto-fix for contrast, overflow, and alignment, and reports a
quality_scoreandqa_issuescount back to the caller.
Related MCP server: Slidespeak
Features
32 slide types -- title, agenda, bullet points, comparison, timeline, process flow, org chart, stats callout, table, chart, matrix, funnel, map, and more
9 finance-specific slides -- DCF summary, comp table, waterfall chart, deal overview, returns analysis, capital structure, market landscape, risk matrix, investment thesis
24 chart types -- bar, line, area, pie, donut, scatter, bubble, combo, waterfall, funnel, treemap, radar, tornado, football field, sensitivity table, heatmap, sankey, gantt, sunburst, and more
15 built-in themes -- corporate-blue, executive-dark, finance-pro, modern-gradient, minimal-light, tech-neon, and 9 others (plus custom brand kits)
Native PPTX output -- python-pptx rendering with element-level control, transitions, and chart embedding
Google Slides output -- direct export via Google Slides API (OAuth flow included)
AI content generation -- natural-language to slides via Claude, OpenAI, Gemini, or Ollama (4-stage pipeline: intent, outline, expand, refine)
5-pass QA pipeline -- automated quality checks with auto-fix engine for contrast, overflow, alignment, and more
Constraint-based layout -- kiwisolver constraint solver, 12-column grid, adaptive overflow (font reduce, reflow, split)
MCP server -- 6 tools for AI agent integration (render, generate, themes, slide_types, cost_estimate, pricing)
x402 payment middleware -- optional per-call USDC support (Base L2) for self-hosted deployments; disabled by default
Billing infrastructure -- Stripe subscription + credit-system support for self-hosted deployments (no hosted paid plans are offered yet)
TypeScript SDK --
@lukastan/deckforgewith fluent builder pattern, full type safety, SSE streaming
Quick Start
Get from zero to your first rendered deck in under 5 minutes.
Prerequisites
Steps
# 1. Clone the repo
git clone https://github.com/Whatsonyourmind/deckforge && cd deckforge
# 2. Copy environment config (works out of the box for local dev)
cp .env.example .env
# 3. Start all services (API, workers, PostgreSQL, Redis, MinIO)
docker compose up -d
# 4. Initialize the database (runs migrations, seeds test user + API key)
bash scripts/bootstrap-db.sh
# 5. Verify the API is running
curl http://localhost:8000/v1/health
# => {"status":"healthy"}The bootstrap script outputs a test API key (dk_test_...). Save it for the examples below.
API Examples
Render a deck from IR
curl -X POST http://localhost:8000/v1/render \
-H "Authorization: Bearer dk_test_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"title": "Q4 Board Update",
"theme": "corporate-blue",
"slides": [
{
"slide_type": "title_slide",
"elements": [
{"type": "title", "content": "Q4 2026 Board Update"},
{"type": "subtitle", "content": "Acme Corp -- Confidential"}
]
},
{
"slide_type": "stats_callout",
"elements": [
{"type": "title", "content": "Key Metrics"},
{"type": "metric", "content": "$4.2M", "label": "ARR"},
{"type": "metric", "content": "142%", "label": "YoY Growth"},
{"type": "metric", "content": "94%", "label": "Retention"}
]
}
]
}' \
--output board-update.pptxGenerate a deck from natural language
curl -X POST http://localhost:8000/v1/generate \
-H "Authorization: Bearer dk_test_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Create a 10-slide pitch deck for a B2B SaaS startup in the cybersecurity space, Series A, $2M ARR",
"theme": "executive-dark",
"output_format": "pptx"
}' \
--output pitch-deck.pptxNote: The
/v1/generateendpoint requires at least one LLM API key configured in.env(Anthropic, OpenAI, Gemini, or Ollama).
Check available themes and slide types
# List all 15 themes
curl http://localhost:8000/v1/themes
# List all 32 slide types with example IR
curl http://localhost:8000/v1/slide-types
# Estimate credit cost before rendering
curl -X POST http://localhost:8000/v1/estimate \
-H "Authorization: Bearer dk_test_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"slides": [{"slide_type": "title_slide"}, {"slide_type": "chart_slide"}]}'TypeScript SDK
Install from npm:
npm install @lukastan/deckforgeFluent builder with full type safety:
import { DeckForge, Presentation, Slides } from "@lukastan/deckforge";
const client = new DeckForge({ apiKey: "dk_test_YOUR_KEY_HERE" });
const deck = Presentation.create("Q4 Board Update", "corporate-blue")
.addSlide(
Slides.titleSlide({
title: "Q4 2026 Board Update",
subtitle: "Acme Corp -- Confidential",
})
)
.addSlide(
Slides.statsCallout({
title: "Key Metrics",
metrics: [
{ value: "$4.2M", label: "ARR" },
{ value: "142%", label: "YoY Growth" },
{ value: "94%", label: "Retention" },
],
})
);
const pptx = await client.render(deck);
// => Buffer containing .pptx fileGenerate from a prompt with SSE streaming:
const stream = client.generate({
prompt: "Create a PE deal memo for a $500M LBO of a healthcare platform",
theme: "finance-pro",
});
for await (const event of stream) {
console.log(`${event.stage}: ${event.message}`);
}
// intent: Analyzing prompt for presentation structure...
// outline: Creating 12-slide deal memo outline...
// expand: Generating slide content...
// refine: Running QA pipeline (5 passes)...
// complete: Deck ready for downloadArchitecture
+------------------+
| Clients |
| (curl/SDK/MCP) |
+--------+---------+
|
+--------v---------+
| FastAPI (uvicorn)|
| /v1/* routes |
| Auth + Rate Limit|
| Credit Billing |
+--+-----+------+--+
| | |
+-----------+ | +----------+
| | |
+--------v------+ +------v--------+ +------v--------+
| Content Worker | | Render Worker | | Sync Path |
| (ARQ + Redis) | | (ARQ + Redis) | | (< 10 slides) |
| NL -> IR | | IR -> PPTX | | Direct return |
+--------+------+ +------+--------+ +------+--------+
| | |
v v v
+--------+------+ +------+---------+ +-----+--------+
| LLM Adapters | | PPTX Renderer | | Google Slides|
| Claude/GPT/ | | Layout Engine | | Renderer |
| Gemini/Ollama | | Theme Resolver | | (OAuth) |
+---------------+ | Chart Renderer | +--------------+
| QA Pipeline |
+------+---------+
|
+------v---------+
| Storage |
| MinIO (dev) |
| R2/S3 (prod) |
+----------------+
+----------------+ +----------------+
| PostgreSQL | | Redis |
| Users, Keys | | Queue, Cache |
| Jobs, Decks | | Rate Limits |
| Billing | | SSE Pub/Sub |
+----------------+ +----------------+API Routes
All routes are mounted under the /v1 prefix. Interactive docs at http://localhost:8000/docs.
Endpoint | Method | Auth | Description |
| GET | No | Health check |
| POST | API key | Render IR to PPTX/Google Slides |
| POST | API key | Generate slides from natural language |
| POST | API key | Generate thumbnail PNGs |
| POST | API key | Estimate credit cost |
| GET | API key | Check async job status |
| GET | No | List available themes |
| GET | No | List slide types with examples |
| GET/POST/DELETE | API key | Deck CRUD operations |
| POST | API key | Batch render multiple decks |
| GET/POST/DELETE | API key | Manage webhook subscriptions |
| Various | API key | Stripe subscription management |
| GET | No | Current pricing and tier info |
| POST | No | Create account and API key |
| GET | Admin | Usage analytics and metrics |
| GET | API key | Google OAuth flow for Slides |
Environment Variables
All variables are prefixed with DECKFORGE_. See .env.example for the complete reference with comments and example values.
Variable | Default | Description |
|
| PostgreSQL connection string |
|
| Redis connection (queue, cache, pub/sub) |
|
| S3-compatible storage endpoint |
|
| S3 access key (MinIO default for dev) |
|
| S3 secret key |
|
| S3 bucket name |
|
| API bind address |
|
| API port |
|
| Debug mode (disable in production) |
|
|
|
|
| Default LLM for content generation |
|
| LLM fallback order |
| -- | Anthropic API key for Claude |
| -- | OpenAI API key |
| -- | Google Gemini API key |
|
| Ollama local server URL |
| -- | Stripe secret key |
| -- | Stripe webhook signing secret |
| -- | Stripe price ID for Starter tier |
| -- | Stripe price ID for Pro tier |
| -- | Google OAuth client ID (for Slides) |
| -- | Google OAuth client secret |
|
| OAuth redirect URI |
| -- | Unkey root key (production auth) |
| -- | Unkey API ID |
|
| Enable x402 USDC payments |
| -- | USDC receiving wallet on Base |
|
| x402 facilitator endpoint |
|
| Base Mainnet chain ID |
Deployment
Render (recommended)
The hosted production API runs on Render at https://deckforge-api.onrender.com. DeckForge ships a render.yaml blueprint:
In the Render dashboard choose New → Blueprint and point it at this repo — Render reads
render.yaml(web service + worker + managed Postgres + Redis).Set production secrets (Stripe / Anthropic / S3) in the service's Environment tab, then trigger the first deploy.
# Verify
curl https://deckforge-api.onrender.com/v1/healthFly.io (alternative)
DeckForge also ships a production-ready fly.toml and multi-stage Dockerfile.
# 1. Install Fly CLI
curl -L https://fly.io/install.sh | sh
# 2. Login and launch
fly auth login
fly launch --name deckforge-api --region iad
# 3. Provision PostgreSQL
fly postgres create --name deckforge-db --region iad
fly postgres attach deckforge-db
# 4. Provision Redis (via Upstash or Fly Redis)
fly redis create --name deckforge-redis
# Copy the REDIS_URL from output
# 5. Set production secrets
fly secrets set \
DECKFORGE_ENVIRONMENT=production \
DECKFORGE_DEBUG=false \
DECKFORGE_DATABASE_URL="postgres://..." \
DECKFORGE_REDIS_URL="redis://..." \
DECKFORGE_S3_ENDPOINT_URL="https://..." \
DECKFORGE_S3_ACCESS_KEY="..." \
DECKFORGE_S3_SECRET_KEY="..." \
DECKFORGE_S3_BUCKET="deckforge" \
DECKFORGE_STRIPE_SECRET_KEY="sk_live_..." \
DECKFORGE_STRIPE_WEBHOOK_SECRET="whsec_..." \
DECKFORGE_ANTHROPIC_API_KEY="sk-ant-..."
# 6. Deploy
fly deploy
# 7. Run database migrations
fly ssh console -C "alembic upgrade head"
# 8. Verify
curl https://<your-app>.fly.dev/v1/healthFly.io configuration highlights:
2 shared CPUs, 1 GB RAM per VM
Auto-stop/start for cost efficiency (min 1 machine running)
Forced HTTPS with concurrency limits (200 soft / 250 hard)
Multi-process:
api(uvicorn) +worker(ARQ)
Docker Compose (Local Development)
# Start all 6 services
docker compose up -d
# Services:
# api - FastAPI + uvicorn (port 8000)
# content-worker - ARQ worker for NL-to-IR generation
# render-worker - ARQ worker for IR-to-PPTX rendering
# postgres - PostgreSQL 16 (port 5432)
# redis - Redis 7 (port 6379)
# minio - MinIO S3-compatible storage (port 9000, console 9001)
# Check service health
docker compose ps
# View API logs
docker compose logs -f api
# Tear down (preserves data volumes)
docker compose down
# Full reset (removes data)
docker compose down -vS3 Storage Options
Environment | Provider | Config |
Local dev | MinIO (via Docker Compose) | Default |
Production | Cloudflare R2 | Set |
Production | AWS S3 | Set |
Fly.io | Fly Tigris |
|
Pricing
Pricing is not yet available — there are no paid plans you can purchase today. Want a hosted or commercial version, higher limits, or priority support? Join Early Access →
The billing code in this repo (Stripe subscriptions, credit system, x402 USDC middleware) is infrastructure for self-hosted deployments and is disabled by default.
Credit Cost (engine mechanics)
Each API call consumes credits based on complexity:
Simple render (< 5 slides): 1 credit
Standard render (5-20 slides): 2-3 credits
Complex render (charts, finance slides): 3-5 credits
Content generation (NL-to-IR): +2 credits (LLM usage)
Demo Decks
Five production-quality demo IRs in demos/:
Demo | Slides | Theme | Use Case |
12 | corporate-blue | Strategy consulting deck | |
10 | finance-pro | Private equity investment committee | |
12 | modern-gradient | Series A fundraising | |
8 | executive-dark | Quarterly board meeting | |
10 | tech-neon | Product launch announcement |
Render any demo:
curl -X POST http://localhost:8000/v1/render \
-H "Authorization: Bearer dk_test_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d @demos/mckinsey-strategy/ir.json \
--output mckinsey-strategy.pptxIntegrations
MCP Server (AI Agents)
DeckForge includes a Model Context Protocol server with 6 tools:
{
"mcpServers": {
"deckforge": {
"command": "python",
"args": ["-m", "deckforge.mcp.server"]
}
}
}Tools: render, generate, themes, slide_types, cost_estimate, pricing
Agent Framework Support
LangChain -- render + generate tool classes
CrewAI -- unified tool with action parameter
AutoGen -- plain function tools with
Annotatedtypes
See demos/ for integration examples.
Links
Contributing
Fork the repo
Create a feature branch (
git checkout -b feature/my-feature)Run tests (
pytestfor Python,cd sdk && npm testfor TypeScript)Commit and push
Open a Pull Request
License
This server cannot be installed
Maintenance
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Whatsonyourmind/deckforge'
If you have feedback or need assistance with the MCP directory API, please join our Discord server