The Problem
Teams need polished, branded slide decks quickly, but the standard workflow — outline, copy, design, export — is slow and inconsistent. AI presentation tools lock users into rigid templates or opaque platforms. presentation-ai is an open-source, self-hostable alternative to Gamma.app that generates slides from a prompt and leaves the result fully editable.
What This Does
presentation-ai is a Next.js application that turns a topic prompt into a complete presentation. It uses an AI agent (src/ai/agents/presentation/createAgent.ts) to generate an outline, then slides, with live streaming into an editor. The editor is built on Plate.js and supports rich text, charts, infographics, and custom themes.
The repo contains 1,013 files, nearly all TypeScript/TSX. The core logic lives under src/components/notebook/presentation/editor/, with the AI orchestration in src/ai/. It persists data via Prisma/PostgreSQL and supports multiple LLM backends (OpenAI, Together AI, Ollama, LM Studio).
How It Is Wired
Execution starts at the Next.js API routes in src/app/api/presentation/. The main flow is generate/route.ts → createAgent.ts → LLM tool calls → slide content streamed back to the client. The client-side PresentationGenerationManager.tsx consumes the stream and renders into the Plate editor via EditablePlate.tsx.
The import graph shows two clear hubs with high blast radius:
src/components/notebook/presentation/editor/plugins/chart-plugin.tsx— 62 modules import it; 59 it imports. It sits inside an import cycle.src/components/notebook/presentation/editor/custom-elements/charts/ChartRenderer.tsx— 61 modules import it, but it only imports 4. It is a stable, widely-depended-on leaf.
Both are part of a 134-module circular dependency cluster. Changing chart-plugin.tsx ripples across dozens of files, and the cycle makes isolated refactoring risky. The editor/lib.tsx (50 importers) and editor/utils (45 importers) are also high-traffic modules.
How To Use It
# Install dependencies
pnpm install
# Set up environment
cp .env.example .env.local
# Fill in DATABASE_URL, auth secrets, and LLM API keys
# Run database migrations
pnpm prisma migrate dev
# Start the dev server
pnpm dev
The README documents these steps. The app requires PostgreSQL and at least one LLM provider key. The .env.example file lists the required variables. There is no Dockerfile, so deployment requires a Node.js host and a managed database.
Real-World Use
A marketing team needs a 10-slide product launch deck. They enter a prompt, pick a theme from the 38 built-in options, and the agent generates an outline. After edits, they export to .pptx or share a public link. The local-models route (src/app/api/presentation/local-models/route.ts) also allows running entirely on-prem with Ollama, which matters for regulated environments.
Code Health & Issues
Static analysis (not opinion) found 251 findings across 989 files: 159 high, 92 medium. The dominant issues:
- High - Oversized files —
ChartRenderer.tsxis 1,782 lines;editor/lib.tsxandutils/parser.tsare similarly large. Hard to reason about, high change risk. - High - Import cycles — 134 modules are in circular dependencies, including
chart-plugin.tsxandChartRenderer.tsx. Refactoring one requires understanding the whole loop. - High - No tests — 989 source files, zero test files. No CI pipeline exists either, so nothing runs the build on merge.
- Medium - Deep nesting —
parser.tsandChartEditorControls.tsxreach indentation depth 6. - Medium - Postinstall script —
package.jsonhas apostinstallthat fetches a binary; this is a supply-chain risk and should be gated in CI.
The Bottom Line
This is a feature-complete, ambitious product with real depth — the theme system, chart editor, and AI agent are substantial work. The trade-off is maintainability: no tests, no CI, and a tangled import graph make changes risky. Use it if you need a self-hosted Gamma alternative and are willing to invest in test coverage before extending it.