docs: preserve upstream English README
This commit is contained in:
+701
@@ -0,0 +1,701 @@
|
||||
<p align="center">
|
||||
<img src="./readme_assets/images/logo.png" alt="Presenton" />
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://presenton.ai/download"><strong>Quickstart</strong></a> ·
|
||||
<a href="https://docs.presenton.ai/"><strong>Docs</strong></a> ·
|
||||
<a href="https://www.youtube.com/@presentonai"><strong>Youtube</strong></a> ·
|
||||
<a href="https://discord.gg/9ZsKKxudNE"><strong>Discord</strong></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/presenton/presenton/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-Apache%202.0-blue?style=flat" alt="Apache2.0" /></a>
|
||||
<a href="https://github.com/presenton/presenton"><img src="https://img.shields.io/github/stars/presenton/presenton?style=flat" alt="Stars" /></a>
|
||||
<a href="https://presenton.ai/"><img src="https://img.shields.io/badge/Platform-Docker%20%7C%20Windows%20%7C%20macOS%20%7C%20Linux-lightgrey?style=flat" alt="Platform" /></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://trendshift.io/repositories/18582?utm_source=repository-badge&utm_medium=badge&utm_campaign=badge-repository-18582" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/repositories/18582" alt="presenton%2Fpresenton | Trendshift" width="250" height="55" /></a>
|
||||
</p>
|
||||
|
||||
# Open-Source AI Presentation Generator and API (Gamma, Canva, Beautiful AI, Decktopus, Presentations AI Alternative)
|
||||
|
||||
Discover what Presenton can do from AI-powered presentation generation to editing, exporting, and flexible model providers.
|
||||
|
||||
[▶ Watch Presenton in Action](https://github.com/user-attachments/assets/93e541dc-8487-4dcf-a9a0-95ad5ca94453)
|
||||
|
||||
### ✨ Why Presenton
|
||||
|
||||
No SaaS lock-in · No forced subscriptions · Full control over models and data
|
||||
|
||||
What makes Presenton different?
|
||||
|
||||
- Use Fully **self-hosted** in Web through [Docker Package](https://docs.presenton.ai/v3/get-started/quickstart)
|
||||
- Or Download [Desktop App](https://presenton.ai/download) (Mac, Windows & Linux)
|
||||
- Works with Ollama, LM Studio, OpenAI, Gemini, Vertex AI, Azure OpenAI, Amazon Bedrock, Fireworks, Together AI, Anthropic, or any other OpenAI compatible providers
|
||||
- Comes with AI Presentation Generation API
|
||||
- Fully open-source (Apache 2.0)
|
||||
- Works with your own design/templates
|
||||
- **Fully editable PPTX export**
|
||||
|
||||
> [!TIP]
|
||||
> **Star us!** A ⭐ shows your support and encourages us to keep building! 😇
|
||||
|
||||
<p align="center">
|
||||
<img src="./readme_assets/images/banner_bg.gif" alt="Presenton" />
|
||||
</p>
|
||||
|
||||
#
|
||||
|
||||
### 🎛 Features
|
||||
|
||||
<p align="center">
|
||||
<img src="./readme_assets/images/features.png" alt="Presenton Features" />
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="./readme_assets/images/chatgpt-2-1.png" alt="Create stunning presentations with your existing ChatGPT subscription — secure and private, instant access, no API keys" />
|
||||
</p>
|
||||
|
||||
#
|
||||
|
||||
### 💻 Presenton Desktop
|
||||
|
||||
Create AI-powered presentations using your own model provider (BYOK) or run everything locally on your own machine for full control and data privacy.
|
||||
|
||||
<p align="center">
|
||||
<a href="https://presenton.ai/download">
|
||||
<img src="./readme_assets/images/banner.png" alt="Cloud deployment" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
**Available Platforms**
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th align="left">Platform</th>
|
||||
<th align="left">Architecture</th>
|
||||
<th align="left">Package</th>
|
||||
<th align="left">Download</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><b>macOS</b></td>
|
||||
<td>Apple Silicon / Intel</td>
|
||||
<td><code>.dmg</code></td>
|
||||
<td><a href="https://presenton.ai/download">Download ↗</a></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><b>Windows</b></td>
|
||||
<td>x64</td>
|
||||
<td><code>.exe</code></td>
|
||||
<td><a href="https://presenton.ai/download">Download ↗</a></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><b>Linux</b></td>
|
||||
<td>x64</td>
|
||||
<td> <code>.deb</code></td>
|
||||
<td><a href="https://presenton.ai/download">Download ↗</a></td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
**Deploy to Cloud Providers**
|
||||
|
||||
<div style="display:flex; gap:12px; align-items:center;">
|
||||
<a href="https://railway.com/deploy/presenton-ai-presentations">
|
||||
<img
|
||||
src="https://railway.com/button.svg"
|
||||
alt="Deploy on Railway"
|
||||
style="height:38px;"
|
||||
/>
|
||||
</a>
|
||||
<a href="https://cloud.digitalocean.com/apps/new?repo=https://github.com/presenton/presenton/tree/main">
|
||||
<img
|
||||
src="https://www.deploytodo.com/do-btn-blue.svg"
|
||||
alt="Deploy to DigitalOcean"
|
||||
style="height:36px;"
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
#
|
||||
|
||||
Presenton gives you complete control over your AI presentation workflow. Choose your models, customize your experience, and keep your data private.
|
||||
|
||||
- Custom Templates & Themes — Create unlimited presentation designs with HTML and Tailwind CSS
|
||||
- AI Template Generation — Create presentation templates from existing Powerpoint documents.
|
||||
- Flexible Generation — Build presentations from prompts or uploaded documents
|
||||
- Export Ready — Save as PowerPoint (PPTX) and PDF with professional formatting
|
||||
- Built-In MCP Server — Generate presentations over Model Context Protocol
|
||||
- Bring Your Own Key — Use your own API keys for OpenAI, Google Gemini, Vertex AI, Azure OpenAI, Anthropic Claude, or any compatible provider. Only pay for what you use, no hidden fees or subscriptions.
|
||||
- Ollama Integration — Run open-source models locally with full privacy
|
||||
- OpenAI API Compatible — Connect to any OpenAI-compatible endpoint with your own models
|
||||
- Multi-Provider Support — Mix and match text and image generation providers
|
||||
- Versatile Image Generation — Choose from DALL-E 3, Gemini Flash, Pexels, or Pixabay
|
||||
- Rich Media Support — Icons, charts, and custom graphics for professional presentations
|
||||
- Runs Locally — All processing happens on your device, no cloud dependencies
|
||||
- API Deployment — Host as your own API service for your team
|
||||
- Fully Open-Source — Apache 2.0 licensed, inspect, modify, and contribute
|
||||
- Docker Ready — One-command deployment with GPU support for local models
|
||||
- Electron Desktop App — Run Presenton as a native desktop application on Windows, macOS, and Linux (no browser required)
|
||||
- Sign in with ChatGPT — Use your free or paid ChatGPT account to sign in and start creating presentations instantly — no separate API key required
|
||||
|
||||
#
|
||||
|
||||
### ☁️ Presenton Cloud
|
||||
|
||||
Run Presenton directly in your browser — no installation, no setup required. Start creating presentations instantly from anywhere.
|
||||
|
||||
<p align="center">
|
||||
<a href="https://presenton.ai">
|
||||
<img src="./readme_assets/images/cloud-banner.png" alt="Presenton Cloud" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
#
|
||||
|
||||
### ⚡ Running Presenton
|
||||
|
||||
<p>
|
||||
You can run Presenton in two ways:
|
||||
<strong>Docker</strong> for a one-command setup without installing a local dev
|
||||
stack, or the <strong>Electron desktop app</strong> for a native app
|
||||
experience (ideal for development or offline use).
|
||||
</p>
|
||||
|
||||
**Option 1: Electron (Desktop App)**
|
||||
|
||||
<p>
|
||||
Run Presenton as a native desktop application. LLM and image provider
|
||||
(API keys, etc.) can be configured in the app. The same environment variables
|
||||
used for Docker apply when running the bundled backend.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<strong>Prerequisites:</strong> Node.js (LTS), npm, Python 3.11, and
|
||||
<a href="https://docs.astral.sh/uv/">uv</a>
|
||||
(for the shared FastAPI backend in <code>servers/fastapi</code>).
|
||||
</p>
|
||||
|
||||
- Setup (First Time)
|
||||
<pre><code class="language-bash">cd electron
|
||||
npm run setup:env</code></pre>
|
||||
|
||||
This installs Node dependencies, runs <code>uv sync</code> in the FastAPI
|
||||
server, and installs Next.js dependencies.
|
||||
|
||||
- Run in Development
|
||||
<pre><code class="language-bash">npm run dev</code></pre>
|
||||
<p>
|
||||
This compiles TypeScript and starts Electron. The backend and UI run locally
|
||||
inside the desktop window.
|
||||
</p>
|
||||
|
||||
- Build Distributable (Optional)
|
||||
To create installers for Windows, macOS, or Linux:
|
||||
<pre><code class="language-bash">npm run build:all
|
||||
npm run dist</code></pre>
|
||||
<p>
|
||||
Output files are written to <code>electron/dist</code>
|
||||
(or as configured in your <code>electron-builder</code> settings).
|
||||
</p>
|
||||
<p>
|
||||
For a public macOS DMG outside the Mac App Store, use
|
||||
<code>APPLE_KEYCHAIN_PROFILE="presenton-notary" npm run build:all:mac:signed</code>
|
||||
from <code>electron/</code> after the one-time Developer ID and notarization
|
||||
setup in <code>docs/macos/dev/direct-distribution.md</code>.
|
||||
</p>
|
||||
|
||||
**Option 2: Docker**
|
||||
|
||||
- Start Presenton
|
||||
Linux/MacOS (Bash/Zsh Shell):
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
Windows (PowerShell):
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -v "${PWD}\app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Open Presenton
|
||||
<p>
|
||||
Open <a href="http://localhost:5001">http://localhost:5001</a> in the browser
|
||||
of your choice to use Presenton.
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
<p>
|
||||
<strong>Note:</strong> You can replace <code>5001</code> with any other port
|
||||
number of your choice to run Presenton on a different port number. If you use
|
||||
Docker Compose, set <code>PRESENTON_HTTP_HOST_PORT</code>, for example
|
||||
<code>PRESENTON_HTTP_HOST_PORT=8080 docker compose up production</code>.
|
||||
</p>
|
||||
</blockquote>
|
||||
|
||||
#
|
||||
|
||||
### ⚙️ Deployment Configurations
|
||||
|
||||
The lists below match the environment variables forwarded in this repository’s **`docker-compose.yml`** (`production`, `production-gpu`, `development`, and `development-gpu`). Put values in a `.env` file next to the compose file, or export them before `docker compose up`. The Electron app backend can read the same names when run outside Docker.
|
||||
|
||||
Other optional variables exist in code (for example advanced Mem0 paths, LiteParse runners, or `FAST_API_INTERNAL_URL` when Next.js and FastAPI are not same-origin); they are **not** wired in `docker-compose.yml`. Supported names are discoverable from `servers/fastapi/utils/get_env.py` and the Next.js server utilities under `servers/nextjs/`.
|
||||
|
||||
#### LLM and API keys
|
||||
|
||||
- **CAN_CHANGE_KEYS**=[true/false]: Set to **false** if you want to keep API keys hidden and make them unmodifiable.
|
||||
- **LLM**=[openai/deepseek/google/vertex/azure/bedrock/openrouter/fireworks/together/cerebras/anthropic/litellm/lmstudio/ollama/custom/codex]: Select the text **LLM**.
|
||||
- **OPENAI_API_KEY**: Required if **LLM** is **openai**.
|
||||
- **OPENAI_MODEL**: Required if **LLM** is **openai** (default: `gpt-4.1`).
|
||||
- **DEEPSEEK_API_KEY**: Required if **LLM** is **deepseek**.
|
||||
- **DEEPSEEK_MODEL**: Required if **LLM** is **deepseek** (default: `deepseek-chat`).
|
||||
- **DEEPSEEK_BASE_URL**: Optional if **LLM** is **deepseek** (default: `https://api.deepseek.com`).
|
||||
- **GOOGLE_API_KEY**: Required if **LLM** is **google**.
|
||||
- **GOOGLE_MODEL**: Required if **LLM** is **google** (default: `models/gemini-2.0-flash`).
|
||||
- **VERTEX_MODEL**: Required if **LLM** is **vertex** (default: `gemini-2.5-flash`).
|
||||
- **VERTEX_API_KEY**: Optional auth path for **LLM=vertex** (Vertex Express).
|
||||
- **VERTEX_PROJECT** / **VERTEX_LOCATION**: Optional auth path for **LLM=vertex** when using GCP project credentials (do not combine with `VERTEX_API_KEY`).
|
||||
- **VERTEX_BASE_URL**: Optional Vertex gateway/base URL override.
|
||||
- **AZURE_OPENAI_MODEL**: Required if **LLM** is **azure** (deployment/model name).
|
||||
- **AZURE_OPENAI_API_KEY**: Required if **LLM** is **azure**.
|
||||
- **AZURE_OPENAI_API_VERSION**: Required if **LLM** is **azure** (for example `2024-10-21`).
|
||||
- **AZURE_OPENAI_ENDPOINT** / **AZURE_OPENAI_BASE_URL**: At least one is required if **LLM** is **azure**.
|
||||
- **AZURE_OPENAI_DEPLOYMENT**: Optional deployment override for **LLM** is **azure**.
|
||||
- **BEDROCK_REGION**: Optional if **LLM** is **bedrock** (default: `us-east-1`).
|
||||
- **BEDROCK_MODEL**: Required if **LLM** is **bedrock**. Use a standard model ID (example: `us.anthropic.claude-3-5-haiku-20241022-v1:0`) or a full **inference profile ARN** for newer models (example: Claude Sonnet 4.6). Passed through to Bedrock Converse as `modelId`. See **[Amazon Bedrock guide](docs/amazon-bedrock.md)**.
|
||||
- **BEDROCK_API_KEY**: Optional if **LLM** is **bedrock** (API key auth; alternative to AWS keys).
|
||||
- **BEDROCK_AWS_ACCESS_KEY_ID** / **BEDROCK_AWS_SECRET_ACCESS_KEY**: Required together if **LLM** is **bedrock** and `BEDROCK_API_KEY` is not set.
|
||||
- **BEDROCK_AWS_SESSION_TOKEN**: Optional session token for **LLM** is **bedrock**.
|
||||
- **BEDROCK_PROFILE_NAME**: Optional AWS profile name for **LLM** is **bedrock**.
|
||||
- **OPENROUTER_API_KEY**: Required if **LLM** is **openrouter**.
|
||||
- **OPENROUTER_MODEL**: Required if **LLM** is **openrouter** (default: `openai/gpt-4o`).
|
||||
- **OPENROUTER_BASE_URL**: Optional if **LLM** is **openrouter** (default: `https://openrouter.ai/api/v1`).
|
||||
- **FIREWORKS_API_KEY**: Required if **LLM** is **fireworks**.
|
||||
- **FIREWORKS_MODEL**: Required if **LLM** is **fireworks** (example: `accounts/fireworks/models/llama-v3p1-8b-instruct`).
|
||||
- **FIREWORKS_BASE_URL**: Optional if **LLM** is **fireworks** (default: `https://api.fireworks.ai/inference/v1`).
|
||||
- **TOGETHER_API_KEY**: Required if **LLM** is **together**.
|
||||
- **TOGETHER_MODEL**: Required if **LLM** is **together** (example: `openai/gpt-oss-20b`).
|
||||
- **TOGETHER_BASE_URL**: Optional if **LLM** is **together** (default: `https://api.together.ai/v1`).
|
||||
- **CEREBRAS_API_KEY**: Required if **LLM** is **cerebras**.
|
||||
- **CEREBRAS_MODEL**: Required if **LLM** is **cerebras** (default: `llama-3.3-70b`).
|
||||
- **CEREBRAS_BASE_URL**: Optional if **LLM** is **cerebras** (default: `https://api.cerebras.ai/v1`).
|
||||
- **ANTHROPIC_API_KEY**: Required if **LLM** is **anthropic**.
|
||||
- **ANTHROPIC_MODEL**: Required if **LLM** is **anthropic** (default: `claude-3-5-sonnet-20241022`).
|
||||
- **CODEX_MODEL**: Required if **LLM** is **codex** (Codex OAuth flow; compose maps host port **1455** for the callback).
|
||||
- **CUSTOM_LLM_URL**: OpenAI-compatible base URL if **LLM** is **custom**.
|
||||
- **CUSTOM_LLM_API_KEY**: API key if **LLM** is **custom**.
|
||||
- **CUSTOM_MODEL**: Model id if **LLM** is **custom**.
|
||||
- **LITELLM_BASE_URL**: LiteLLM proxy or gateway base URL if **LLM** is **litellm**.
|
||||
- **LITELLM_API_KEY**: Optional API key if **LLM** is **litellm**.
|
||||
- **LITELLM_MODEL**: Required if **LLM** is **litellm** (default: `gpt-4.1`).
|
||||
- **LMSTUDIO_BASE_URL**: Optional LM Studio base URL if **LLM** is **lmstudio** (default: `http://localhost:1234/v1`; `/v1` is auto-appended when omitted).
|
||||
- **LMSTUDIO_API_KEY**: Optional API key if **LLM** is **lmstudio**.
|
||||
- **LMSTUDIO_MODEL**: Required if **LLM** is **lmstudio** (example: `openai/gpt-oss-20b`).
|
||||
- **DISABLE_THINKING**=[true/false]: If **true**, disables “thinking” for providers that support it (including DeepSeek).
|
||||
- **WEB_GROUNDING**=[true/false]: If **true**, enables web search by default.
|
||||
- **WEB_SEARCH_PROVIDER**=[auto/native/searxng/tavily/exa]: Selects the web search mode. `auto` uses native search for OpenAI, Google, and Anthropic, and otherwise leaves web search off unless you choose an external provider.
|
||||
<!-- Brave and Serper search providers are hidden until they are tested. -->
|
||||
<!-- - **WEB_SEARCH_PROVIDER** also supports `brave` and `serper`. -->
|
||||
- **WEB_SEARCH_MAX_RESULTS**: Maximum external search results to add to model context (default `5`, maximum `10`).
|
||||
- **SEARXNG_BASE_URL**: Base URL for a self-hosted SearXNG instance.
|
||||
- **TAVILY_API_KEY**, **EXA_API_KEY**: Credentials for optional hosted search APIs.
|
||||
<!-- - **BRAVE_SEARCH_API_KEY**, **SERPER_API_KEY**: Credentials for hidden, untested hosted search APIs. -->
|
||||
- **EXTENDED_REASONING**=[true/false]: Enables extended reasoning where supported by the configured stack.
|
||||
|
||||
#### Ollama
|
||||
|
||||
Use when **LLM** is **ollama**:
|
||||
|
||||
- **OLLAMA_URL**: Base URL of the Ollama HTTP API (e.g. `http://host.docker.internal:11434` from Docker).
|
||||
- **OLLAMA_MODEL**: Model name in Ollama (e.g. `llama3.2:3b`).
|
||||
- **START_OLLAMA**=[true/false]: Container entrypoint (`start.js`): optional install + `ollama serve`. Default **false** (`development` / `production` compose).
|
||||
|
||||
#### Presentation memory (Mem0 OSS)
|
||||
|
||||
Mem0 uses local Qdrant + SQLite (OSS); memory is scoped per presentation.
|
||||
|
||||
By default the Docker runtime now points Mem0 at a local Ollama-compatible LLM endpoint, so it no longer needs an OpenAI key just to initialize. If you want to use OpenAI instead, set `MEM0_LLM_BASE_URL`/`MEM0_LLM_API_KEY` to your OpenAI-compatible endpoint and key.
|
||||
Docker images install the default spaCy model (`en_core_web_sm`) during build so Mem0 can start without extra setup on each run.
|
||||
|
||||
| Variable | Purpose |
|
||||
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
||||
| **MEM0_ENABLED** | **true**/false (compose default **true**). |
|
||||
| **MEM0_LLM_MODEL** | Mem0 LLM model name (compose default **`llama3.1:latest`** or `OLLAMA_MODEL`). |
|
||||
| **MEM0_LLM_API_KEY** | Mem0 LLM API key placeholder for OpenAI-compatible clients (compose default **`ollama`**). |
|
||||
| **MEM0_LLM_BASE_URL** | Mem0 LLM base URL (compose default **`OLLAMA_URL`** or `http://host.docker.internal:11434`). |
|
||||
| **MEM0_DIR** | Root directory (compose default **`/app_data/mem0`**). |
|
||||
| **MEM0_EMBEDDER_PROVIDER** | Embedder backend (compose default **`fastembed`**). |
|
||||
| **MEM0_EMBEDDER_MODEL** | Model id (compose default **`BAAI/bge-small-en-v1.5`**). |
|
||||
| **MEM0_EMBEDDING_DIMS** | Vector size (compose default **384**). |
|
||||
| **MEM0_SPACY_MODEL** | Optional spaCy model override (default **`en_core_web_sm`**). |
|
||||
| **MEM0_REQUIRE_SPACY_MODEL** | Keep as **true** (default). Set to false only if you intentionally want Mem0 to run without spaCy lemmatization. |
|
||||
|
||||
#### Document parsing (LiteParse)
|
||||
|
||||
| Variable | Purpose |
|
||||
| ------------------------- | ----------------------------------------- |
|
||||
| **LITEPARSE_DPI** | OCR render DPI (compose default **120**). |
|
||||
| **LITEPARSE_NUM_WORKERS** | Worker count (compose default **1**). |
|
||||
|
||||
#### Database
|
||||
|
||||
- **DATABASE_URL**: SQLAlchemy URL; if unset, the app falls back to SQLite under app data.
|
||||
- **MIGRATE_DATABASE_ON_STARTUP**: Compose sets **`true`** for all services so migrations run on startup.
|
||||
|
||||
#### Image generation
|
||||
|
||||
These variables match `docker-compose.yml`. **`IMAGE_PROVIDER`** selects the backend (`pexels`, `pixabay`, `gemini_flash`, `nanobanana_pro`, `dall-e-3`, `gpt-image-1.5`, `comfyui`, `open_webui`). Use **OPENAI_API_KEY** for OpenAI image modes and **GOOGLE_API_KEY** for Gemini image modes (same keys as the LLM section).
|
||||
|
||||
- **DISABLE_IMAGE_GENERATION**=[true/false]: Disable slide image generation.
|
||||
- **IMAGE_PROVIDER**: Provider id (see enum above).
|
||||
- **PEXELS_API_KEY**: Pexels stock images.
|
||||
- **PIXABAY_API_KEY**: Pixabay stock images.
|
||||
- **DALL_E_3_QUALITY**=[standard/hd]: Optional for **dall-e-3** (default `standard`).
|
||||
- **GPT_IMAGE_1_5_QUALITY**=[low/medium/high]: Optional for **gpt-image-1.5** (default `medium`).
|
||||
- **COMFYUI_URL** / **COMFYUI_WORKFLOW**: Self-hosted ComfyUI workflow JSON.
|
||||
- **OPEN_WEBUI_IMAGE_URL** / **OPEN_WEBUI_IMAGE_API_KEY**: Open WebUI–compatible image endpoint.
|
||||
- **OPENAI_COMPAT_IMAGE_BASE_URL** / **OPENAI_COMPAT_IMAGE_API_KEY** / **OPENAI_COMPAT_IMAGE_MODEL**: Required if using **openai_compatible** to send image requests to any OpenAI-compatible `/v1/images/*` endpoint (LiteLLM, Azure, vLLM Gateways, etc.).
|
||||
|
||||
#### Telemetry
|
||||
|
||||
- **DISABLE_ANONYMOUS_TRACKING**=[true/false]: Set to **true** to disable anonymous telemetry.
|
||||
|
||||
#### Authentication (web login)
|
||||
|
||||
Presenton uses a **single admin account** per instance. Credentials live in `app_data` (hashed; see `userConfig.json`). Pass these with `-e` or via `.env` for compose:
|
||||
|
||||
- **AUTH_USERNAME** / **AUTH_PASSWORD** — Preseed the admin login on first boot (password at least 6 characters). Ignored if a user already exists unless **AUTH_OVERRIDE_FROM_ENV** is set.
|
||||
- **AUTH_OVERRIDE_FROM_ENV**=[true/false] — If **true**, replace stored credentials from the env vars on every FastAPI startup and rotate the session signing secret (invalidates existing sessions). Remove after a one-off rotation.
|
||||
- **RESET_AUTH**=[true/false] — If **true**, clear stored credentials on startup. Use for a **single** boot to recover access, then unset.
|
||||
|
||||
**Examples**
|
||||
|
||||
```bash
|
||||
docker run -it --name presenton -p 5001:80 -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest
|
||||
```
|
||||
|
||||
```bash
|
||||
docker run -it --name presenton -p 5001:80 -e AUTH_USERNAME=admin -e AUTH_PASSWORD=changeme123 -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest
|
||||
```
|
||||
|
||||
```bash
|
||||
docker run -it --name presenton -p 5001:80 -e AUTH_USERNAME=admin -e AUTH_PASSWORD=changeme123 -v "${PWD}\app_data:/app_data" ghcr.io/presenton/presenton:latest
|
||||
```
|
||||
|
||||
```bash
|
||||
docker stop presenton && docker rm presenton && docker run -it --name presenton -p 5001:80 -e AUTH_USERNAME=admin -e AUTH_PASSWORD=newcred456 -e AUTH_OVERRIDE_FROM_ENV=true -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest
|
||||
```
|
||||
|
||||
```bash
|
||||
docker stop presenton && docker rm presenton && docker run -it --name presenton -p 5001:80 -e RESET_AUTH=true -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest
|
||||
```
|
||||
|
||||
```bash
|
||||
docker stop presenton && docker rm presenton && docker run -it --name presenton -p 5001:80 -e AUTH_USERNAME=admin -e AUTH_PASSWORD=changeme123 -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest
|
||||
```
|
||||
|
||||
**Manual reset:** stop the container, edit `./app_data/userConfig.json`, delete `AUTH_USERNAME`, `AUTH_PASSWORD_HASH`, and `AUTH_SECRET_KEY`, save, and start again.
|
||||
|
||||
Sign out from the app: **Settings → Other → Sign out**.
|
||||
|
||||
#### MCP authentication
|
||||
|
||||
When auth is configured (`AUTH_USERNAME` / `AUTH_PASSWORD`), the MCP endpoint at `/mcp` now requires authentication as well.
|
||||
|
||||
1. Log in once to get a bearer token:
|
||||
|
||||
```bash
|
||||
curl -s -X POST http://localhost:5001/api/v1/auth/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"username":"admin","password":"changeme123"}'
|
||||
```
|
||||
|
||||
The response includes:
|
||||
|
||||
- `access_token` (session token)
|
||||
- `token_type` (`bearer`)
|
||||
|
||||
2. Configure your MCP client to send that token on every request:
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"presenton": {
|
||||
"url": "http://localhost:5001/mcp",
|
||||
"headers": {
|
||||
"Authorization": "Bearer <access_token>"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Notes:
|
||||
|
||||
- If you rotate credentials with `AUTH_OVERRIDE_FROM_ENV=true`, previously issued session tokens are invalidated.
|
||||
- MCP is not available in the Electron desktop app (`PRESENTON_ELECTRON=true`). Electron runs with `DISABLE_AUTH=true` by default, and the MCP server is disabled there to avoid auth conflicts.
|
||||
|
||||
> Note: LLM and image variables above are forwarded from **`docker-compose.yml`** when set in `.env`.
|
||||
|
||||
<br>
|
||||
<br>
|
||||
|
||||
**Docker Run Examples by Provider**
|
||||
|
||||
Same variables as compose; use `-e` instead of `.env` when running `docker run` directly.
|
||||
|
||||
- Using OpenAI
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e LLM="openai" -e OPENAI_API_KEY="******" -e IMAGE_PROVIDER="dall-e-3" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using Google
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e LLM="google" -e GOOGLE_API_KEY="******" -e IMAGE_PROVIDER="gemini_flash" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using Vertex AI (API key mode)
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e LLM="vertex" -e VERTEX_API_KEY="******" -e VERTEX_MODEL="gemini-2.5-flash" -e IMAGE_PROVIDER="gemini_flash" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using Azure OpenAI
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e LLM="azure" -e AZURE_OPENAI_API_KEY="******" -e AZURE_OPENAI_MODEL="gpt-4.1" -e AZURE_OPENAI_API_VERSION="2024-10-21" -e AZURE_OPENAI_ENDPOINT="https://YOUR-RESOURCE.openai.azure.com" -e IMAGE_PROVIDER="pexels" -e PEXELS_API_KEY="******" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using Amazon Bedrock (on-demand model ID) — see **[docs/amazon-bedrock.md](docs/amazon-bedrock.md)** for inference profiles, IAM, and troubleshooting.
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e LLM="bedrock" -e BEDROCK_REGION="us-east-1" -e BEDROCK_AWS_ACCESS_KEY_ID="******" -e BEDROCK_AWS_SECRET_ACCESS_KEY="******" -e BEDROCK_MODEL="us.anthropic.claude-3-5-haiku-20241022-v1:0" -e IMAGE_PROVIDER="pexels" -e PEXELS_API_KEY="******" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using Amazon Bedrock (inference profile ARN, e.g. Claude Sonnet 4.6)
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e LLM="bedrock" -e BEDROCK_REGION="us-east-1" -e BEDROCK_AWS_ACCESS_KEY_ID="******" -e BEDROCK_AWS_SECRET_ACCESS_KEY="******" -e BEDROCK_MODEL="arn:aws:bedrock:us-east-1:YOUR_ACCOUNT_ID:inference-profile/us.anthropic.claude-sonnet-4-6" -e IMAGE_PROVIDER="pexels" -e PEXELS_API_KEY="******" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using Fireworks
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e LLM="fireworks" -e FIREWORKS_API_KEY="******" -e FIREWORKS_MODEL="accounts/fireworks/models/llama-v3p1-8b-instruct" -e IMAGE_PROVIDER="pexels" -e PEXELS_API_KEY="******" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using Together AI
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e LLM="together" -e TOGETHER_API_KEY="******" -e TOGETHER_MODEL="openai/gpt-oss-20b" -e IMAGE_PROVIDER="pexels" -e PEXELS_API_KEY="******" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using Ollama
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e LLM="ollama" -e OLLAMA_MODEL="llama3.2:3b" -e IMAGE_PROVIDER="pexels" -e PEXELS_API_KEY="*******" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using Anthropic
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e LLM="anthropic" -e ANTHROPIC_API_KEY="******" -e IMAGE_PROVIDER="pexels" -e PEXELS_API_KEY="******" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using LM Studio (local)
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e LLM="lmstudio" -e LMSTUDIO_BASE_URL="http://host.docker.internal:1234" -e LMSTUDIO_MODEL="openai/gpt-oss-20b" -e IMAGE_PROVIDER="pexels" -e PEXELS_API_KEY="******" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using OpenAI Compatible LLM API
|
||||
<pre><code class="language-bash">docker run -it -p 5001:80 -e CAN_CHANGE_KEYS="false" -e LLM="custom" -e CUSTOM_LLM_URL="http://*****" -e CUSTOM_LLM_API_KEY="*****" -e CUSTOM_MODEL="llama3.2:3b" -e IMAGE_PROVIDER="pexels" -e PEXELS_API_KEY="********" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Running Presenton with GPU Support
|
||||
To use GPU acceleration with Ollama models, you need to install and configure the NVIDIA Container Toolkit. This allows Docker containers to access your NVIDIA GPU.
|
||||
Once the NVIDIA Container Toolkit is installed and configured, you can run Presenton with GPU support by adding the `--gpus=all` flag:
|
||||
<pre><code class="language-bash">docker run -it --name presenton --gpus=all -p 5001:80 -e LLM="ollama" -e OLLAMA_MODEL="llama3.2:3b" -e IMAGE_PROVIDER="pexels" -e PEXELS_API_KEY="*******" -e CAN_CHANGE_KEYS="false" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
- Using an OpenAI-Compatible Image Provider
|
||||
|
||||
This routes all slide image requests through your OpenAI-compatible gateway (LiteLLM, Azure, vLLM, etc.) while keeping the text LLM configuration independent:
|
||||
<pre><code class="language-bash">docker run -it --name presenton -p 5001:80 -e IMAGE_PROVIDER="openai_compatible" -e OPENAI_COMPAT_IMAGE_BASE_URL="https://proxy.example.com/v1" -e OPENAI_COMPAT_IMAGE_API_KEY="******" -e OPENAI_COMPAT_IMAGE_MODEL="gpt-image-1" -v "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
|
||||
|
||||
#
|
||||
|
||||
### ✨ Generate Presentation via API
|
||||
|
||||
**Generate Presentation**
|
||||
|
||||
<p>
|
||||
<strong>Endpoint:</strong> <code>/api/v1/ppt/presentation/generate</code><br>
|
||||
<strong>Method:</strong> <code>POST</code><br>
|
||||
<strong>Content-Type:</strong> <code>application/json</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<strong>Authentication (HTTP Basic):</strong><br>
|
||||
All <code>/api/v1/</code> routes except <code>/api/v1/auth/*</code> require authentication. Send your Presenton admin username and password (same as the web UI, or <strong>AUTH_USERNAME</strong> / <strong>AUTH_PASSWORD</strong> when preseeding Docker). With <code>curl</code>, put them right after <code>-u</code> as <code>-u USERNAME:PASSWORD</code> — that is HTTP Basic auth and sets <code>Authorization: Basic …</code> for you. Replace the sample <code>username:password</code> below with your real credentials.
|
||||
</p>
|
||||
|
||||
**Request Body**
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Parameter</th>
|
||||
<th>Type</th>
|
||||
<th>Required</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
<td><code>content</code></td>
|
||||
<td>string</td>
|
||||
<td>Yes</td>
|
||||
<td>Main content used to generate the presentation.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>slides_markdown</code></td>
|
||||
<td>string[] | null</td>
|
||||
<td>No</td>
|
||||
<td>Provide custom slide markdown instead of auto-generation.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>instructions</code></td>
|
||||
<td>string | null</td>
|
||||
<td>No</td>
|
||||
<td>Additional generation instructions.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>tone</code></td>
|
||||
<td>string</td>
|
||||
<td>No</td>
|
||||
<td>
|
||||
Text tone (default: <code>"default"</code>).
|
||||
Options: <code>default</code>, <code>casual</code>, <code>professional</code>,
|
||||
<code>funny</code>, <code>educational</code>, <code>sales_pitch</code>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>verbosity</code></td>
|
||||
<td>string</td>
|
||||
<td>No</td>
|
||||
<td>
|
||||
Content density (default: <code>"standard"</code>).
|
||||
Options: <code>concise</code>, <code>standard</code>, <code>text-heavy</code>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>web_search</code></td>
|
||||
<td>boolean</td>
|
||||
<td>No</td>
|
||||
<td>Enable web search grounding (default: <code>false</code>).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>n_slides</code></td>
|
||||
<td>integer</td>
|
||||
<td>No</td>
|
||||
<td>Number of slides to generate (default: <code>8</code>).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>language</code></td>
|
||||
<td>string</td>
|
||||
<td>No</td>
|
||||
<td>Presentation language (default: <code>"English"</code>).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>template</code></td>
|
||||
<td>string</td>
|
||||
<td>No</td>
|
||||
<td>Template name (default: <code>"general"</code>).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>include_table_of_contents</code></td>
|
||||
<td>boolean</td>
|
||||
<td>No</td>
|
||||
<td>Include table of contents slide (default: <code>false</code>).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>include_title_slide</code></td>
|
||||
<td>boolean</td>
|
||||
<td>No</td>
|
||||
<td>Include title slide (default: <code>true</code>).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>files</code></td>
|
||||
<td>string[] | null</td>
|
||||
<td>No</td>
|
||||
<td>
|
||||
Files to use in generation.
|
||||
Upload first via <code>/api/v1/ppt/files/upload</code>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>export_as</code></td>
|
||||
<td>string</td>
|
||||
<td>No</td>
|
||||
<td>
|
||||
Export format (default: <code>"pptx"</code>).
|
||||
Options: <code>pptx</code>, <code>pdf</code>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
**Response**
|
||||
|
||||
<pre><code class="language-json">{
|
||||
"presentation_id": "string",
|
||||
"path": "string",
|
||||
"edit_path": "string"
|
||||
}</code></pre>
|
||||
|
||||
**Example (curl + HTTP Basic auth with <code>-u</code>)**
|
||||
|
||||
<pre><code class="language-bash">curl -u username:password \
|
||||
-X POST http://localhost:5001/api/v1/ppt/presentation/generate \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"content": "Introduction to Machine Learning",
|
||||
"n_slides": 5,
|
||||
"language": "English",
|
||||
"template": "general",
|
||||
"export_as": "pptx"
|
||||
}'</code></pre>
|
||||
|
||||
**Example Response**
|
||||
|
||||
<pre><code class="language-json">{
|
||||
"presentation_id": "d3000f96-096c-4768-b67b-e99aed029b57",
|
||||
"path": "/app_data/d3000f96-096c-4768-b67b-e99aed029b57/Introduction_to_Machine_Learning.pptx",
|
||||
"edit_path": "/presentation?id=d3000f96-096c-4768-b67b-e99aed029b57"
|
||||
}</code></pre>
|
||||
|
||||
<blockquote>
|
||||
<strong>Note:</strong>
|
||||
Prepend your server’s root URL to <code>path</code> and
|
||||
<code>edit_path</code> to construct valid links.
|
||||
</blockquote>
|
||||
|
||||
**Documentation & Tutorials**
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://docs.presenton.ai/v3/get-started/quickstart">
|
||||
Deploy Presenton
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://docs.presenton.ai/v3/get-started/api-introduction">
|
||||
Full API Documentation
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://docs.presenton.ai/v3/guide/using-presenton-api">
|
||||
Generate Presentations via API in 5 Minutes
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://docs.presenton.ai/tutorial/generate-presentation-from-csv">
|
||||
Create Presentations from CSV using AI
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://docs.presenton.ai/tutorial/create-data-reports-using-ai">
|
||||
Create Data Reports Using AI
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
#
|
||||
|
||||
### 🚀 Roadmap
|
||||
|
||||
Track the public roadmap on GitHub Projects: [https://github.com/orgs/presenton/projects/2](https://github.com/orgs/presenton/projects/2)
|
||||
Reference in New Issue
Block a user