Merge pull request #463 from presenton/main

Migrated Main Changes
This commit is contained in:
Sudip Parajuli 2026-03-23 17:01:00 +05:45 committed by GitHub
commit 1c69e94405
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
39 changed files with 229 additions and 36322 deletions

View file

@ -92,6 +92,8 @@ body:
- Docker
- Local Development
- API Only
validations:
required: true
- type: dropdown
id: llm_provider
@ -105,7 +107,7 @@ body:
- Ollama
- Custom OpenAI-compatible API
- Not relevant
- type: textarea
id: logs
attributes:

View file

@ -0,0 +1,53 @@
name: Upload Release to R2
on:
release:
types: [published]
jobs:
upload:
runs-on: ubuntu-latest
environment: sync_r2
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download release assets
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
mkdir assets
gh release download "${{ github.event.release.tag_name }}" --dir assets --pattern '*.deb' --pattern '*.dmg' --pattern '*.exe'
echo "Downloaded files:"
ls -lh assets/
- name: Extract version from filename
run: |
FILE=$(ls assets/ | head -n 1)
VERSION=$(echo "$FILE" | sed -E 's/^Presenton-(.+)\.(deb|dmg|exe)$/\1/')
echo "Extracted version: $VERSION"
echo "VERSION=$VERSION" >> $GITHUB_ENV
# 4. Install rclone
- name: Install rclone
run: |
curl https://rclone.org/install.sh | sudo bash
# 5. Configure R2
- name: Configure R2
run: |
mkdir -p ~/.config/rclone
cat <<EOF > ~/.config/rclone/rclone.conf
[r2]
type = s3
provider = Cloudflare
access_key_id = ${{ secrets.R2_ACCESS_KEY }}
secret_access_key = ${{ secrets.R2_SECRET_KEY }}
endpoint = https://${{ secrets.R2_ACCOUNT_ID }}.r2.cloudflarestorage.com
EOF
# 6. Upload to R2 (FINAL STEP)
- name: Upload files to R2
run: |
rclone copy assets r2:presenton-desktop/${{ env.VERSION }} --progress --transfers=8

206
README.md
View file

