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.tscreateAgent.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 filesChartRenderer.tsx is 1,782 lines; editor/lib.tsx and utils/parser.ts are similarly large. Hard to reason about, high change risk.
  • High - Import cycles — 134 modules are in circular dependencies, including chart-plugin.tsx and ChartRenderer.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 nestingparser.ts and ChartEditorControls.tsx reach indentation depth 6.
  • Medium - Postinstall scriptpackage.json has a postinstall that 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.