8.1 KiB
| name | client | status | tech | local_path | deploy | url | tags | created | server | port | db | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Presenton | Open-source (presenton.ai) | active |
|
/Users/ai_leed/Documents/Projects/Oliver/presenton | docker compose up production | http://localhost:5000 |
|
2026-04-14 | local | 5000 | SQLite |
Overview
Presenton is an open-source, self-hosted AI presentation generator that transforms prompts, documents, or existing PPTX files into fully designed presentations (PPTX/PDF format). It supports multiple LLM providers (OpenAI, Google, Anthropic, Ollama, custom endpoints) and image providers (DALL-E, Gemini, Pexels, ComfyUI), includes a built-in MCP server for AI agent integration, and exposes a REST API for programmatic access. The project is production-ready, actively maintained, and Apache 2.0 licensed.
Tech Stack
- Frontend: Next.js 14 (App Router), React, Redux Toolkit, TypeScript
- Backend: FastAPI (Python 3.11), SQLModel (ORM), uvicorn
- Database: SQLite (default, can override with PostgreSQL/MySQL via
DATABASE_URL) - Infrastructure: Docker (single container), nginx reverse proxy, LibreOffice (PDF export), Puppeteer/Chromium
- AI/ML: OpenAI (GPT-4, DALL-E, GPT-Image-1.5), Google Gemini, Anthropic Claude, Ollama (local models), custom OpenAI-compatible endpoints
- Key libraries: python-pptx (PPTX generation), docling/pdfplumber (document extraction), fastmcp (MCP server), Pillow (image processing)
Architecture
Presenton runs as a single Docker container with four coordinated processes spawned by start.js:
- nginx (port 80) — reverse proxy and static file server
- FastAPI (port 8000) — backend REST API and core logic
- Next.js (port 3000) — frontend SSR
- MCP Server (port 8001) — AI agent integration via Claude Desktop
- Ollama (port 11434) — optional local LLM serving
All processes are internally networked; external access is exclusively through nginx on port 80 (mapped to host port 5000).
Presentation Generation Pipeline
User Input (prompt/files/PPTX)
↓
[Outline Generation] — LLM streams slide outlines (SSE)
↓
[Structure Assignment] — LLM assigns layout index per slide
↓
[Slide Content] — Batch of 10 slides: content generation
↓
[Asset Fetching] — Images fetched/generated concurrently per slide
↓
[Export] — python-pptx builds PPTX; LibreOffice converts to PDF
↓
[Webhook] — presentation.generation.completed event fired
Data Model
- PresentationModel — metadata (title, template, status, content type)
- SlideModel[] — per-slide content (outline, title, bullet points, speaker notes, layout index)
- ImageAsset[] — images per slide (URL, provider, generation prompt, alt text)
All persisted in SQLite at /app_data/fastapi.db.
Dev Commands
FastAPI Backend
cd servers/fastapi
# Install uv package manager
pip install uv
# Install dependencies
uv sync
# Run development server (requires APP_DATA_DIRECTORY env var)
APP_DATA_DIRECTORY=./app_data uv run python server.py --port 8000
# Run tests
uv run pytest
# Lint/format
uv run ruff check .
Next.js Frontend
cd servers/nextjs
# Install dependencies
npm install
# Dev mode with HMR (connects to FastAPI at localhost:8000)
npm run dev
# Production build
npm run build
npm run start
# Lint
npm run lint
# E2E tests (Cypress)
npx cypress open # interactive
npx cypress run # headless
Full Stack (Docker)
# Development with hot-reload
docker compose up development
# Production
docker compose up production
# GPU-accelerated (NVIDIA)
docker compose up production-gpu
# View logs
docker compose logs -f production
# Stop and clean up
docker compose down
Deployment
- Server: Local (self-hosted)
- Deploy:
docker compose up productionordocker run -it --name presenton -p 5000:80 [env vars] ghcr.io/presenton/presenton:latest - URL:
http://localhost:5000 - Port: 5000 (host) → 80 (container)
- Service: None (container-based)
- Local path:
/Users/ai_leed/Documents/Projects/Oliver/presenton - Image:
ghcr.io/presenton/presenton:latest - Base:
python:3.11-slim-bookworm - Persistent volume:
./app_data → /app_data
Quick Start
git clone https://github.com/presenton/presenton.git
cd presenton
docker run -it --name presenton -p 5000:80 \
-e LLM="openai" \
-e OPENAI_API_KEY="sk-..." \
-e IMAGE_PROVIDER="dall-e-3" \
-v "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
# Open http://localhost:5000
Environment Variables
LLM Configuration:
LLM— Provider:openai,google,anthropic,ollama,customOPENAI_API_KEY— OpenAI API key (required for OpenAI LLM or DALL-E/GPT-Image)OPENAI_MODEL— Model ID (default:gpt-4-1)GOOGLE_API_KEY— Google API key (Gemini LLM or image generation)GOOGLE_MODEL— Gemini model ID (default:models/gemini-2.0-flash)ANTHROPIC_API_KEY— Claude API keyANTHROPIC_MODEL— Claude model ID (default:claude-3-5-sonnet-20241022)OLLAMA_URL— Ollama server (default:http://localhost:11434)OLLAMA_MODEL— Model to use (e.g.,llama3.2:3b)CUSTOM_LLM_URL— OpenAI-compatible endpoint URLCUSTOM_LLM_API_KEY— API key for custom endpointCUSTOM_MODEL— Model ID for custom endpointTOOL_CALLS— Use tool calls for structured output (default:false)DISABLE_THINKING— Disable chain-of-thought (default:false)EXTENDED_REASONING— Enable extended reasoning (default: empty)WEB_GROUNDING— Enable LLM web search (default:false)
Image Provider Configuration:
IMAGE_PROVIDER— Provider:dall-e-3,gpt-image-1.5,gemini,pexels,pixabay,comfyuiPEXELS_API_KEY— Pexels API keyPIXABAY_API_KEY— Pixabay API keyCOMFYUI_URL— ComfyUI server URL (for local image generation)COMFYUI_WORKFLOW— ComfyUI workflow JSON path
Data & Infrastructure:
APP_DATA_DIRECTORY— Root for persistent data (default:/app_data)TEMP_DIRECTORY— Temp file staging (default:/tmp/presenton)DATABASE_URL— Override SQLite; usepostgresql://ormysql://for other DBsPUPPETEER_EXECUTABLE_PATH— Chromium path (default:/usr/bin/chromium)CAN_CHANGE_KEYS— Allow UI to modify API keys (default:true)
API / Endpoints
REST API Base: http://localhost:5000/api/v1/
Key Endpoints:
POST /ppt/presentation/generate— Generate presentation (sync, returns PPTX/PDF path)POST /ppt/presentation/create— Save new presentation (returns ID)GET /ppt/outlines/stream/{id}— Stream outline JSON (SSE)POST /ppt/presentation/prepare— Assign layouts and structureGET /ppt/presentation/stream/{id}— Stream slide content (SSE)POST /ppt/presentation/export— Export to PPTX or PDFPOST /ppt/pptx-slides/process— Analyze uploaded PPTX (extract slides, fonts, XML)POST /ppt/slide-to-html/— Convert PPTX slide to HTML
MCP Server:
http://localhost:5000/mcp— FastMCP HTTP endpoint for Claude Desktop integration
Swagger UI: http://localhost:5000/docs
Known Issues
- None explicitly documented in provided files. Refer to GitHub issues at https://github.com/presenton/presenton/issues
Git
- Remote:
https://github.com/presenton/presenton.git - Latest commits: Recent work includes new templates refactor, MCP OpenAI spec fixes, Ukrainian language support, GPT-Image-1.5 integration, local ComfyUI image provider support, and NanoBanana integration
- License: Apache 2.0
Additional Resources
- Architecture & Design: See
docs/project/architecture.mdfor detailed data flows and component interactions
Sessions
2026-04-14 – Project catalogued
Done: Added to Obsidian second brain.
Change Log
| Date | Requested | Changed | Files |
|---|---|---|---|
| 2026-04-14 | Initial setup | Note created | — |