@ -15,59 +15,19 @@
<a href="https://presenton.ai/"><img src="https://img.shields.io/badge/Platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey?style=flat" alt="Platform" /></a>
</p>
<!--
[![website-shield]][website-url]
[![download-shield]][download-url]
[![docs-shield]][docs-url]
[![youtube-shield]][youtube-url]
[![discord-shield]][discord-url]
<br>
[![docker-shield]][docker-url]
[![stars-shield]][stars-url]
[![license-shield]][license-url]
[![platform-shield]][platform-url]
[website-shield]: https://img.shields.io/badge/Website-presenton.ai-111827?style=flat&logo=google-chrome&logoColor=white
[website-url]: https://presenton.ai/
[download-shield]: https://img.shields.io/badge/Download-Latest%20Release-6C47FF?style=flat&logo=download&logoColor=white
[download-url]: https://presenton.ai/download
[docs-shield]: https://img.shields.io/badge/Docs-docs.presenton.ai-0ea5e9?style=flat&logo=readthedocs&logoColor=white
[docs-url]: https://docs.presenton.ai/
[youtube-shield]: https://img.shields.io/badge/YouTube-PresentonAI-FF0000?style=flat&logo=youtube&logoColor=white
[youtube-url]: https://www.youtube.com/@presentonai
[discord-shield]: https://img.shields.io/badge/Discord-Join%20Community-5865F2?style=flat&logo=discord&logoColor=white
[discord-url]: https://discord.gg/9ZsKKxudNE
[docker-shield]: https://img.shields.io/badge/Docker-ghcr.io/presenton/presenton-2496ED?style=flat&logo=docker&logoColor=white
[docker-url]: https://ghcr.io/presenton/presenton
[stars-shield]: https://img.shields.io/github/stars/presenton/presenton?style=flat
[stars-url]: https://github.com/presenton/presenton
[license-shield]: https://img.shields.io/badge/License-Apache%202.0-blue?style=flat
[license-url]: https://github.com/presenton/presenton/blob/main/LICENSE
[platform-shield]: https://img.shields.io/badge/Platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey?style=flat
[platform-url]: https://presenton.ai/ -->
# Open-Source AI Presentation Generator and API (Gamma, Beautiful AI, Decktopus Alternative)
### ✨ Why Presenton
No SaaS lock-in · No forced subscriptions · Full control over models and data
What makes Presenton different?
- Use your **existing PPTX files as templates**
- Fully **self-hosted**
- Works with OpenAI, Gemini, Anthropic, Ollama, or custom models
- API deployable
- Fully open-source (Apache 2.0)
- Use your **existing PPTX files as templates** _(coming soon)_
<p align="center">
<img src="./readme_assets/images/banner_bg.gif" alt="Presenton" />
@ -75,23 +35,56 @@ What makes Presenton different?
#
### 🎛 UI Features
### 🎛 Features
<p align="center">
<img src="./readme_assets/images/UI-elements/features.png" alt="Presenton" />
<img src="./readme_assets/images/features-1.png" alt="Presenton Features" />
</p>
#
### 📌 Download Presenton
### 💻 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-4.jpg" alt="Cloud deployment" />
<img src="./readme_assets/images/banner.png" alt="Cloud deployment" />
</a>
</p>
**Available Platforms:** [macOS](https://presenton.ai/download), [Linux](https://presenton.ai/download), [Windows](https://presenton.ai/download)
**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>
Presenton gives you complete control over your AI presentation workflow. Choose your models, customize your experience, and keep your data private.
@ -115,6 +108,18 @@ Presenton gives you complete control over your AI presentation workflow. Choose
#
### ☁️ 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>
@ -124,7 +129,7 @@ Presenton gives you complete control over your AI presentation workflow. Choose
experience (ideal for development or offline use).
</p>
**Option 1: Electron (Desktop App)**
**Option 1: Electron (Desktop App)**
<p>
Run Presenton as a native desktop application. LLM and image provider
@ -139,53 +144,53 @@ Presenton gives you complete control over your AI presentation workflow. Choose
<code>electron/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.
- Setup (First Time)
<pre><code class="language-bash">cd electron
npm run setup:env</code></pre>
- 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>
This installs Node dependencies, runs <code>uv sync</code> in the FastAPI
server, and installs Next.js dependencies.
- 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>
- 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>
**Option 2: Docker**
- 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>
- Start Presenton
Linux/MacOS (Bash/Zsh Shell):
<pre><code class="language-bash">docker run -it --name presenton -p 5000: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 5000:80 -v "${PWD}\app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
**Option 2: Docker**
- Open Presenton
<p>
Open <a href="http://localhost:5000">http://localhost:5000</a> in the browser
of your choice to use Presenton.
</p>
<blockquote>
<p>
<strong>Note:</strong> You can replace <code>5000</code> with any other port
number of your choice to run Presenton on a different port number.
</p>
</blockquote>
- Start Presenton
Linux/MacOS (Bash/Zsh Shell):
<pre><code class="language-bash">docker run -it --name presenton -p 5000: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 5000:80 -v "${PWD}\app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
- Open Presenton
<p>
Open <a href="http://localhost:5000">http://localhost:5000</a> in the browser
of your choice to use Presenton.
</p>
<blockquote>
<p>
<strong>Note:</strong> You can replace <code>5000</code> with any other port
number of your choice to run Presenton on a different port number.
</p>
</blockquote>
#
### ⚙️ Deployment Configurations
These settings apply to both Docker and the Electron app's backend. You may want to directly provide your API KEYS as environment variables and keep them hidden. You can set these environment variables to achieve it.
@ -230,6 +235,7 @@ You can disable anonymous telemetry using the following environment variable:
<br>
**Docker Run Examples by Provider**
- Using OpenAI
<pre><code 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 "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
@ -246,18 +252,14 @@ You can disable anonymous telemetry using the following environment variable:
<pre><code class="language-bash">docker run -it -p 5000: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:
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 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 "./app_data:/app_data" ghcr.io/presenton/presenton:latest</code></pre>
#
### ✨ Generate Presentation via API
**Generate Presentation**
<p>
@ -266,8 +268,6 @@ You can disable anonymous telemetry using the following environment variable:
<strong>Content-Type:</strong> <code>application/json</code>
</p>
**Request Body**
<table>
@ -388,8 +388,6 @@ Options: <code>pptx</code>, <code>pdf</code>
</tbody>
</table>
**Response**
<pre><code class="language-json">{
@ -398,8 +396,6 @@ Options: <code>pptx</code>, <code>pdf</code>
"edit_path": "string"
}</code></pre>
**Example Request**
<pre><code class="language-bash">curl -X POST http://localhost:5000/api/v1/ppt/presentation/generate \
@ -412,8 +408,6 @@ Options: <code>pptx</code>, <code>pdf</code>
"export_as": "pptx"
}'</code></pre>
**Example Response**
<pre><code class="language-json">{
@ -457,6 +451,16 @@ Prepend your servers root URL to <code>path</code> and
### 🚀 Roadmap
- [x] Support for custom HTML templates by developers
- [x] Support for accessing custom templates over API
- [x] Implement MCP server
- [ ] Ability for users to change system prompt
- [x] Support external SQL database
#
### 🚀 Roadmap
Track the public roadmap on GitHub Projects: [https://github.com/orgs/presenton/projects/2](https://github.com/orgs/presenton/projects/2)
#

View file

@ -54,11 +54,14 @@ export function setupExportHandlers() {
NEXT_PUBLIC_URL: process.env.NEXT_PUBLIC_URL,
NEXT_PUBLIC_FAST_API: process.env.NEXT_PUBLIC_FAST_API,
});
const exportTaskProcess = spawn("node", [exportScriptPath, exportTaskPath], {
// Use the current Electron binary in Node-compatible mode so export does
// not depend on a system-wide `node` being available in PATH.
const exportTaskProcess = spawn(process.execPath, [exportScriptPath, exportTaskPath], {
stdio: ["ignore", "pipe", "pipe"],
cwd: baseDir,
env: {
...process.env,
ELECTRON_RUN_AS_NODE: "1",
TEMP_DIRECTORY: tempDir,
APP_DATA_DIRECTORY: appDataDir,
NODE_ENV: "development",

View file

@ -1,12 +1,12 @@
{
"name": "presenton",
"version": "0.6.2-beta",
"version": "0.6.3-beta",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "presenton",
"version": "0.6.2-beta",
"version": "0.6.3-beta",
"hasInstallScript": true,
"dependencies": {
"@puppeteer/browsers": "^1.9.1",
@ -1889,6 +1889,60 @@
"node": ">=14.0.0"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": {
"version": "1.7.1",
"inBundle": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/wasi-threads": "1.1.0",
"tslib": "^2.4.0"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": {
"version": "1.7.1",
"inBundle": true,
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
"version": "1.1.0",
"inBundle": true,
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
"version": "1.1.0",
"inBundle": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/core": "^1.7.1",
"@emnapi/runtime": "^1.7.1",
"@tybys/wasm-util": "^0.10.1"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": {
"version": "0.10.1",
"inBundle": true,
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": {
"version": "2.8.1",
"inBundle": true,
"license": "0BSD",
"optional": true
},
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
"version": "4.1.18",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz",

View file

@ -1,8 +1,8 @@
{
"name": "presenton",
"productName": "Presenton Open Source",
"version": "0.6.2-beta",
"exportVersion": "v0.1.0",
"version": "0.6.3-beta",
"exportVersion": "v0.1.1",
"main": "app_dist/main.js",
"description": "Open-Source AI Presentation Generator",
"homepage": "https://presenton.ai",
@ -39,7 +39,7 @@
"setup:export-runtime": "node sync_export_runtime.js",
"fetch:export-runtime": "node sync_export_runtime.js --force",
"fetch:export-runtime:latest": "EXPORT_RUNTIME_VERSION=latest node sync_export_runtime.js --force",
"build:nextjs": "rm -rf resources/nextjs && cd servers/nextjs && cross-env BUILD_TARGET=electron npm run build && cp -r .next-build ../../resources/nextjs && cp -r app/presentation-templates ../../resources/nextjs/presentation-templates",
"build:nextjs": "rm -rf resources/nextjs && rm -rf servers/nextjs/.next-build && cd servers/nextjs && cross-env BUILD_TARGET=electron npm run build && cp -r .next-build ../../resources/nextjs && cp -r app/presentation-templates ../../resources/nextjs/presentation-templates",
"build:fastapi": "rm -rf resources/fastapi && npm run build:vectorstore && (cp ../servers/fastapi/alembic/versions/*.py servers/fastapi/alembic/versions/ 2>/dev/null || true) && cd servers/fastapi && uv run python -m PyInstaller --distpath ../../resources server.spec",
"generate:version": "node generate_update.js",
"build:electron": "npm run generate:version && npm run build:export-runtime && rm -rf app_dist && tsc && node build.js",

View file

@ -1,9 +1,9 @@
{
"version": "0.6.2-beta",
"version": "0.6.3-beta",
"message": "This Release Has new Export Package, Better Exports, and a lot of bug fixes. Please check the changelog for more details.",
"downloads": {
"linux": "https://github.com/presenton/presenton/releases/download/electron-v0.6.2-beta/Presenton-0.6.2-beta.deb",
"mac": "https://github.com/presenton/presenton/releases/download/electron-v0.6.2-beta/Presenton-0.6.2-beta.dmg",
"windows": "https://github.com/presenton/presenton/releases/download/electron-v0.6.2-beta/Presenton-0.6.2-beta.exe"
"linux": "https://github.com/presenton/presenton/releases/download/electron-v0.6.3-beta/Presenton-0.6.3-beta.deb",
"mac": "https://github.com/presenton/presenton/releases/download/electron-v0.6.3-beta/Presenton-0.6.3-beta.dmg",
"windows": "https://github.com/presenton/presenton/releases/download/electron-v0.6.3-beta/Presenton-0.6.3-beta.exe"
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 437 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 575 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 579 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 522 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 868 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 771 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 KiB

After

Width:  |  Height:  |  Size: 1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 532 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 583 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,006 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 514 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 861 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 370 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 MiB