[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-10270":3},{"id":4,"name":5,"fullName":6,"owner":5,"repo":5,"description":7,"homepage":8,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":9,"pushedAt":9,"updatedAt":34,"readmeContent":35,"aiSummary":36,"trendingCount":15,"starSnapshotCount":15,"syncStatus":37,"lastSyncTime":38,"discoverSource":39},10270,"presenton","presenton\u002Fpresenton","Open-Source AI Presentation Generator and API (Gamma, Beautiful AI, Decktopus Alternative)","https:\u002F\u002Fpresenton.ai",null,"TypeScript",8090,1270,48,32,0,26,225,3139,119,40.31,"Apache License 2.0",false,"main",true,[26,27,28,29,30,31,32,33],"ai-agent","ai-presentation","api","gamma","powerpoint-automation","powerpoint-free","powerpoint-generation","presentation","2026-06-12 02:02:19","\u003Cp align=\"center\">\n  \u003Cimg src=\".\u002Freadme_assets\u002Fimages\u002Flogo.png\" alt=\"Presenton\" \u002F>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fpresenton.ai\u002Fdownload\">\u003Cstrong>Quickstart\u003C\u002Fstrong>\u003C\u002Fa> &middot;\n  \u003Ca href=\"https:\u002F\u002Fdocs.presenton.ai\u002F\">\u003Cstrong>Docs\u003C\u002Fstrong>\u003C\u002Fa> &middot;\n  \u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002F@presentonai\">\u003Cstrong>Youtube\u003C\u002Fstrong>\u003C\u002Fa> &middot;\n  \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002F9ZsKKxudNE\">\u003Cstrong>Discord\u003C\u002Fstrong>\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpresenton\u002Fpresenton\u002Fblob\u002Fmain\u002FLICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-Apache%202.0-blue?style=flat\" alt=\"Apache2.0\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpresenton\u002Fpresenton\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fpresenton\u002Fpresenton?style=flat\" alt=\"Stars\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fpresenton.ai\u002F\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPlatform-Docker%20%7C%20Windows%20%7C%20macOS%20%7C%20Linux-lightgrey?style=flat\" alt=\"Platform\" \u002F>\u003C\u002Fa>\n\u003C\u002Fp>\n\n# Open-Source AI Presentation Generator and API (Gamma, Beautiful AI, Decktopus Alternative)\n\n### ✨ Why Presenton\n\nNo SaaS lock-in · No forced subscriptions · Full control over models and data\n\nWhat makes Presenton different?\n\n- Use Fully **self-hosted** in Web through [Docker Package](https:\u002F\u002Fdocs.presenton.ai\u002Fv3\u002Fget-started\u002Fquickstart)\n- Or Download [Desktop App](https:\u002F\u002Fpresenton.ai\u002Fdownload) (Mac, Windows & Linux)\n- Works with OpenAI, Gemini, Vertex AI, Azure OpenAI, Anthropic, Ollama, or custom models\n- Comes with AI Presentation Generation API\n- Fully open-source (Apache 2.0)\n- Works with your own design\u002Ftemplates\n\n> [!TIP]\n> **Star us!** A ⭐ shows your support and encourages us to keep building! 😇\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\".\u002Freadme_assets\u002Fimages\u002Fbanner_bg.gif\" alt=\"Presenton\" \u002F>\n\u003C\u002Fp>\n\n#\n\n### 🎛 Features\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\".\u002Freadme_assets\u002Fimages\u002Ffeatures-1.png\" alt=\"Presenton Features\" \u002F>\n\u003C\u002Fp>\n\n#\n\n### 💻 Presenton Desktop\n\nCreate AI-powered presentations using your own model provider (BYOK) or run everything locally on your own machine for full control and data privacy.\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fpresenton.ai\u002Fdownload\">\n    \u003Cimg src=\".\u002Freadme_assets\u002Fimages\u002Fbanner.png\" alt=\"Cloud deployment\" \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n**Available Platforms**\n\n\u003Ctable>\n\u003Ctr>\n\u003Cth align=\"left\">Platform\u003C\u002Fth>\n\u003Cth align=\"left\">Architecture\u003C\u002Fth>\n\u003Cth align=\"left\">Package\u003C\u002Fth>\n\u003Cth align=\"left\">Download\u003C\u002Fth>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Cb>macOS\u003C\u002Fb>\u003C\u002Ftd>\n\u003Ctd>Apple Silicon \u002F Intel\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.dmg\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ca href=\"https:\u002F\u002Fpresenton.ai\u002Fdownload\">Download ↗\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Cb>Windows\u003C\u002Fb>\u003C\u002Ftd>\n\u003Ctd>x64\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.exe\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ca href=\"https:\u002F\u002Fpresenton.ai\u002Fdownload\">Download ↗\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Cb>Linux\u003C\u002Fb>\u003C\u002Ftd>\n\u003Ctd>x64\u003C\u002Ftd>\n\u003Ctd> \u003Ccode>.deb\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ca href=\"https:\u002F\u002Fpresenton.ai\u002Fdownload\">Download ↗\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003C\u002Ftable>\n\nPresenton gives you complete control over your AI presentation workflow. Choose your models, customize your experience, and keep your data private.\n\n- Custom Templates & Themes — Create unlimited presentation designs with HTML and Tailwind CSS\n- AI Template Generation — Create presentation templates from existing Powerpoint documents.\n- Flexible Generation — Build presentations from prompts or uploaded documents\n- Export Ready — Save as PowerPoint (PPTX) and PDF with professional formatting\n- Built-In MCP Server — Generate presentations over Model Context Protocol\n- 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.\n- Ollama Integration — Run open-source models locally with full privacy\n- OpenAI API Compatible — Connect to any OpenAI-compatible endpoint with your own models\n- Multi-Provider Support — Mix and match text and image generation providers\n- Versatile Image Generation — Choose from DALL-E 3, Gemini Flash, Pexels, or Pixabay\n- Rich Media Support — Icons, charts, and custom graphics for professional presentations\n- Runs Locally — All processing happens on your device, no cloud dependencies\n- API Deployment — Host as your own API service for your team\n- Fully Open-Source — Apache 2.0 licensed, inspect, modify, and contribute\n- Docker Ready — One-command deployment with GPU support for local models\n- Electron Desktop App — Run Presenton as a native desktop application on Windows, macOS, and Linux (no browser required)\n- Sign in with ChatGPT — Use your free or paid ChatGPT account to sign in and start creating presentations instantly — no separate API key required\n\n#\n\n### ☁️ Presenton Cloud\n\nRun Presenton directly in your browser — no installation, no setup required. Start creating presentations instantly from anywhere.\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fpresenton.ai\">\n    \u003Cimg src=\".\u002Freadme_assets\u002Fimages\u002Fcloud-banner.png\" alt=\"Presenton Cloud\" \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n#\n\n### ⚡ Running Presenton\n\n  \u003Cp>\n    You can run Presenton in two ways:\n    \u003Cstrong>Docker\u003C\u002Fstrong> for a one-command setup without installing a local dev\n    stack, or the \u003Cstrong>Electron desktop app\u003C\u002Fstrong> for a native app\n    experience (ideal for development or offline use).\n  \u003C\u002Fp>\n\n**Option 1: Electron (Desktop App)**\n\n   \u003Cp>\n    Run Presenton as a native desktop application. LLM and image provider\n    (API keys, etc.) can be configured in the app. The same environment variables\n    used for Docker apply when running the bundled backend.\n  \u003C\u002Fp>\n\n  \u003Cp>\n    \u003Cstrong>Prerequisites:\u003C\u002Fstrong> Node.js (LTS), npm, Python 3.11, and\n    \u003Ca href=\"https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002F\">uv\u003C\u002Fa>\n    (for the shared FastAPI backend in \u003Ccode>servers\u002Ffastapi\u003C\u002Fcode>).\n  \u003C\u002Fp>\n\n- Setup (First Time)\n  \u003Cpre>\u003Ccode class=\"language-bash\">cd electron\n  npm run setup:env\u003C\u002Fcode>\u003C\u002Fpre>\n\n  This installs Node dependencies, runs \u003Ccode>uv sync\u003C\u002Fcode> in the FastAPI\n  server, and installs Next.js dependencies.\n\n- Run in Development\n  \u003Cpre>\u003Ccode class=\"language-bash\">npm run dev\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003Cp>\n  This compiles TypeScript and starts Electron. The backend and UI run locally\n  inside the desktop window.\n  \u003C\u002Fp>\n\n- Build Distributable (Optional)\n  To create installers for Windows, macOS, or Linux:\n  \u003Cpre>\u003Ccode class=\"language-bash\">npm run build:all\n  npm run dist\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003Cp>\n  Output files are written to \u003Ccode>electron\u002Fdist\u003C\u002Fcode>\n  (or as configured in your \u003Ccode>electron-builder\u003C\u002Fcode> settings).\n  \u003C\u002Fp>\n\n**Option 2: Docker**\n\n- Start Presenton\n  Linux\u002FMacOS (Bash\u002FZsh Shell):\n  \u003Cpre>\u003Ccode class=\"language-bash\">docker run -it --name presenton -p 5000:80 -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\u003C\u002Fcode>\u003C\u002Fpre>\n\n  Windows (PowerShell):\n  \u003Cpre>\u003Ccode class=\"language-bash\">docker run -it --name presenton -p 5000:80 -v \"${PWD}\\app_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\u003C\u002Fcode>\u003C\u002Fpre>\n\n- Open Presenton\n  \u003Cp>\n  Open \u003Ca href=\"http:\u002F\u002Flocalhost:5000\">http:\u002F\u002Flocalhost:5000\u003C\u002Fa> in the browser\n  of your choice to use Presenton.\n  \u003C\u002Fp>\n\n  \u003Cblockquote>\n  \u003Cp>\n    \u003Cstrong>Note:\u003C\u002Fstrong> You can replace \u003Ccode>5000\u003C\u002Fcode> with any other port\n    number of your choice to run Presenton on a different port number.\n  \u003C\u002Fp>\n  \u003C\u002Fblockquote>\n\n#\n\n### ⚙️ Deployment Configurations\n\nThe 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.\n\nOther 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\u002Ffastapi\u002Futils\u002Fget_env.py` and the Next.js server utilities under `servers\u002Fnextjs\u002F`.\n\n#### LLM and API keys\n\n- **CAN_CHANGE_KEYS**=[true\u002Ffalse]: Set to **false** if you want to keep API keys hidden and make them unmodifiable.\n- **LLM**=[openai\u002Fgoogle\u002Fvertex\u002Fazure\u002Fanthropic\u002Follama\u002Fcustom\u002Fcodex]: Select the text **LLM**.\n- **OPENAI_API_KEY**: Required if **LLM** is **openai**.\n- **OPENAI_MODEL**: Required if **LLM** is **openai** (default: `gpt-4.1`).\n- **GOOGLE_API_KEY**: Required if **LLM** is **google**.\n- **GOOGLE_MODEL**: Required if **LLM** is **google** (default: `models\u002Fgemini-2.0-flash`).\n- **VERTEX_MODEL**: Required if **LLM** is **vertex** (default: `gemini-2.5-flash`).\n- **VERTEX_API_KEY**: Optional auth path for **LLM=vertex** (Vertex Express).\n- **VERTEX_PROJECT** \u002F **VERTEX_LOCATION**: Optional auth path for **LLM=vertex** when using GCP project credentials (do not combine with `VERTEX_API_KEY`).\n- **VERTEX_BASE_URL**: Optional Vertex gateway\u002Fbase URL override.\n- **AZURE_OPENAI_MODEL**: Required if **LLM** is **azure** (deployment\u002Fmodel name).\n- **AZURE_OPENAI_API_KEY**: Required if **LLM** is **azure**.\n- **AZURE_OPENAI_API_VERSION**: Required if **LLM** is **azure** (for example `2024-10-21`).\n- **AZURE_OPENAI_ENDPOINT** \u002F **AZURE_OPENAI_BASE_URL**: At least one is required if **LLM** is **azure**.\n- **AZURE_OPENAI_DEPLOYMENT**: Optional deployment override for **LLM** is **azure**.\n- **ANTHROPIC_API_KEY**: Required if **LLM** is **anthropic**.\n- **ANTHROPIC_MODEL**: Required if **LLM** is **anthropic** (default: `claude-3-5-sonnet-20241022`).\n- **CODEX_MODEL**: Required if **LLM** is **codex** (Codex OAuth flow; compose maps host port **1455** for the callback).\n- **CUSTOM_LLM_URL**: OpenAI-compatible base URL if **LLM** is **custom**.\n- **CUSTOM_LLM_API_KEY**: API key if **LLM** is **custom**.\n- **CUSTOM_MODEL**: Model id if **LLM** is **custom**.\n- **DISABLE_THINKING**=[true\u002Ffalse]: If **true**, disables “thinking” on the custom LLM.\n- **WEB_GROUNDING**=[true\u002Ffalse]: If **true**, enables web search for OpenAI, Google, and Anthropic models.\n- **EXTENDED_REASONING**=[true\u002Ffalse]: Enables extended reasoning where supported by the configured stack.\n\n#### Ollama\n\nUse when **LLM** is **ollama**:\n\n- **OLLAMA_URL**: Base URL of the Ollama HTTP API (e.g. `http:\u002F\u002Fhost.docker.internal:11434` from Docker).\n- **OLLAMA_MODEL**: Model name in Ollama (e.g. `llama3.2:3b`).\n- **START_OLLAMA**=[true\u002Ffalse]: Container entrypoint (`start.js`): optional install + `ollama serve`. Default **false** (`development` \u002F `production` compose).\n\n#### Presentation memory (Mem0 OSS)\n\nMem0 uses local Qdrant + SQLite (OSS); memory is scoped per presentation.\n\nBy 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`\u002F`MEM0_LLM_API_KEY` to your OpenAI-compatible endpoint and key.\nDocker images install the default spaCy model (`en_core_web_sm`) during build so Mem0 can start without extra setup on each run.\n\n| Variable | Purpose |\n|----------|---------|\n| **MEM0_ENABLED** | **true**\u002Ffalse (compose default **true**). |\n| **MEM0_LLM_MODEL** | Mem0 LLM model name (compose default **`llama3.1:latest`** or `OLLAMA_MODEL`). |\n| **MEM0_LLM_API_KEY** | Mem0 LLM API key placeholder for OpenAI-compatible clients (compose default **`ollama`**). |\n| **MEM0_LLM_BASE_URL** | Mem0 LLM base URL (compose default **`OLLAMA_URL`** or `http:\u002F\u002Fhost.docker.internal:11434`). |\n| **MEM0_DIR** | Root directory (compose default **`\u002Fapp_data\u002Fmem0`**). |\n| **MEM0_EMBEDDER_PROVIDER** | Embedder backend (compose default **`fastembed`**). |\n| **MEM0_EMBEDDER_MODEL** | Model id (compose default **`BAAI\u002Fbge-small-en-v1.5`**). |\n| **MEM0_EMBEDDING_DIMS** | Vector size (compose default **384**). |\n| **MEM0_SPACY_MODEL** | Optional spaCy model override (default **`en_core_web_sm`**). |\n| **MEM0_REQUIRE_SPACY_MODEL** | Keep as **true** (default). Set to false only if you intentionally want Mem0 to run without spaCy lemmatization. |\n\n#### Document parsing (LiteParse)\n\n| Variable | Purpose |\n|----------|---------|\n| **LITEPARSE_DPI** | OCR render DPI (compose default **120**). |\n| **LITEPARSE_NUM_WORKERS** | Worker count (compose default **1**). |\n\n#### Database\n\n- **DATABASE_URL**: SQLAlchemy URL; if unset, the app falls back to SQLite under app data.\n- **MIGRATE_DATABASE_ON_STARTUP**: Compose sets **`true`** for all services so migrations run on startup.\n\n#### Image generation\n\nThese 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).\n\n- **DISABLE_IMAGE_GENERATION**=[true\u002Ffalse]: Disable slide image generation.\n- **IMAGE_PROVIDER**: Provider id (see enum above).\n- **PEXELS_API_KEY**: Pexels stock images.\n- **PIXABAY_API_KEY**: Pixabay stock images.\n- **DALL_E_3_QUALITY**=[standard\u002Fhd]: Optional for **dall-e-3** (default `standard`).\n- **GPT_IMAGE_1_5_QUALITY**=[low\u002Fmedium\u002Fhigh]: Optional for **gpt-image-1.5** (default `medium`).\n- **COMFYUI_URL** \u002F **COMFYUI_WORKFLOW**: Self-hosted ComfyUI workflow JSON.\n- **OPEN_WEBUI_IMAGE_URL** \u002F **OPEN_WEBUI_IMAGE_API_KEY**: Open WebUI–compatible image endpoint.\n\n#### Telemetry\n\n- **DISABLE_ANONYMOUS_TRACKING**=[true\u002Ffalse]: Set to **true** to disable anonymous telemetry.\n\n#### Authentication (web login)\n\nPresenton 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:\n\n- **AUTH_USERNAME** \u002F **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.\n- **AUTH_OVERRIDE_FROM_ENV**=[true\u002Ffalse] — 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.\n- **RESET_AUTH**=[true\u002Ffalse] — If **true**, clear stored credentials on startup. Use for a **single** boot to recover access, then unset.\n\n**Examples**\n\n```bash\ndocker run -it --name presenton -p 5000:80 -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\n```\n\n```bash\ndocker run -it --name presenton -p 5000:80 -e AUTH_USERNAME=admin -e AUTH_PASSWORD=changeme123 -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\n```\n\n```bash\ndocker run -it --name presenton -p 5000:80 -e AUTH_USERNAME=admin -e AUTH_PASSWORD=changeme123 -v \"${PWD}\\app_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\n```\n\n```bash\ndocker stop presenton && docker rm presenton && docker run -it --name presenton -p 5000:80 -e AUTH_USERNAME=admin -e AUTH_PASSWORD=newcred456 -e AUTH_OVERRIDE_FROM_ENV=true -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\n```\n\n```bash\ndocker stop presenton && docker rm presenton && docker run -it --name presenton -p 5000:80 -e RESET_AUTH=true -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\n```\n\n```bash\ndocker stop presenton && docker rm presenton && docker run -it --name presenton -p 5000:80 -e AUTH_USERNAME=admin -e AUTH_PASSWORD=changeme123 -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\n```\n\n**Manual reset:** stop the container, edit `.\u002Fapp_data\u002FuserConfig.json`, delete `AUTH_USERNAME`, `AUTH_PASSWORD_HASH`, and `AUTH_SECRET_KEY`, save, and start again.\n\nSign out from the app: **Settings → Other → Sign out**.\n\n> Note: LLM and image variables above are forwarded from **`docker-compose.yml`** when set in `.env`.\n\n\u003Cbr>\n\u003Cbr>\n\n**Docker Run Examples by Provider**\n\nSame variables as compose; use `-e` instead of `.env` when running `docker run` directly.\n\n- Using OpenAI\n    \u003Cpre>\u003Ccode class=\"language-bash\">docker run -it --name presenton -p 5000:80 -e LLM=\"openai\" -e OPENAI_API_KEY=\"******\" -e IMAGE_PROVIDER=\"dall-e-3\" -e CAN_CHANGE_KEYS=\"false\" -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\u003C\u002Fcode>\u003C\u002Fpre>\n\n- Using Google\n    \u003Cpre>\u003Ccode class=\"language-bash\">docker run -it --name presenton -p 5000:80 -e LLM=\"google\" -e GOOGLE_API_KEY=\"******\" -e IMAGE_PROVIDER=\"gemini_flash\" -e CAN_CHANGE_KEYS=\"false\" -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\u003C\u002Fcode>\u003C\u002Fpre>\n\n- Using Vertex AI (API key mode)\n    \u003Cpre>\u003Ccode class=\"language-bash\">docker run -it --name presenton -p 5000: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 \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\u003C\u002Fcode>\u003C\u002Fpre>\n\n- Using Azure OpenAI\n    \u003Cpre>\u003Ccode class=\"language-bash\">docker run -it --name presenton -p 5000: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:\u002F\u002FYOUR-RESOURCE.openai.azure.com\" -e IMAGE_PROVIDER=\"pexels\" -e PEXELS_API_KEY=\"******\" -e CAN_CHANGE_KEYS=\"false\" -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\u003C\u002Fcode>\u003C\u002Fpre>\n\n- Using Ollama\n    \u003Cpre>\u003Ccode class=\"language-bash\">docker run -it --name presenton -p 5000:80 -e LLM=\"ollama\" -e OLLAMA_MODEL=\"llama3.2:3b\" -e IMAGE_PROVIDER=\"pexels\" -e PEXELS_API_KEY=\"*******\" -e CAN_CHANGE_KEYS=\"false\" -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\u003C\u002Fcode>\u003C\u002Fpre>\n\n- Using Anthropic\n    \u003Cpre>\u003Ccode class=\"language-bash\">docker run -it --name presenton -p 5000:80 -e LLM=\"anthropic\" -e ANTHROPIC_API_KEY=\"******\" -e IMAGE_PROVIDER=\"pexels\" -e PEXELS_API_KEY=\"******\" -e CAN_CHANGE_KEYS=\"false\" -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\u003C\u002Fcode>\u003C\u002Fpre>\n\n- Using OpenAI Compatible API\n    \u003Cpre>\u003Ccode class=\"language-bash\">docker run -it -p 5000:80 -e CAN_CHANGE_KEYS=\"false\"  -e LLM=\"custom\" -e CUSTOM_LLM_URL=\"http:\u002F\u002F*****\" -e CUSTOM_LLM_API_KEY=\"*****\" -e CUSTOM_MODEL=\"llama3.2:3b\" -e IMAGE_PROVIDER=\"pexels\" -e  PEXELS_API_KEY=\"********\" -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\u003C\u002Fcode>\u003C\u002Fpre>\n\n- Running Presenton with GPU Support\n  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.\n  Once the NVIDIA Container Toolkit is installed and configured, you can run Presenton with GPU support by adding the `--gpus=all` flag:\n    \u003Cpre>\u003Ccode class=\"language-bash\">docker run -it --name presenton --gpus=all -p 5000:80 -e LLM=\"ollama\" -e OLLAMA_MODEL=\"llama3.2:3b\" -e IMAGE_PROVIDER=\"pexels\" -e PEXELS_API_KEY=\"*******\" -e CAN_CHANGE_KEYS=\"false\" -v \".\u002Fapp_data:\u002Fapp_data\" ghcr.io\u002Fpresenton\u002Fpresenton:latest\u003C\u002Fcode>\u003C\u002Fpre>\n\n#\n\n### ✨ Generate Presentation via API\n\n**Generate Presentation**\n\n\u003Cp>\n\u003Cstrong>Endpoint:\u003C\u002Fstrong> \u003Ccode>\u002Fapi\u002Fv1\u002Fppt\u002Fpresentation\u002Fgenerate\u003C\u002Fcode>\u003Cbr>\n\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>POST\u003C\u002Fcode>\u003Cbr>\n\u003Cstrong>Content-Type:\u003C\u002Fstrong> \u003Ccode>application\u002Fjson\u003C\u002Fcode>\n\u003C\u002Fp>\n\n\u003Cp>\n\u003Cstrong>Authentication (HTTP Basic):\u003C\u002Fstrong>\u003Cbr>\nAll \u003Ccode>\u002Fapi\u002Fv1\u002F\u003C\u002Fcode> routes except \u003Ccode>\u002Fapi\u002Fv1\u002Fauth\u002F*\u003C\u002Fcode> require authentication. Send your Presenton admin username and password (same as the web UI, or \u003Cstrong>AUTH_USERNAME\u003C\u002Fstrong> \u002F \u003Cstrong>AUTH_PASSWORD\u003C\u002Fstrong> when preseeding Docker). With \u003Ccode>curl\u003C\u002Fcode>, put them right after \u003Ccode>-u\u003C\u002Fcode> as \u003Ccode>-u USERNAME:PASSWORD\u003C\u002Fcode> — that is HTTP Basic auth and sets \u003Ccode>Authorization: Basic …\u003C\u002Fcode> for you. Replace the sample \u003Ccode>username:password\u003C\u002Fcode> below with your real credentials.\n\u003C\u002Fp>\n\n**Request Body**\n\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Parameter\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>content\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Yes\u003C\u002Ftd>\n\u003Ctd>Main content used to generate the presentation.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>slides_markdown\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string[] | null\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>Provide custom slide markdown instead of auto-generation.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>instructions\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string | null\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>Additional generation instructions.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>tone\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>\nText tone (default: \u003Ccode>\"default\"\u003C\u002Fcode>).  \nOptions: \u003Ccode>default\u003C\u002Fcode>, \u003Ccode>casual\u003C\u002Fcode>, \u003Ccode>professional\u003C\u002Fcode>, \n\u003Ccode>funny\u003C\u002Fcode>, \u003Ccode>educational\u003C\u002Fcode>, \u003Ccode>sales_pitch\u003C\u002Fcode>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>verbosity\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>\nContent density (default: \u003Ccode>\"standard\"\u003C\u002Fcode>).  \nOptions: \u003Ccode>concise\u003C\u002Fcode>, \u003Ccode>standard\u003C\u002Fcode>, \u003Ccode>text-heavy\u003C\u002Fcode>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>web_search\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>Enable web search grounding (default: \u003Ccode>false\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>n_slides\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>Number of slides to generate (default: \u003Ccode>8\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>language\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>Presentation language (default: \u003Ccode>\"English\"\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>template\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>Template name (default: \u003Ccode>\"general\"\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>include_table_of_contents\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>Include table of contents slide (default: \u003Ccode>false\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>include_title_slide\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>Include title slide (default: \u003Ccode>true\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>files\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string[] | null\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>\nFiles to use in generation.  \nUpload first via \u003Ccode>\u002Fapi\u002Fv1\u002Fppt\u002Ffiles\u002Fupload\u003C\u002Fcode>.\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003Ctr>\n\u003Ctd>\u003Ccode>export_as\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>\nExport format (default: \u003Ccode>\"pptx\"\u003C\u002Fcode>).  \nOptions: \u003Ccode>pptx\u003C\u002Fcode>, \u003Ccode>pdf\u003C\u002Fcode>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n**Response**\n\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"presentation_id\": \"string\",\n  \"path\": \"string\",\n  \"edit_path\": \"string\"\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n**Example (curl + HTTP Basic auth with \u003Ccode>-u\u003C\u002Fcode>)**\n\n\u003Cpre>\u003Ccode class=\"language-bash\">curl -u username:password \\\n  -X POST http:\u002F\u002Flocalhost:5000\u002Fapi\u002Fv1\u002Fppt\u002Fpresentation\u002Fgenerate \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n   \"content\": \"Introduction to Machine Learning\",\n    \"n_slides\": 5,\n    \"language\": \"English\",\n    \"template\": \"general\",\n    \"export_as\": \"pptx\"\n  }'\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n**Example Response**\n\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"presentation_id\": \"d3000f96-096c-4768-b67b-e99aed029b57\",\n  \"path\": \"\u002Fapp_data\u002Fd3000f96-096c-4768-b67b-e99aed029b57\u002FIntroduction_to_Machine_Learning.pptx\",\n  \"edit_path\": \"\u002Fpresentation?id=d3000f96-096c-4768-b67b-e99aed029b57\"\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cblockquote>\n\u003Cstrong>Note:\u003C\u002Fstrong>  \nPrepend your server’s root URL to \u003Ccode>path\u003C\u002Fcode> and \n\u003Ccode>edit_path\u003C\u002Fcode> to construct valid links.\n\u003C\u002Fblockquote>\n\n**Documentation & Tutorials**\n\n\u003Cul>\n  \u003Cli>\n    \u003Ca href=\"https:\u002F\u002Fdocs.presenton.ai\u002Fusing-presenton-api\">\n      Full API Documentation\n    \u003C\u002Fa>\n  \u003C\u002Fli>\n  \u003Cli>\n    \u003Ca href=\"https:\u002F\u002Fdocs.presenton.ai\u002Ftutorial\u002Fgenerate-presentation-over-api\">\n      Generate Presentations via API in 5 Minutes\n    \u003C\u002Fa>\n  \u003C\u002Fli>\n  \u003Cli>\n    \u003Ca href=\"https:\u002F\u002Fdocs.presenton.ai\u002Ftutorial\u002Fgenerate-presentation-from-csv\">\n      Create Presentations from CSV using AI\n    \u003C\u002Fa>\n  \u003C\u002Fli>\n  \u003Cli>\n    \u003Ca href=\"https:\u002F\u002Fdocs.presenton.ai\u002Ftutorial\u002Fcreate-data-reports-using-ai\">\n      Create Data Reports Using AI\n    \u003C\u002Fa>\n  \u003C\u002Fli>\n\u003C\u002Ful>\n\n#\n\n### 🚀 Roadmap\n\nTrack the public roadmap on GitHub Projects: [https:\u002F\u002Fgithub.com\u002Forgs\u002Fpresenton\u002Fprojects\u002F2](https:\u002F\u002Fgithub.com\u002Forgs\u002Fpresenton\u002Fprojects\u002F2)\n","Presenton 是一个开源的AI演示文稿生成器和API，为用户提供Gamma、Beautiful AI或Decktopus等工具的替代方案。它支持自托管部署并通过Docker包在Web上运行，同时也提供适用于Mac、Windows及Linux系统的桌面应用程序。Presenton能够与OpenAI、Gemini、Vertex AI等多种模型集成，并允许用户使用自己的设计模板。其核心功能包括AI驱动的演示文稿创建、完全开源（采用Apache 2.0许可证）以及通过API进行演示文稿生成的能力。此外，该工具特别适合需要高度定制化、数据隐私保护以及不想被SaaS订阅模式限制的专业人士或团队使用。",2,"2026-06-11 03:27:32","top_topic"]