# Generate presentations with the API
Source: https://docs.presenton.ai/api-guides/presentation-generation-flows
Start with one prompt, then progress through files, design modes, templates, structured JSON, AI agents, and background jobs.
PRESENTON API GUIDE
From one prompt to a polished presentation.
Start simple, then add files, design systems, structured slide data,
agents, and background jobs using the deployment that fits your stack.
Open Source
Self-hosted API · v1
These workflows use the Presenton Cloud API v3. Keep uploaded file
values, template IDs, task IDs, and presentation IDs in the same Cloud
account that created them.
## Before you begin
Create a Cloud API key and send it as a bearer token with every request:
```http theme={null}
Authorization: Bearer YOUR_API_KEY
```
The response from a completed generation request contains:
```json theme={null}
{
"presentation_id": "8f29a2e7-4f26-48d2-9d1d-9b0716909a6d",
"path": "https://example.com/generated-presentation.pptx",
"edit_path": "https://presenton.ai/presentation?id=8f29a2e7-4f26-48d2-9d1d-9b0716909a6d",
"credits_consumed": 7
}
```
Use `path` for the generated file and `edit_path` when a person should review
or refine the deck in Presenton.
## 1. Generate a presentation directly
Use direct generation when the prompt contains all the context Presenton needs.
The synchronous endpoint keeps the connection open until generation finishes.
Direct generation turns one prompt into an editable presentation and exported PPTX.
Send only the presentation content. Presenton uses the endpoint defaults for
the slide count, language, design, title slide, and PPTX export.
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/presentation/generate \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create a seven-slide customer-facing launch deck for Atlas Analytics. The audience is enterprise operations leaders. Cover the problem, new capabilities, proof points, rollout plan, security, and next steps. Use concise executive language and do not invent customer metrics."
}'
```
Read the exact request and response schemas in
[Generate a presentation synchronously](../api-reference/v3-presentation/generate-a-presentation-synchronously).
## 2. Generate from uploaded files
Use this workflow when the presentation must be grounded in reports,
spreadsheets, PDFs, or other supported source files.
Upload the sources once, then pass their returned file values into generation.
### Upload the files
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/files/upload \
--header "Authorization: Bearer YOUR_API_KEY" \
--form "files=@./quarterly-report.pdf" \
--form "files=@./customer-metrics.xlsx"
```
The upload response is an array of file values:
```json theme={null}
[
"uploads/quarterly-report-a19f.pdf",
"uploads/customer-metrics-52b1.xlsx"
]
```
### Generate from those values
Pass the array back in `files`. Use `content` to tell Presenton what the deck
should accomplish with the source material.
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/presentation/generate \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"files": [
"uploads/quarterly-report-a19f.pdf",
"uploads/customer-metrics-52b1.xlsx"
],
"content": "Create an executive quarterly review. Prioritize revenue, retention, customer risks, and next-quarter actions. Preserve every reported figure exactly."
}'
```
See [Upload source files](../api-reference/v3-files/upload-source-files) and
[Generate a presentation synchronously](../api-reference/v3-presentation/generate-a-presentation-synchronously).
## 3. Generate in Standard or Smart mode
Choose one design mode for each request. Send `standard_template` for Standard
mode or `smart_design` for Smart mode. Do not send both fields together.
Standard and Smart are alternative design paths for the same generation request.
### Standard mode
Standard mode uses a template with reusable, schema-backed layouts.
```bash theme={null}
curl --request GET \
--url https://api.presenton.ai/api/v3/standard-template/all \
--header "Authorization: Bearer YOUR_API_KEY"
```
Choose an `id` from the response and generate:
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/presentation/generate \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create a six-slide partner enablement presentation for a new analytics product.",
"standard_template": "neo-modern"
}'
```
### Smart mode
Smart mode uses a Smart Design that composes each slide around its content.
```bash theme={null}
curl --request GET \
--url https://api.presenton.ai/api/v3/smart-design/all \
--header "Authorization: Bearer YOUR_API_KEY"
```
Choose an `id` from the response and generate:
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/presentation/generate \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create a six-slide partner enablement presentation for a new analytics product.",
"smart_design": "REPLACE_WITH_SMART_DESIGN_ID"
}'
```
See [List Standard templates](../api-reference/v3-standard-template/list-standard-templates)
and [List Smart Designs](../api-reference/v3-smart-design/list-smart-designs).
To create a custom Smart Design from a reference PPTX before generating, follow
the [Smart Generation guide](./smart-generation).
## 4. Import a PPTX template and generate
Importing a PPTX template happens in Presenton Template Studio. Cloud v3
does not expose a public PPTX-template import endpoint. After the template is
saved, the generation workflow uses the public API.
Template Studio converts a branded PPTX into a reusable template for API generation.
1. Import the filled PPTX in Template Studio, resolve missing fonts, review the
detected layouts, and save the template. Follow
[Create a template from PPTX](../user-guide/branding-and-design/templates).
2. List the account's Standard templates and find the saved template ID.
3. Send that ID as `standard_template` in the synchronous generation request.
```bash theme={null}
curl --request GET \
--url https://api.presenton.ai/api/v3/standard-template/all \
--header "Authorization: Bearer YOUR_API_KEY"
```
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/presentation/generate \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create a seven-slide annual strategy presentation for the leadership offsite.",
"standard_template": "REPLACE_WITH_IMPORTED_TEMPLATE_ID"
}'
```
## 5. Create from structured JSON
Use structured JSON when your application already owns the narrative and slide
data. Presenton applies the chosen layouts and renders the presentation without
planning the story from a prompt.
The live template schema is the contract between your slide data and the renderer.
1. Call [List Standard templates](../api-reference/v3-standard-template/list-standard-templates)
and choose a template ID.
2. Call [Get a Standard template](../api-reference/v3-standard-template/get-a-standard-template)
and read the `id` and `json_schema` for each layout.
3. Build each slide with a `layout` from that template and a `content` object
that satisfies the selected layout schema.
4. Send the validated slides to
[Create from JSON synchronously](../api-reference/v3-presentation/create-from-json-synchronously).
```bash theme={null}
curl --request GET \
--url https://api.presenton.ai/api/v3/standard-template/neo-modern \
--header "Authorization: Bearer YOUR_API_KEY"
```
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/presentation/from-json \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"standard_template": "neo-modern",
"slides": [
{
"layout": "REPLACE_WITH_LAYOUT_ID",
"content": {
"title": "Q2 customer health",
"bullets": [
"Enterprise retention remained above target",
"Time to first value improved",
"Support response time needs attention"
]
}
}
]
}'
```
The property names inside `content` are examples. Always use the live
`json_schema` returned for the selected layout.
For the complete discovery-to-rendering workflow, including template examples,
follow the [Create Presentation from JSON guide](./standard-from-json).
## 6. Generate with your own AI agent
This workflow gives your agent control over slide selection and content while
Presenton remains responsible for template rendering and export.
Your agent writes slide JSON; your application validates it before Presenton renders the deck.
### Give the agent the template contract
1. Call [List Standard templates](../api-reference/v3-standard-template/list-standard-templates)
so the user can choose a template.
2. Call [Get a Standard template](../api-reference/v3-standard-template/get-a-standard-template)
to retrieve every layout ID and its `json_schema`.
3. Call [Get a template example](../api-reference/v3-standard-template/get-a-template-example)
to retrieve representative `layout` and `content` pairs.
4. Give the schemas, examples, user content, and presentation goal to your AI
agent.
5. Validate the agent response against the live schemas in your application.
6. Send the validated result to
[Create from JSON synchronously](../api-reference/v3-presentation/create-from-json-synchronously).
```bash theme={null}
curl --request GET \
--url https://api.presenton.ai/api/v3/standard-template/neo-modern \
--header "Authorization: Bearer YOUR_API_KEY"
```
```bash theme={null}
curl --request GET \
--url https://api.presenton.ai/api/v3/standard-template/neo-modern/example \
--header "Authorization: Bearer YOUR_API_KEY"
```
### Agent instruction
Use an instruction like this with the AI provider in your application:
```text theme={null}
You create structured slide content for Presenton.
Build a coherent presentation for the user's goal using only the supplied
template layouts. For every slide:
- select one supplied layout ID;
- return a content object that satisfies that layout's JSON Schema;
- follow the supplied template examples for content density and structure;
- preserve all facts, names, dates, and figures from the user material;
- do not invent fields that are not allowed by the schema.
Return JSON only in this shape:
{
"standard_template": "",
"slides": [
{
"layout": "",
"content": {}
}
]
}
```
Treat agent output as untrusted input. Reject unknown layouts, validate each
`content` object, enforce slide and string limits, and only then call
`POST /presentation/from-json`.
## 7. Run background jobs with async APIs and webhooks
Use background processing when generation should not hold an interactive HTTP
request open. Presenton returns a task ID immediately and completes the work in
the background.
Start one background job, then resolve it through polling or webhook delivery.
### Poll for completion
Use polling when your application does not expose a public callback URL.
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/presentation/generate/async \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create an eight-slide executive briefing about the rollout of a new customer analytics platform."
}'
```
Store the returned `id`, then poll with a capped delay until `status` becomes
`completed` or `error`:
```bash theme={null}
curl --request GET \
--url https://api.presenton.ai/api/v3/async-task/status/REPLACE_WITH_TASK_ID \
--header "Authorization: Bearer YOUR_API_KEY"
```
### Receive completion through a webhook
Use webhook delivery when your application has a stable HTTPS receiver.
Subscribe each event your receiver needs, then enable delivery on the async
generation request.
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/webhook/subscribe \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"url": "https://app.example.com/webhooks/presenton",
"secret": "REPLACE_WITH_A_RANDOM_SECRET",
"event": "presentation.generation.completed"
}'
```
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/presentation/generate/async \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create an eight-slide executive briefing about the rollout of a new customer analytics platform.",
"trigger_webhook": true
}'
```
Subscribe `presentation.generation.failed` to receive failed jobs as well.
Verify the webhook secret, acknowledge delivery quickly, and process repeated
events idempotently.
See [Generate a presentation asynchronously](../api-reference/v3-presentation/generate-a-presentation-asynchronously),
[Get task status](../api-reference/v3-async-task/get-task-status), and
[Subscribe a webhook](../api-reference/v3-webhook/subscribe-a-webhook).
Start at Flow 1 and stop when the workflow matches your product.
Prompt → sources → design → structure → agents → background jobs
These workflows use the self-hosted API v1 at
`http://localhost:5001/api/v1`. Replace the origin with your deployment and
keep every file path, template name, task ID, and presentation ID on that
instance.
## Before you begin
Start Presenton, configure the required AI providers, and have the primary
administrator generate a Presenton API key. Store the instance URL and key outside your source code:
```bash theme={null}
export PRESENTON_URL=http://localhost:5001
export PRESENTON_API_KEY=sk-presenton-REPLACE_WITH_YOUR_KEY
```
Send the API key as `Authorization: Bearer $PRESENTON_API_KEY`.
## 1. Generate a presentation directly
The synchronous v1 endpoint waits for generation and export to finish before
returning the presentation result.
Your configured instance turns one prompt into an editable presentation.
`content` is the only required request field. The instance uses its configured
defaults for slide count, language, template, title slide, and PPTX export.
```bash theme={null}
curl --request POST \
--url "$PRESENTON_URL/api/v1/ppt/presentation/generate" \
--header "Authorization: Bearer $PRESENTON_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create a seven-slide customer-facing launch deck for Atlas Analytics. The audience is enterprise operations leaders. Cover the problem, new capabilities, proof points, rollout plan, security, and next steps. Use concise executive language and do not invent customer metrics."
}'
```
See [Generate a presentation synchronously](../api-reference/presentation/generate-a-presentation-synchronously).
## 2. Generate from uploaded files
Keep the returned file paths on the same instance that performs generation.
```bash theme={null}
curl --request POST \
--url "$PRESENTON_URL/api/v1/ppt/files/upload" \
--header "Authorization: Bearer $PRESENTON_API_KEY" \
--form "files=@./quarterly-report.pdf"
```
Pass the returned path in `files`:
```bash theme={null}
curl --request POST \
--url "$PRESENTON_URL/api/v1/ppt/presentation/generate" \
--header "Authorization: Bearer $PRESENTON_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create an executive quarterly review from the uploaded report. Preserve every reported figure exactly.",
"files": ["REPLACE_WITH_RETURNED_FILE_PATH"]
}'
```
See [Upload source files](../api-reference/files/upload-source-files).
## 3. Generate with an installed template
Open Source v1 supports Standard generation with installed templates. It does
not expose Cloud Smart Designs or a public template-list endpoint.
Use the installed template name configured on your own Presenton instance.
```bash theme={null}
curl --request POST \
--url "$PRESENTON_URL/api/v1/ppt/presentation/generate" \
--header "Authorization: Bearer $PRESENTON_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create a six-slide partner enablement presentation for a new analytics product.",
"template": "general"
}'
```
Smart mode and `smart_design` belong to Presenton Cloud. Open Source
uses the installed template named in `template`.
## 4. Import a PPTX template and generate
Template import happens in the Presenton interface. After validating fonts,
layouts, and representative content, use the saved template name in v1
generation requests.
Import in the interface, then use the saved template name in API requests.
```bash theme={null}
curl --request POST \
--url "$PRESENTON_URL/api/v1/ppt/presentation/generate" \
--header "Authorization: Bearer $PRESENTON_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create a seven-slide annual strategy presentation for the leadership offsite.",
"template": "REPLACE_WITH_IMPORTED_TEMPLATE_NAME"
}'
```
Follow [Create a template from PPTX](../user-guide/branding-and-design/templates)
for the import workflow.
## 5. Run background jobs with async APIs and webhooks
Queue work on your instance and finish through polling or webhook delivery.
### Poll for completion
```bash theme={null}
curl --request POST \
--url "$PRESENTON_URL/api/v1/ppt/presentation/generate/async" \
--header "Authorization: Bearer $PRESENTON_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create an eight-slide executive briefing about the rollout of a new customer analytics platform."
}'
```
```bash theme={null}
curl --request GET \
--url "$PRESENTON_URL/api/v1/ppt/presentation/status/REPLACE_WITH_TASK_ID" \
--header "Authorization: Bearer $PRESENTON_API_KEY"
```
### Receive a webhook
Subscribe the instance, then set `trigger_webhook` to `true` in the async
generation request.
```bash theme={null}
curl --request POST \
--url "$PRESENTON_URL/api/v1/webhook/subscribe" \
--header "Authorization: Bearer $PRESENTON_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"url": "https://app.example.com/webhooks/presenton",
"secret": "REPLACE_WITH_A_RANDOM_SECRET",
"event": "presentation.generation.completed"
}'
```
```bash theme={null}
curl --request POST \
--url "$PRESENTON_URL/api/v1/ppt/presentation/generate/async" \
--header "Authorization: Bearer $PRESENTON_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"content": "Create an eight-slide executive briefing about the rollout of a new customer analytics platform.",
"trigger_webhook": true
}'
```
See [Generate asynchronously](../api-reference/presentation/generate-a-presentation-asynchronously),
[Get generation status](../api-reference/presentation/get-generation-status),
and [Subscribe a webhook](../api-reference/webhook/subscribe-a-webhook).
Use the Open Source tab for APIs hosted by your own Presenton instance.
Prompt → sources → installed template → background jobs
# Create and use a Smart Design
Source: https://docs.presenton.ai/api-guides/smart-generation
List Smart Designs, create one from a reference PPTX with an access token, and use it to generate a Cloud presentation.
Smart generation applies the visual language of an existing presentation to a
new deck. Use an existing Smart Design or create one from a reference PPTX.
This workflow crosses two API versions:
1. List available Smart Designs with Cloud API v3.
2. Check fonts, upload the PPTX and fonts, generate previews, and create a
Smart Design with API v2.
3. Pass the resulting design ID to Cloud API v3 presentation generation.
## Before you begin
Use a user access token that is authorized to create designs. Pass it as a
Bearer token on every request in this workflow:
```http theme={null}
Authorization: Bearer YOUR_ACCESS_TOKEN
```
All endpoints in this workflow require a user access token. Use the same
access token for the v2 design-creation and Cloud v3 requests.
## 1. List Smart Designs with v3
List the Smart Designs available to the authenticated account:
```bash theme={null}
curl --request GET \
--url "https://api.presenton.ai/api/v3/smart-design/all?page=1&page_size=10" \
--header "Authorization: Bearer YOUR_ACCESS_TOKEN"
```
The response is paginated. Use the `id` of a design as `smart_design` when
generating a presentation.
```json theme={null}
{
"total_pages": 1,
"page": 1,
"page_size": 10,
"results": [
{
"id": "7e49d7f0-3667-4f48-936a-60b0ca97810f",
"name": "Acme Brand",
"thumbnail_url": "https://example.com/designs/acme-brand.png",
"created_at": "2026-08-07T08:30:00Z",
"updated_at": "2026-08-07T08:30:00Z"
}
]
}
```
See [List Smart Designs](../api-reference/v3-smart-design/list-smart-designs).
If the design you need is already listed, skip to
[Generate with the Smart Design](#3-generate-with-the-smart-design-using-v3).
## 2. Create a Smart Design with v2
Design creation is asynchronous. Check the reference deck's fonts, upload any
required replacements and generate previews, then start design creation and
poll its status.
### Check fonts in the reference PPTX
Upload the PPTX to identify fonts Presenton can resolve and fonts for which you
must provide files:
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v2/ppt/fonts/check \
--header "Authorization: Bearer YOUR_ACCESS_TOKEN" \
--form "pptx_file=@./acme-brand.pptx"
```
```json theme={null}
{
"available_fonts": [
{
"name": "Inter Regular",
"url": "https://fonts.googleapis.com/css2?family=Inter",
"original_name": "Inter",
"variant": "regular"
}
],
"unavailable_fonts": [
{
"name": "Acme Sans Regular",
"url": null,
"original_name": "Acme Sans",
"variant": "regular"
}
]
}
```
See [Check fonts in a PPTX](../api-reference/v2-fonts/check-fonts-in-a-pptx).
### Upload fonts and generate previews
Upload the same PPTX. For each font you want to replace, add one `font_files`
field and one matching `original_font_names` field. Presenton pairs repeated
fields by order.
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v2/ppt/fonts/upload-and-preview \
--header "Authorization: Bearer YOUR_ACCESS_TOKEN" \
--form "pptx_file=@./acme-brand.pptx" \
--form "font_files=@./AcmeSans-Regular.ttf" \
--form "original_font_names=Acme Sans"
```
If no font files are required, omit `font_files` and `original_font_names`.
```json theme={null}
{
"slide_image_urls": [
"https://example.com/previews/acme-brand/slide-1.png",
"https://example.com/previews/acme-brand/slide-2.png"
],
"pptx_url": "https://example.com/uploads/acme-brand.pptx",
"modified_pptx_url": "https://example.com/uploads/acme-brand.pptx",
"fonts": {
"Inter": "https://fonts.googleapis.com/css2?family=Inter",
"Acme Sans Regular": "https://example.com/fonts/AcmeSans-Regular.ttf"
}
}
```
Review every URL in `slide_image_urls` before creating the design. Then retain
`pptx_url`, `slide_image_urls`, and `fonts` for the next request.
See [Upload fonts and generate slide previews](../api-reference/v2-fonts/upload-fonts-and-generate-slide-previews).
### Start asynchronous design creation
Pass `pptx_url`, `slide_image_urls`, and `fonts` from the preview response
without modifying them:
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v2/ppt/design/create/async \
--header "Authorization: Bearer YOUR_ACCESS_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"name": "Acme Brand",
"pptx_url": "https://example.com/uploads/acme-brand.pptx",
"slide_image_urls": [
"https://example.com/previews/acme-brand/slide-1.png",
"https://example.com/previews/acme-brand/slide-2.png"
],
"fonts": {
"Inter": "https://fonts.googleapis.com/css2?family=Inter",
"Acme Sans Regular": "https://example.com/fonts/AcmeSans-Regular.ttf"
}
}'
```
The response contains the task ID used to monitor design creation:
```json theme={null}
{
"id": "task-9a827c13f4",
"status": "pending",
"message": "Queued for extraction",
"created_at": "2026-08-07T08:35:00Z",
"updated_at": "2026-08-07T08:35:00Z",
"data": null
}
```
See [Create a Smart Design asynchronously](../api-reference/v2-design/create-a-smart-design-asynchronously).
### Check design creation status
Poll the status endpoint until `status` is `completed` or `error`:
```bash theme={null}
curl --request GET \
--url https://api.presenton.ai/api/v2/ppt/design/status/task-9a827c13f4 \
--header "Authorization: Bearer YOUR_ACCESS_TOKEN"
```
While the task runs, `status` is `pending` or `processing`. A completed
response contains the new Smart Design ID in `data.design_id`:
```json theme={null}
{
"id": "task-9a827c13f4",
"status": "completed",
"message": "Design created",
"created_at": "2026-08-07T08:35:00Z",
"updated_at": "2026-08-07T08:43:00Z",
"data": {
"id": "7e49d7f0-3667-4f48-936a-60b0ca97810f",
"design_id": "7e49d7f0-3667-4f48-936a-60b0ca97810f",
"slides": 12
},
"error": null
}
```
If `status` is `error`, inspect `message` and `error` before retrying. See
[Get Smart Design creation status](../api-reference/v2-design/get-smart-design-creation-status).
## 3. Generate with the Smart Design using v3
Set `smart_design` to an ID returned by the list endpoint or to
`data.design_id` from the completed design-creation task:
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/presentation/generate \
--header "Authorization: Bearer YOUR_ACCESS_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"content": "Create an eight-slide Acme quarterly business review.",
"n_slides": 8,
"language": "English",
"smart_design": "7e49d7f0-3667-4f48-936a-60b0ca97810f",
"export_as": "pptx"
}'
```
```json theme={null}
{
"presentation_id": "d3000f96-096c-4768-b67b-e99aed029b57",
"path": "https://example.com/presentations/Acme-quarterly-business-review.pptx",
"edit_path": "https://presenton.ai/presentation?id=d3000f96-096c-4768-b67b-e99aed029b57",
"credits_consumed": 8
}
```
See [Generate a presentation synchronously](../api-reference/v3-presentation/generate-a-presentation-synchronously).
For background generation, send the same `smart_design` value to
`POST /api/v3/presentation/generate/async` and follow the
[asynchronous generation guide](../cloud/guides/async-generation).
# Create a presentation from JSON
Source: https://docs.presenton.ai/api-guides/standard-from-json
Discover a Standard template's layouts and schemas, inspect its example content, and create a presentation from validated JSON.
Use this workflow when your application already owns the slide content and
needs Presenton to render it with a Standard template. Each slide selects a
template layout and supplies a `content` object that satisfies that layout's
JSON schema.
## Before you begin
Create a Cloud API key and pass it as a Bearer token on every request:
```http theme={null}
Authorization: Bearer YOUR_API_KEY
```
## 1. Get Standard templates
List the templates available to the authenticated Cloud account:
```bash theme={null}
curl --request GET \
--url "https://api.presenton.ai/api/v3/standard-template/all?page=1&page_size=20" \
--header "Authorization: Bearer YOUR_API_KEY"
```
```json theme={null}
{
"items": [
{
"id": "neo-modern",
"name": "Neo Modern",
"description": "A clean, modern presentation template",
"layout_count": 12,
"thumbnail": "https://example.com/templates/neo-modern.png",
"is_default": true,
"created_at": "2026-08-07T08:30:00Z",
"updated_at": "2026-08-07T08:30:00Z"
}
],
"total": 1,
"page": 1,
"page_size": 20
}
```
Save the selected template's `id`. You will use it in the next three requests.
Use the optional `default` query parameter to filter the list: `true` returns
default templates and `false` returns custom templates.
See [List Standard templates](../api-reference/v3-standard-template/list-standard-templates).
## 2. Get the template and its schemas
Retrieve the selected template by ID:
```bash theme={null}
curl --request GET \
--url https://api.presenton.ai/api/v3/standard-template/neo-modern \
--header "Authorization: Bearer YOUR_API_KEY"
```
The response includes one entry in `schemas` for each template layout. The
schema's `title` is the layout ID to send as `slides[].layout`. The entire
`slides[].content` object must validate against the corresponding schema.
```json theme={null}
{
"id": "neo-modern",
"name": "Neo Modern",
"description": "A clean, modern presentation template",
"layout_count": 12,
"thumbnail": "https://example.com/templates/neo-modern.png",
"is_default": true,
"created_at": "2026-08-07T08:30:00Z",
"updated_at": "2026-08-07T08:30:00Z",
"merged_components": {},
"layouts": {
"layouts": [
{
"id": "title-and-bullets",
"description": "A title followed by a concise list"
}
]
},
"fonts": {
"Inter": "https://fonts.googleapis.com/css2?family=Inter"
},
"schemas": [
{
"title": "title-and-bullets",
"type": "object",
"properties": {
"main": {
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 8,
"maxLength": 80
},
"bullets": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 2,
"maxItems": 5
}
},
"required": ["title", "bullets"]
}
},
"required": ["main"]
}
]
}
```
The response above illustrates the shape of `schemas`. Layout IDs, component
names, fields, types, and constraints vary by template. Always use the live
response for the selected template.
See [Get a Standard template](../api-reference/v3-standard-template/get-a-standard-template).
## 3. Get the template example
The example endpoint returns representative `layout` and `content` pairs that
already conform to the selected template's schemas:
```bash theme={null}
curl --request GET \
--url https://api.presenton.ai/api/v3/standard-template/neo-modern/example \
--header "Authorization: Bearer YOUR_API_KEY"
```
```json theme={null}
{
"standard_template": "neo-modern",
"slides": [
{
"layout": "title-and-bullets",
"content": {
"main": {
"title": "Quarterly customer health",
"bullets": [
"Enterprise retention remained above target",
"Time to first value improved",
"Support response time needs attention"
]
}
}
}
]
}
```
Use the example to understand the expected nesting and content density. Do not
assume the example fields apply to a different template or layout.
See [Get a template example](../api-reference/v3-standard-template/get-a-template-example).
## 4. Create the presentation from JSON
Build each slide with a layout from the selected template and content that
validates against that layout's schema. Then send the result to the synchronous
from-JSON endpoint:
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/presentation/from-json \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"title": "Quarterly customer health review",
"language": "English",
"standard_template": "neo-modern",
"export_as": "pptx",
"slides": [
{
"layout": "title-and-bullets",
"content": {
"main": {
"title": "Quarterly customer health",
"bullets": [
"Enterprise retention remained above target",
"Time to first value improved",
"Support response time needs attention"
]
}
},
"speaker_note": "Introduce the purpose and reporting period."
}
]
}'
```
```json theme={null}
{
"presentation_id": "d3000f96-096c-4768-b67b-e99aed029b57",
"path": "https://example.com/presentations/quarterly-customer-health.pptx",
"edit_path": "https://presenton.ai/presentation?id=d3000f96-096c-4768-b67b-e99aed029b57",
"credits_consumed": 1
}
```
See [Create from JSON synchronously](../api-reference/v3-presentation/create-from-json-synchronously).
Before submitting the request, validate each `content` object against its live
schema. This catches missing fields, incorrect value types, length violations,
and invalid array sizes before the rendering request.
# Delete a presentation
Source: https://docs.presenton.ai/api-reference/presentation/delete-a-presentation
/openapi/self-hosted.json delete /api/v1/ppt/presentation/{id}
Permanently delete one presentation from this instance.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Derive a presentation
Source: https://docs.presenton.ai/api-reference/presentation/derive-a-presentation
/openapi/self-hosted.json post /api/v1/ppt/presentation/derive
Create a modified presentation while preserving the original.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Edit a presentation
Source: https://docs.presenton.ai/api-reference/presentation/edit-a-presentation
/openapi/self-hosted.json post /api/v1/ppt/presentation/edit
Apply new content to an existing presentation and return the updated result.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Async generation (self-hosted)
Source: https://docs.presenton.ai/api-reference/presentation/generate-a-presentation-asynchronously
/openapi/self-hosted.json post /api/v1/ppt/presentation/generate/async
Create a background generation task and return immediately with its task identifier.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Sync generation (self-hosted)
Source: https://docs.presenton.ai/api-reference/presentation/generate-a-presentation-synchronously
/openapi/self-hosted.json post /api/v1/ppt/presentation/generate
Create and export a presentation before returning the final presentation paths.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Get a presentation
Source: https://docs.presenton.ai/api-reference/presentation/get-a-presentation
/openapi/self-hosted.json get /api/v1/ppt/presentation/{id}
Return one presentation and its slides.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Get generation status
Source: https://docs.presenton.ai/api-reference/presentation/get-generation-status
/openapi/self-hosted.json get /api/v1/ppt/presentation/status/{id}
Return the state and result or error data for an asynchronous presentation task.
[Read the async and webhooks guide](/user-guide/api-and-automation/async-and-webhooks).
# Presentations (self-hosted)
Source: https://docs.presenton.ai/api-reference/presentation/list-presentations
/openapi/self-hosted.json get /api/v1/ppt/presentation/all
List presentations stored by this Presenton instance.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Edit a slide
Source: https://docs.presenton.ai/api-reference/slide/edit-a-slide
/openapi/self-hosted.json post /api/v1/ppt/slide/edit
Apply an AI-assisted edit to one stored slide.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Create a Smart Design asynchronously
Source: https://docs.presenton.ai/api-reference/v2-design/create-a-smart-design-asynchronously
/openapi/cloud.json post /api/v2/ppt/design/create/async
Start creating a Smart Design from the uploaded PPTX, slide previews, and font assets.
[Read the Smart Generation guide](/api-guides/smart-generation).
# Get Smart Design creation status
Source: https://docs.presenton.ai/api-reference/v2-design/get-smart-design-creation-status
/openapi/cloud.json get /api/v2/ppt/design/status/{id}
Return the current state and result or error data for an asynchronous Smart Design creation task.
[Read the Smart Generation guide](/api-guides/smart-generation).
# Check fonts in a PPTX
Source: https://docs.presenton.ai/api-reference/v2-fonts/check-fonts-in-a-pptx
/openapi/cloud.json post /api/v2/ppt/fonts/check
Inspect a reference PPTX and report fonts that are available or require uploaded font files.
[Read the Smart Generation guide](/api-guides/smart-generation).
# Upload fonts and generate slide previews
Source: https://docs.presenton.ai/api-reference/v2-fonts/upload-fonts-and-generate-slide-previews
/openapi/cloud.json post /api/v2/ppt/fonts/upload-and-preview
Upload a reference PPTX and any replacement fonts, then return slide previews and assets used to create a Smart Design.
[Read the Smart Generation guide](/api-guides/smart-generation).
# Get task status
Source: https://docs.presenton.ai/api-reference/v3-async-task/get-task-status
/openapi/cloud.json get /api/v3/async-task/status/{id}
Return the current state and result or error data for an asynchronous Cloud task.
[Read the async and webhooks guide](/user-guide/api-and-automation/async-and-webhooks).
# Upload source files (Cloud)
Source: https://docs.presenton.ai/api-reference/v3-files/upload-source-files
/openapi/cloud.json post /api/v3/files/upload
Upload documents or other supported source files and return identifiers that can be used in Cloud generation requests.
[Read the files and content guide](/user-guide/api-and-automation/files-and-content).
# Delete image (Cloud)
Source: https://docs.presenton.ai/api-reference/v3-images/delete-an-uploaded-image
/openapi/cloud.json delete /api/v3/images/{id}
Delete one uploaded image owned by the authenticated Cloud account.
[Read the files and content guide](/user-guide/api-and-automation/files-and-content).
# Uploaded images (Cloud)
Source: https://docs.presenton.ai/api-reference/v3-images/list-uploaded-images
/openapi/cloud.json get /api/v3/images/uploaded
List images uploaded to the authenticated Cloud account.
[Read the files and content guide](/user-guide/api-and-automation/files-and-content).
# Upload image (Cloud)
Source: https://docs.presenton.ai/api-reference/v3-images/upload-an-image
/openapi/cloud.json post /api/v3/images/upload
Upload an image and return the identifier used by presentation workflows.
[Read the files and content guide](/user-guide/api-and-automation/files-and-content).
# Create a presentation integration token
Source: https://docs.presenton.ai/api-reference/v3-presentation/create-a-presentation-integration-token
/openapi/cloud.json post /api/v3/presentation/integrate
Create a temporary, scoped URL for embedding an existing Cloud presentation in an iframe.
[Read the iframe integration guide](/user-guide/managing-presentations/embed-presentation-preview).
# Create from JSON asynchronously
Source: https://docs.presenton.ai/api-reference/v3-presentation/create-from-json-asynchronously
/openapi/cloud.json post /api/v3/presentation/from-json/async
Create a background task that builds a presentation from structured slide content.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Create from JSON synchronously
Source: https://docs.presenton.ai/api-reference/v3-presentation/create-from-json-synchronously
/openapi/cloud.json post /api/v3/presentation/from-json
Create and export a presentation from structured slide content before returning.
[Read the Create Presentation from JSON guide](/api-guides/standard-from-json).
# Export a presentation
Source: https://docs.presenton.ai/api-reference/v3-presentation/export-a-presentation
/openapi/cloud.json post /api/v3/presentation/export
Export an existing Cloud presentation in a supported output format.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Async generation (Cloud)
Source: https://docs.presenton.ai/api-reference/v3-presentation/generate-a-presentation-asynchronously
/openapi/cloud.json post /api/v3/presentation/generate/async
Create a background Cloud generation task and return immediately with its task identifier.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Sync generation (Cloud)
Source: https://docs.presenton.ai/api-reference/v3-presentation/generate-a-presentation-synchronously
/openapi/cloud.json post /api/v3/presentation/generate
Create and export a Cloud presentation before returning the final presentation paths.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Generate an outline
Source: https://docs.presenton.ai/api-reference/v3-presentation/generate-an-outline
/openapi/cloud.json post /api/v3/presentation/outlines/generate
Generate a presentation outline without creating the final deck.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# Presentations (Cloud)
Source: https://docs.presenton.ai/api-reference/v3-presentation/list-presentations
/openapi/cloud.json get /api/v3/presentation/all
List presentations owned by the authenticated Cloud account.
[Read the presentation workflow guide](/api-guides/presentation-generation-flows).
# List Smart Designs
Source: https://docs.presenton.ai/api-reference/v3-smart-design/list-smart-designs
/openapi/cloud.json get /api/v3/smart-design/all
List Smart Designs available for Cloud presentation generation.
[Read the Smart Generation guide](/api-guides/smart-generation).
# Get a standard template
Source: https://docs.presenton.ai/api-reference/v3-standard-template/get-a-standard-template
/openapi/cloud.json get /api/v3/standard-template/{template_id}
Return metadata for one standard template.
[Read the Create Presentation from JSON guide](/api-guides/standard-from-json).
# Get a template example
Source: https://docs.presenton.ai/api-reference/v3-standard-template/get-a-template-example
/openapi/cloud.json get /api/v3/standard-template/{template_id}/example
Return the example presentation associated with a standard template.
[Read the Create Presentation from JSON guide](/api-guides/standard-from-json).
# List standard templates
Source: https://docs.presenton.ai/api-reference/v3-standard-template/list-standard-templates
/openapi/cloud.json get /api/v3/standard-template/all
List standard templates available to the authenticated Cloud account.
[Read the Create Presentation from JSON guide](/api-guides/standard-from-json).
# List webhook subscriptions
Source: https://docs.presenton.ai/api-reference/v3-webhook/list-webhook-subscriptions
/openapi/cloud.json get /api/v3/webhook/all
List webhook subscriptions owned by the authenticated Cloud account.
[Read the async and webhooks guide](/user-guide/api-and-automation/async-and-webhooks).
# Subscribe webhook (Cloud)
Source: https://docs.presenton.ai/api-reference/v3-webhook/subscribe-a-webhook
/openapi/cloud.json post /api/v3/webhook/subscribe
Subscribe an HTTPS endpoint to supported Presenton events.
[Read the async and webhooks guide](/user-guide/api-and-automation/async-and-webhooks).
# Unsubscribe webhook (Cloud)
Source: https://docs.presenton.ai/api-reference/v3-webhook/unsubscribe-a-webhook
/openapi/cloud.json delete /api/v3/webhook/unsubscribe
Remove one webhook subscription.
[Read the async and webhooks guide](/user-guide/api-and-automation/async-and-webhooks).
# Content sources
Source: https://docs.presenton.ai/general/content-sources
Choose focused prompts, files, and data for clearer AI-generated presentations.
A content source gives Presenton the subject matter for a deck. Your brief tells it what result to create; supporting material supplies the facts and detail.
## Choose the right input
| Source | Best for | Prepare it by |
| --------------------- | ------------------------------------------- | ----------------------------------------------------------- |
| Prompt or brief | A new deck based on a clear idea | Naming the audience, goal, scope, and tone |
| Documents | Summaries, proposals, training, or research | Removing irrelevant pages and identifying must-use sections |
| Structured data | Reports and repeatable automation | Using consistent fields, labels, units, and date ranges |
| Existing presentation | Derivation or design-led workflows | Removing stale slides and checking the source file |
| Images and media | Visual evidence or assets | Using relevant, legible, appropriately licensed files |
## Brief + evidence works better than either alone
## Improve source quality
* Include only material relevant to the presentation goal.
* State which facts, quotes, dates, and figures must remain exact.
* Define acronyms and explain internal terminology.
* Make units and reporting periods explicit in structured data.
* Separate instructions from source content when possible.
* Avoid conflicting versions of the same document unless you explain which one should win.
Uploaded or pasted material does not become automatically correct because it appears in a generated slide. Compare important output with the original source before delivery.
## Understand where content is processed
Cloud processes content through the managed service. In self-hosted deployments, the application runs on your infrastructure, but configured external providers may still receive prompts or derived content. Review your provider configuration and data-handling requirements before using sensitive material.
Learn how documents, structured data, images, and charts enter the workflow.
# Cloud and self-hosted deployment modes
Source: https://docs.presenton.ai/general/deployment-modes
Compare Presenton Cloud with the self-hosted open-source AI presentation generator.
Presenton is available as a managed Cloud service and as open-source software you run yourself. Both support the same core prompt-to-presentation journey, but they differ in setup, providers, storage, and API contracts.
The public `presenton/presenton` repository contains the self-hosted web application, Electron desktop packaging, FastAPI backend, Next.js frontend, templates, and deployment tooling. Cloud is a managed product surface and may not expose every repository capability in the same way.
## Compare the operating models
| Decision | Cloud | Self-hosted |
| ---------------------- | ------------------------- | --------------------------------------------------- |
| Best when | You want to start quickly | You need infrastructure, data, and provider control |
| Application operations | Managed by Presenton | Managed by you |
| AI and media providers | Managed service | You configure supported providers |
| Storage and backups | Managed service | Your responsibility |
| User experience | Browser | Browser with Docker, or desktop app |
| API | Cloud v3 | Self-hosted v1 |
| Updates | Delivered by Presenton | You choose and deploy a release |
| License | Managed service terms | Apache 2.0 open-source code |
Cloud v3 and self-hosted v1 use different base URLs, authentication, and endpoint paths. Treat them as separate integrations.
## Choose Cloud when
* You want to create in a browser without installing or operating Presenton.
* You prefer managed providers, processing, storage, and updates.
* You want the Cloud API for an integration.
## Choose self-hosted when
* Your organization needs to control the runtime, storage, and network boundary.
* You want to select supported text, image, search, or storage providers, including local or OpenAI-compatible providers.
* You need a local desktop workflow or an internally operated API.
Self-hosting alone does not make generation offline. Content may be sent to any external AI, image, or search provider you configure. Use local providers and review every dependency when an offline or restricted-data workflow is required.
Create a first presentation in the managed application.
Review installation, configuration, security, and operations.
# Feature availability
Source: https://docs.presenton.ai/general/feature-availability
Compare Cloud and self-hosted Presenton capabilities before choosing a workflow.
The creation workflow is shared, but feature availability and operating responsibility differ. Use this page as a quick comparison, then open the detailed guide for the capability you plan to use.
Capabilities can vary by release, account, deployment configuration, and selected presentation format. Use the version selector and test a representative deck before committing to a production workflow.
## Capabilities
| Capability | Cloud | Self-hosted |
| ----------------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------ |
| Browser application | Available | Available with a server deployment |
| Desktop application | Not applicable | Available for Windows, macOS, and Linux |
| Standard presentations | Available | Standard documented |
| Smart presentations | Available | Available with Smart HTML generation and editing |
| Reusable custom templates | Available | Available |
| Editable Standard object canvas | Available with text, media, shape, table, chart, layout, and component tools | Same editor capabilities |
| Targeted AI editing | Available for selected slides and components | Same editor capabilities |
| Slide management | Add, duplicate, delete, and reorder slides | Same editor capabilities |
| PPTX and PDF export | Available | Available |
| REST API | Cloud v3 | Self-hosted v1 |
| Webhook workflows | Available | Available |
| MCP server | Not covered by this Cloud reference | Available except in the desktop app |
| Configurable AI and media providers | Managed service | Available |
| Local model workflows | Not user-configured | Available with compatible local providers |
The shared Standard canvas exposes controls according to the selected object. Selecting an image shows image tools such as crop and flip; selecting a chart opens data, type, title, value, axis, gridline, color, and opacity controls.
## Operating responsibility
| Responsibility | Cloud | Self-hosted |
| ------------------------------ | --------- | ----------- |
| Application deployment | Presenton | You |
| Application updates | Presenton | You |
| Provider configuration | Presenton | You |
| Persistent storage and backups | Presenton | You |
| Host security and TLS | Presenton | You |
| Capacity and health monitoring | Presenton | You |
“Available” does not mean identical. Cloud v3 and self-hosted v1 have different authentication, URLs, endpoints, and request schemas. Use the API reference for your deployment mode.
## Confirm before you commit to a workflow
1. Select the documentation version that matches the release you use.
2. Check the detailed guide for the capability—not only this summary.
3. Test a representative presentation, template, edit, and export.
4. For automation, validate the exact endpoint and schema in the relevant OpenAPI reference.
Choose between a managed and self-operated environment.
Select Cloud v3 or self-hosted v1 before integrating.
# Generation lifecycle
Source: https://docs.presenton.ai/general/generation-lifecycle
Understand the stages, checkpoints, and failure boundaries of AI presentation generation.
Generation is a sequence of work, not a single AI response. Knowing the stages helps you decide whether to revise the input, wait for a task, or troubleshoot a dependency.
## Lifecycle stages
| Stage | What happens | What to check |
| ------------- | -------------------------------------------------------- | ---------------------------------------------------------------- |
| Input ready | The brief, source files, and controls are collected | Scope, file relevance, and must-keep facts |
| Outline ready | Presenton proposes the deck structure | Flow, coverage, repetition, and slide count |
| Generating | Content, layouts, and visuals are assembled and rendered | Wait for completion; avoid duplicate submissions |
| Ready | The presentation can be opened and reviewed | Accuracy, design fit, and missing content |
| Editing | You refine the generated result | Preserve verified facts while changing wording or layout |
| Exported | A PPTX or PDF is produced | Open the file and inspect fonts, charts, images, and page bounds |
## Synchronous and asynchronous API work
The request stays open while generation runs and returns after the operation completes or fails. Use it when the caller can safely wait for the full result.
The request creates background work and returns a task identifier. Poll the deployment-specific status endpoint, or use a supported webhook workflow, until the task reaches a terminal state.
Do not retry an asynchronous request only because generation is taking longer than expected. Check its task status first to avoid creating duplicate presentations.
## Where failures usually belong
* **Before outline creation:** inspect the input, upload, document processing, and provider configuration.
* **During generation:** inspect text, image, template, and rendering dependencies.
* **During export:** inspect fonts, assets, browser/export runtime, and storage.
Implement the lifecycle with the correct API surface.
Diagnose a failed or incomplete generation.
# Get started
Source: https://docs.presenton.ai/general/get-started
Choose Cloud, Docker, or desktop and create your first presentation.
Pick one path. If you only want to try Presenton, Cloud is the shortest route. Choose Docker or desktop when you want to operate the open-source application and configure providers yourself.
**Before you start:** Prepare a short topic or a focused source document.
Sign in to the [Presenton dashboard](https://presenton.ai/dashboard).
State the audience, purpose, desired slide count, and must-include points. Add source material when it should ground the deck.
Correct the structure and remove repetition before generating slides.
Select a suitable template, generate the deck, then review every slide for accuracy and visual fit.
Download the result as PPTX for continued editing or PDF for fixed-layout review.
Follow the complete browser workflow.
**Before you start:** Confirm the [system requirements](/hosting/system-requirements) and decide which providers you will use.
Follow the self-hosted quickstart and mount `/app_data` for persistent application data.
Add a supported text provider. Configure image, search, storage, and authentication options as required.
Visit the host and port mapped to the container, then create and verify a small test deck.
Install the documented release with persistent storage.
**Before you start:** Choose a supported package for Windows, macOS, or Linux and have provider credentials ready if you will use a hosted model.
Download the correct package, install it, and open Presenton.
Configure a supported hosted provider or a local model available to your machine.
Use a short prompt first. Confirm generation and export work before adding large documents or custom templates.
Download and verify the desktop application.
## A useful first brief
```text theme={null}
Create an 8-slide project update for executive stakeholders.
Focus on progress, risks, decisions needed, and next steps.
Use a concise, factual tone. Preserve all dates and figures from the source.
```
A good brief names the audience, outcome, scope, tone, and facts that must not change.
# How Presenton works
Source: https://docs.presenton.ai/general/how-presenton-works
Follow the AI presentation workflow from source material to an editable PPTX or PDF.
Presenton separates **story planning** from **slide generation**. That gives you a useful checkpoint: approve the narrative before spending time on slide design.
In the current application, the outline is editable and can also be generated with AI assistance. Once you approve it, Presenton maps the story to a selected template, creates supported slide elements, fetches configured assets, and prepares the presentation for editing and export.
## 1. Add direction and sources
Provide a topic or brief. Add relevant files or structured input when the deck must reflect existing material. Generation controls can further describe tone, language, length, and visual preferences.
**Your checkpoint:** Is the goal clear, and is the source focused enough to support it?
## 2. Review the outline
Presenton proposes the narrative before building the deck. Reorder sections, remove weak ideas, and add missing details while the deck is still easy to reshape.
**Your checkpoint:** Would this outline make sense without seeing the slides?
## 3. Generate the slides
Presenton maps the approved story into the selected presentation format and template. It creates supported text, images, shapes, tables, charts, and layout elements for each slide.
**Your checkpoint:** Does the template suit the audience and content density?
## 4. Edit and verify
Refine the generated deck using the editing tools available in your deployment mode. Check names, dates, figures, claims, citations, layout, and image relevance.
Editing changes the generated presentation. It does not automatically send the deck back to the outline step; outline review happens before generation, and outline regeneration is a separate outline-page action.
**Your checkpoint:** Could someone act on incorrect content? If yes, verify it against the original source.
## 5. Export
Export to **PPTX** when the deck needs continued editing in PowerPoint-compatible software. Export to **PDF** when you need a fixed-layout review or delivery copy.
## What changes by deployment mode
Presenton manages the application, providers, processing, storage, and export runtime. Browser and API workflows use Cloud capabilities and the v3 API.
Your deployment uses the providers, storage, authentication, and compute you configure. Browser and automation workflows use the self-hosted application and v1 API.
Learn what happens during synchronous and asynchronous generation.
# AI presentation maker overview
Source: https://docs.presenton.ai/general/overview
Use Presenton as an open-source AI presentation generator for editable PPTX and PDF decks.
Presenton is an open-source AI presentation generator for teams, developers, and creators who need more than a static slide image. Start with a prompt, document, data, or API request; review the outline; generate with a reusable design; edit the result; and export to **PPTX** or **PDF**.
## Watch Presenton in action
## Draft, edit, export
Presenton is built for the whole path from first draft to final deck. Generate a structured presentation, refine the editable slide elements, then export when it is ready to share.
## Start your way
Create in the browser with managed infrastructure, providers, storage, and updates.
Use Docker or the desktop app when you need control over deployment, storage, and model providers.
Use the presentation generation API to create, track, edit, and export decks from your own product or workflow.
## One workflow, editable end to end
1
Give Presenton source material and review the outline.
2
Generate a deck with a reusable design or template.
3
Edit the result, verify the content, and export PPTX or PDF.
## Built for how you work
### Keep sensitive presentation work under your control
Self-host Presenton when privacy, compliance, or internal deployment requirements matter. You choose the infrastructure, storage, authentication, network boundary, and supported model providers.
Start with Docker in five minutes and explore support for custom enterprise requirements.
### Build presentation generation into your product
Use REST APIs, asynchronous tasks, webhooks, or the self-hosted MCP workflow to create presentations from applications, internal tools, and recurring data processes.
Compare Cloud v3 with self-hosted v1 before implementing an integration.
### Design without losing editability
Build branded decks with reusable templates and refine them on a structured canvas. Edit typography, images, shapes, tables, charts, layouts, slides, and selected components with targeted AI assistance.
See the current creation, editing, template, and export capabilities.
## Explore the documentation
Create, edit, brand, organize, and export presentations.
Install, configure, secure, and operate self-hosted Presenton.
Build with Cloud v3 or the self-hosted v1 API.
Diagnose generation, editing, export, hosting, and integration problems.
AI-generated slides are a draft. Verify facts, figures, citations, and brand requirements before presenting or publishing them.
# Presentation context
Source: https://docs.presenton.ai/general/presentation-context
Give editing requests enough context without relying on hidden assumptions.
Presentation context is the information available when Presenton interprets an editing request. Depending on the workflow, it can include the current deck, source material, outline, and recent instructions.
Context helps with follow-up instructions such as “make this slide more concise” or “use the same tone in the next section.” It is not a guarantee that every earlier detail will be recalled or preserved.
## Write an actionable edit request
Use this pattern:
```text theme={null}
On slide 4, shorten the three risk descriptions to one sentence each.
Keep the risk names, owners, dates, and severity unchanged.
Use a direct executive tone.
```
| Include | Example |
| -------------- | --------------------------------------------- |
| Target | “On slide 4” or “in the pricing section” |
| Action | “Shorten,” “replace,” “add,” or “restructure” |
| Constraint | “Keep every figure unchanged” |
| Desired result | “Use three concise bullets” |
## Protect important information
* Repeat exact facts that must survive an edit.
* Name the slide, section, or element being changed.
* Point to the relevant source when the request depends on it.
* Split unrelated changes into separate requests.
* Review the visible result after every AI-assisted edit.
Treat the saved presentation—not assumed model memory—as the record of the current deck. If a detail matters, make it explicit in the request and verify it afterward.
## Context and persistence
Cloud manages application storage for the hosted workflow. In a self-hosted deployment, keep `/app_data` persistent so presentations, uploads, generated assets, settings, and local application state survive container replacement.
Configure persistence for a self-hosted deployment.
# Presentations and slides
Source: https://docs.presenton.ai/general/presentations-and-slides
Learn how outlines, slides, templates, layouts, and editable elements fit together.
Presenton builds a presentation as a sequence of slides. The outline controls the story; the template controls the visual system; each slide combines content with a suitable layout.
## The building blocks
| Concept | What it controls | Change it when… |
| ------------ | ------------------------------------------------------- | ------------------------------------------------ |
| Presentation | The complete deck and slide order | The story needs a different sequence |
| Outline | The planned message for each section or slide | An idea is missing, repeated, or misplaced |
| Template | Reusable design choices and available layouts | The deck must follow another brand or style |
| Layout | The arrangement of content on one slide | The current composition does not fit the message |
| Element | A text, image, shape, table, chart, or supported object | A specific part of the slide needs correction |
## Standard and Smart formats
Standard presentations use predefined, reusable layouts. Choose this format when consistency and predictable content placement matter. A template provides the layout options used during generation.
Smart presentations use a design reference to guide more adaptive slide composition. This format is available in Cloud for workflows that need more visual variation.
The current open-source application documents **Standard**. It uses reusable layouts and represents each slide as structured JSON rendered onto a `1280 x 720` editing canvas. Components and nested elements retain their geometry and styling, allowing direct selection, rich-text editing, drag-and-drop movement, transforms, layering, data editing, and targeted AI changes.
## What remains editable
| Object | Typical controls |
| ------------------------- | --------------------------------------------------------------------------------- |
| Text and lists | Content, typography, formatting, alignment, position, size, and rotation |
| Images | Source, fit, crop, flip, radius, opacity, position, and size |
| Shapes and lines | Fill, stroke, radius, shadow, opacity, position, and geometry |
| Tables | Cell content, rows, columns, ordering, and text alignment |
| Charts | Type, data, series, titles, values, axes, gridlines, labels, colors, and opacity |
| Components and containers | Position, dimensions, rotation, opacity, layering, padding, alignment, and layout |
| Slides | Layout, order, duplication, deletion, and AI-assisted changes |
Fix a story problem in the outline, a deck-wide visual problem in the template, and a local content problem on the slide. Choosing the right level avoids repetitive edits.
Prepare reusable layouts for branded generation.
Check which formats are documented for each mode.
# What Presenton does
Source: https://docs.presenton.ai/general/what-presenton-does
See how Presenton turns prompts, documents, and data into editable AI-generated presentations.
Presenton turns source material into an editable slide deck. It handles the repetitive first-draft work while you keep control of the message, design, and final review.
Unlike an image-only slide generator, Presenton builds presentation content that can continue through a normal PowerPoint workflow. The Standard presentation editor in Cloud and open-source Presenton lets you directly edit text, images, shapes, tables, charts, containers, and slide structure before exporting to PPTX or PDF.
## The work Presenton accelerates
| Stage | Presenton helps with | You decide |
| -------- | --------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
| Brief | Reads a prompt, documents, files, or structured input | Audience, goal, and must-keep facts |
| Story | Proposes an outline and slide sequence | What belongs, what does not, and what needs emphasis |
| Design | Applies a selected template and adds supported visuals | Brand fit and visual quality |
| Editing | Provides a drag-and-drop canvas, rich text and media tools, component controls, data editing, and targeted AI changes | Final wording, accuracy, brand fit, and approval |
| Delivery | Exports to PPTX or PDF | How and where the deck is shared |
## Edit beyond the first draft
The shared Standard editor is a structured slide canvas, not a flat preview. Select a slide, component, or individual element and adjust it without regenerating the entire presentation.
Edit title, subtitle, body, quote, and list content. Choose fonts and font sizes; apply text color, highlight, bold, italic, underline, and hyperlinks; change alignment; and move, resize, or rotate text elements.
Drag components freely, reposition them, and control width, height, rotation, and opacity. Resize or rotate with canvas handles, ungroup supported components, duplicate or paste selections, and use **Bring forward**, **Send backward**, **Bring to front**, or **Send to back** to control stacking order.
Insert and edit rectangles, ellipses, and lines. Control fill, border, radius, stroke width, shadow, opacity, size, and position. Use horizontal, vertical, flex, grid, and container layouts with alignment, padding, background, border, and radius controls.
Insert, upload, or replace images; choose fit behavior; crop and reposition the image within its frame; flip horizontally or vertically; and adjust border radius and opacity. Templates can combine images with text or arrange them in reusable grids and layouts.
Insert tables, paste tabular data, edit cells, add or remove rows and columns, move columns, and change text alignment. Create bar, line, area, pie, and doughnut charts; edit or import chart data; manage rows, columns, and series; switch chart types; configure titles, values, axes, gridlines, labels, colors, and opacity; and export chart data as CSV.
Add blank slides, apply template layouts, duplicate or delete slides, and reorder the deck. Build reusable layouts from a PPTX, generate presentations from those templates, then use the context-aware assistant for selected-slide or selected-component edits and targeted follow-up responses.
These capabilities describe the Standard editor shared by Cloud and open-source Presenton. The controls you see change according to the selected slide element.
## Common ways to use it
Create a pitch, lesson, proposal, or internal update from a clear brief.
Turn relevant source material into a shorter visual narrative.
Generate recurring decks from structured input and a stable template.
Add presentation generation to an application or automated workflow.
## Where it fits
Presenton can be used through its browser interface for hands-on creation, through the self-hosted MCP server for an AI-tool workflow, or through REST APIs for application-driven generation. The self-hosted MCP surface exposes synchronous generation, asynchronous generation, and task-status checking; it is disabled in the Electron desktop app.
## Set the right expectation
Presenton is strongest when the source has a clear goal and the template fits the story. It does not guarantee that a claim is true, that every source detail is included, or that a generated slide is ready to present without review.
Spend time on the outline before generating slides. Fixing the story early is faster than repairing every slide later.
See where to provide direction, review output, and make corrections.
# Deploy with Docker
Source: https://docs.presenton.ai/hosting/docker
Self-host Presenton from a published GHCR image or build it directly from the GitHub source.
Presenton can be self-hosted in two ways. Most users should run a published image from the GitHub Container Registry (GHCR). Build from source when you need to inspect, modify, or test the application code.
The recommended path for production. It starts quickly, requires no local build, and uses a versioned image published by the Presenton team.
The flexible path for development and customization. Clone the repository and let Docker Compose build the application on your server.
| | GHCR release | Build from source |
| ------------------ | --------------------------------------------- | ------------------------------------------------- |
| Best for | Production and most self-hosted installations | Development, customization, and testing |
| Application source | Prebuilt and published by Presenton | A Git branch, tag, or commit you choose |
| Startup time | Fast; Docker only downloads the image | Slower initially; Docker builds the image locally |
| Updates | Pull a newer published image | Pull source changes and rebuild |
## Option 1: Run a published GHCR release
This is the most stable and straightforward way to self-host Presenton. The image already contains the frontend, API, export tools, and runtime dependencies, so the host only needs Docker.
The examples below use `latest` so they continue to follow the newest published image without needing a version-specific edit. Browse the [published image versions](https://github.com/presenton/presenton/pkgs/container/presenton) when you need to select a fixed release or image digest instead.
```bash theme={null}
mkdir -p app_data
```
Then start Presenton:
```bash theme={null}
docker run --detach \
--name presenton \
--restart unless-stopped \
--publish 5001:80 \
--volume "$(pwd)/app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
```powershell theme={null}
New-Item -ItemType Directory -Force app_data
```
Then start Presenton:
```powershell theme={null}
docker run --detach `
--name presenton `
--restart unless-stopped `
--publish 5001:80 `
--volume "${PWD}\app_data:/app_data" `
ghcr.io/presenton/presenton:latest
```
Open [http://localhost:5001](http://localhost:5001) after the container starts. The first port in `5001:80` is the port on your host and can be changed; container port `80` serves the web app, REST API, and `/mcp`.
Use an explicit version tag in production so upgrades happen when you choose. Use `latest` when automatically following the newest published release is more important than repeatability.
### Configure the release image
Pass settings with `--env-file` to keep the `docker run` command readable:
```dotenv theme={null}
# .env
AUTH_USERNAME=admin
AUTH_PASSWORD=replace-with-a-long-password
LLM=openai
OPENAI_API_KEY=replace-with-your-key
OPENAI_MODEL=gpt-4.1
CAN_CHANGE_KEYS=false
```
Then add `--env-file .env` before the image name:
```bash theme={null}
docker run --detach \
--name presenton \
--restart unless-stopped \
--publish 5001:80 \
--volume "$(pwd)/app_data:/app_data" \
--env-file .env \
ghcr.io/presenton/presenton:latest
```
See [Environment variables](/hosting/environment-variables) for all supported providers and runtime settings.
### Update a GHCR deployment
Pull the new image before replacing the container. Keep the same `app_data` directory and startup options.
```bash theme={null}
docker pull ghcr.io/presenton/presenton:latest
```
Stop the existing container:
```bash theme={null}
docker stop presenton
```
Remove the stopped container:
```bash theme={null}
docker rm presenton
```
Run the container again with the same volume and environment options. When you use `latest`, pulling and recreating the container moves it to the newest published image. When you use a fixed version or digest, update it in both the `docker pull` and `docker run` commands.
## Option 2: Build from the GitHub source
Choose this path when you want to change Presenton, review the code before deployment, test unreleased work, or build a specific branch or commit. You need Git, Docker Engine, and the Docker Compose plugin.
```bash theme={null}
git clone https://github.com/presenton/presenton.git
```
Open the cloned repository:
```bash theme={null}
cd presenton
```
A fresh clone uses `main`, which contains the newest source. For a repeatable build, check out a Git tag or commit that exists in the repository before continuing.
Optionally, list the available release tags:
```bash theme={null}
git tag --list
```
To pin a revision, replace `TAG_OR_COMMIT` with the tag or commit you want:
```bash theme={null}
git checkout TAG_OR_COMMIT
```
Create `.env` beside `docker-compose.yml`. Compose reads this file and forwards the supported values to Presenton.
```dotenv theme={null}
PRESENTON_HTTP_HOST_PORT=5001
AUTH_USERNAME=admin
AUTH_PASSWORD=replace-with-a-long-password
LLM=openai
OPENAI_API_KEY=replace-with-your-key
OPENAI_MODEL=gpt-4.1
CAN_CHANGE_KEYS=false
```
```bash theme={null}
docker compose up --build --detach production
```
Compose builds the repository's production `Dockerfile`, starts the container, and mounts `./app_data` at `/app_data`.
Open [http://localhost:5001](http://localhost:5001) when the build finishes.
The `main` branch can contain changes that have not reached a published container release. For a more predictable source build, check out a release tag or pin a commit before building.
### Update a source build
If you follow `main`, pull the newest commits and rebuild:
```bash theme={null}
git pull --ff-only
```
Then rebuild the deployment:
```bash theme={null}
docker compose up --build --detach production
```
If you pin a tag or commit, fetch the available revisions, check out the one you want, and rebuild:
```bash theme={null}
git fetch --tags
```
Check out the new tag or commit:
```bash theme={null}
git checkout TAG_OR_COMMIT
```
Then rebuild the deployment:
```bash theme={null}
docker compose up --build --detach production
```
The repository also provides `production-gpu`, `development`, and `development-gpu` services. Use `production` for a normal hosted instance. Use `production-gpu` only after installing the NVIDIA Container Toolkit and confirming that Docker can access the GPU.
## Persistence
Both deployment paths store persistent state in `/app_data` inside the container:
* The GHCR commands mount the local `./app_data` directory explicitly.
* The repository's Compose service creates the same mount automatically.
Never replace or upgrade the container without preserving `/app_data`. It contains presentations, uploads, templates, settings, authentication state, the default database, exports, and local memory.
Back up this directory before upgrades. See [Backups and recovery](/hosting/backups-and-recovery) for a complete backup and restore workflow.
## Ports and networking
| Mapping | Use |
| ----------- | --------------------------------- |
| `5001:80` | Browser, REST API, and MCP |
| `1455:1455` | ChatGPT/Codex OAuth callback only |
`localhost` inside a container refers to the container itself. Reach another Compose service by its service name, or reach a service on the host through a supported host gateway such as `host.docker.internal`.
## Operate and verify
For a GHCR container:
```bash theme={null}
docker logs --follow presenton
```
Stop the container:
```bash theme={null}
docker stop presenton
```
Start it again:
```bash theme={null}
docker start presenton
```
Check its status:
```bash theme={null}
docker ps --filter name=presenton
```
For a source deployment:
```bash theme={null}
docker compose logs --follow production
```
Stop the service:
```bash theme={null}
docker compose stop production
```
Start it again:
```bash theme={null}
docker compose start production
```
Check its status:
```bash theme={null}
docker compose ps
```
After deployment, generate a small presentation, restart Presenton, and confirm that the presentation remains available. Then test export and any REST API or MCP integration you plan to expose.
# Enterprise support
Source: https://docs.presenton.ai/hosting/enterprise
Discuss custom identity, access, deployment, integration, and support requirements with Presenton.
Presenton Enterprise helps organizations extend a self-hosted deployment around their security, identity, infrastructure, and workflow requirements.
## Capabilities to discuss
Define role-based access and permissions for administrators, creators, reviewers, and other teams.
Integrate OAuth 2.0 or OpenID Connect with your organization's identity provider.
Plan on-premise, private-cloud, hybrid, or air-gapped deployment requirements.
Discuss auditability, data handling, network controls, and compliance requirements.
Connect internal data sources, workflows, templates, authentication, and other systems.
Scope implementation help, onboarding, priority support, and service-level requirements.
Enterprise capabilities are scoped to your organization and deployment. Contact the team to confirm availability, implementation details, and commercial terms.
Tell us about your team, deployment, security requirements, and the capabilities you need.
# Environment variables
Source: https://docs.presenton.ai/hosting/environment-variables
Reference supported self-hosted settings by deployment concern.
Use environment variables for repeatable deployments and centrally managed secrets. The in-app Settings page is convenient for personal instances; environment variables are better for servers, automation, and locked-down provider credentials.
## Runtime and access
| Variable | Default | Purpose | Sensitive |
| ---------------------------- | ------------ | -------------------------------------------------------------------------- | --------- |
| `PRESENTON_HTTP_HOST_PORT` | `5001` | Compose host port mapped to container port `80` | No |
| `CAN_CHANGE_KEYS` | unset | Set `false` to prevent users changing administrator-supplied provider keys | No |
| `AUTH_USERNAME` | unset | Preseed or recover the primary administrator account | No |
| `AUTH_PASSWORD` | unset | Password used only to initialize or explicitly rotate credentials | Yes |
| `AUTH_OVERRIDE_FROM_ENV` | `false` | Apply a one-time credential rotation from environment values | No |
| `RESET_AUTH` | `false` | Remove configured authentication during a recovery boot | No |
| `DATABASE_URL` | local SQLite | External PostgreSQL or MySQL connection URL | Yes |
| `DISABLE_ANONYMOUS_TRACKING` | `false` | Disable anonymous product telemetry | No |
## Text providers
Set `LLM` to the provider identifier, then configure that provider's model and credentials.
| Provider | Required or common variables |
| ----------------- | ------------------------------------------------------------------------------------------------------------------- |
| Presenton Cloud | Connect as the local administrator in onboarding or Settings; the application stores `LLM=presenton` after approval |
| OpenAI | `LLM=openai`, `OPENAI_API_KEY`, `OPENAI_MODEL` |
| Google | `LLM=google`, `GOOGLE_API_KEY`, `GOOGLE_MODEL` |
| Anthropic | `LLM=anthropic`, `ANTHROPIC_API_KEY`, `ANTHROPIC_MODEL` |
| Ollama | `LLM=ollama`, `OLLAMA_URL`, `OLLAMA_MODEL` |
| LM Studio | `LLM=lmstudio`, `LMSTUDIO_BASE_URL`, `LMSTUDIO_MODEL` |
| OpenAI-compatible | `LLM=custom`, `CUSTOM_LLM_URL`, `CUSTOM_LLM_API_KEY`, `CUSTOM_MODEL` |
| Azure OpenAI | `LLM=azure` plus endpoint, API version, model/deployment, and credentials |
| Amazon Bedrock | `LLM=bedrock`, region, model, and one supported AWS authentication method |
| LiteLLM | `LLM=litellm`, `LITELLM_BASE_URL`, `LITELLM_MODEL`, optional API key |
Review supported roles, local-versus-hosted data flow, and provider-specific guides.
## Images and search
| Variable | Purpose |
| --------------------------------------------------- | ----------------------------------------------------- |
| `IMAGE_PROVIDER` | Select stock or generated-image provider |
| `PEXELS_API_KEY`, `PIXABAY_API_KEY` | Stock-image credentials |
| `DISABLE_IMAGE_GENERATION` | Disable presentation image generation |
| `ENABLE_PARALLEL_IMAGE_GENERATION` | Control concurrent image work |
| `WEB_GROUNDING` | Enable web context by default |
| `WEB_SEARCH_PROVIDER` | Select `auto`, native search, SearXNG, Tavily, or Exa |
| `WEB_SEARCH_MAX_RESULTS` | Limit external results added to model context |
| `SEARXNG_BASE_URL`, `TAVILY_API_KEY`, `EXA_API_KEY` | Search-provider connection details |
## Processing and memory
| Variable | Default | Purpose |
| ----------------------- | --------------------------------- | ----------------------------------------------- |
| `LITEPARSE_DPI` | `120` | Rendering resolution during document extraction |
| `LITEPARSE_NUM_WORKERS` | `1` | Document-processing workers |
| `MEM0_ENABLED` | `true` | Enable presentation-scoped memory |
| `MEM0_DIR` | `/app_data/mem0` | Memory storage root |
| `MEM0_LLM_MODEL` | Ollama model or `llama3.1:latest` | Memory extraction model |
| `MEM0_LLM_BASE_URL` | Ollama URL or host gateway | Compatible model endpoint |
| `MEM0_EMBEDDER_MODEL` | `BAAI/bge-small-en-v1.5` | Local embedding model |
## Apply changes safely
* Keep secrets out of source control and shell history.
* Change one provider role at a time and run a short generation afterward.
* Restart or replace the container after environment changes.
* Back up `/app_data` and an external database before storage or migration changes.
* Treat empty values differently from deliberate `false` values.
# Connect an MCP client
Source: https://docs.presenton.ai/hosting/mcp
Authenticate Presenton's MCP server and connect local, remote, or multiple self-hosted instances.
The built-in Model Context Protocol server lets a compatible AI client invoke Presenton presentation workflows. MCP is available in the self-hosted web deployment at `/mcp`; it is disabled in the Electron desktop app.
## Before you start
* Run Presenton with Docker, Compose, or another web deployment.
* Confirm browser generation works.
* Configure the primary administrator for any shared or remote instance.
* Confirm your client supports a remote HTTP MCP server and custom headers.
## 1. Start an authenticated instance
```bash theme={null}
docker run -it --name presenton \
--publish 5001:80 \
--env AUTH_USERNAME=admin \
--env AUTH_PASSWORD=replace-with-a-long-password \
--volume "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
Open [http://localhost:5001](http://localhost:5001), sign in, and create a small test presentation before continuing.
## 2. Generate an API key
Sign in as the primary administrator, open **Admin → API keys**, select **Generate key**, and copy the new `sk-presenton-...` value. The key is shown only when it is created.
A Presenton API key grants API and MCP access. Do not commit it to a repository, paste it into support tickets, or expose it in screenshots.
## 3. Configure the MCP client
Configuration formats vary by client. The following examples use the structure from the Presenton README; adapt the outer file location and environment-variable syntax to your client.
### Example A: local authenticated server
```json theme={null}
{
"mcpServers": {
"presenton": {
"url": "http://localhost:5001/mcp",
"headers": {
"Authorization": "Bearer sk-presenton-REPLACE_WITH_YOUR_KEY"
}
}
}
}
```
### Example B: remote HTTPS server
```json theme={null}
{
"mcpServers": {
"presenton-production": {
"url": "https://presentations.example.com/mcp",
"headers": {
"Authorization": "Bearer sk-presenton-REPLACE_WITH_YOUR_KEY"
}
}
}
}
```
Use HTTPS for any connection that leaves the local machine. The reverse proxy must forward the `Authorization` header and support the connection behavior required by your MCP client.
### Example C: local server without configured auth
For an isolated development instance where authentication has not been configured, omit the header:
```json theme={null}
{
"mcpServers": {
"presenton-local": {
"url": "http://localhost:5001/mcp"
}
}
}
```
Do not use an unauthenticated configuration on a publicly reachable instance.
### Example D: development and production instances
```json theme={null}
{
"mcpServers": {
"presenton-local": {
"url": "http://localhost:5001/mcp",
"headers": {
"Authorization": "Bearer sk-presenton-LOCAL_KEY"
}
},
"presenton-production": {
"url": "https://presentations.example.com/mcp",
"headers": {
"Authorization": "Bearer sk-presenton-PRODUCTION_KEY"
}
}
}
}
```
Give each instance a clear name so users know where uploaded documents and generated presentations will be stored.
## 4. Restart and verify the client
Restart the client or use its MCP reload action so it reads the new server entry.
Confirm the client reports the Presenton server as connected and displays its available presentation tools.
Ask the client to create a short two-slide presentation about a harmless test topic.
Open the returned edit URL, inspect the slides, and confirm the presentation appears in the correct instance.
## Key rotation and recovery
Revoke a key from **Admin → API keys** and generate a replacement whenever a client no longer needs access or a key may have been exposed. Credential override or administrator recovery invalidates existing browser sessions and API keys.
If a client starts returning unauthorized errors:
1. Confirm the Presenton URL and `/mcp` path.
2. Sign in as the primary administrator.
3. Confirm the key is still active under **Admin → API keys**, or generate a replacement.
4. Replace the old key in the client configuration.
5. Restart or reload the client.
## Secure a remote MCP deployment
* Use HTTPS and a trusted certificate.
* Keep Presenton authentication enabled.
* Restrict network access to expected users and clients.
* Store API keys in the client's secret store when supported.
* Revoke and replace keys after suspected exposure.
* Protect `/app_data`, because MCP-created presentations and uploads are stored there.
* Review generated presentations before publishing or exporting them.
Confirm that it supports remote HTTP MCP, that the URL ends in `/mcp`, and that configuration was reloaded. The desktop app does not expose MCP.
Confirm the API key is active and the header is exactly `Authorization: Bearer sk-presenton-REPLACE_WITH_YOUR_KEY`.
Verify HTTPS routing to container port `80`, forwarding of the `Authorization` header, and the proxy's timeout or buffering behavior for remote MCP connections.
Administrator credential override or recovery invalidates API keys. Sign in again, generate a new key, and update the MCP client.
The MCP client discovers Presenton's tools, creates a test presentation, and returns a result that opens in the intended self-hosted instance.
# Presentation memory
Source: https://docs.presenton.ai/hosting/memory
Configure, persist, size, and troubleshoot self-hosted presentation memory.
Presentation memory helps AI-assisted editing retain relevant context across changes to the same presentation. Self-hosted Presenton uses Mem0 OSS with local vector and history storage under `/app_data` by default.
## Default configuration
```dotenv theme={null}
MEM0_ENABLED=true
MEM0_DIR=/app_data/mem0
MEM0_EMBEDDER_PROVIDER=fastembed
MEM0_EMBEDDER_MODEL=BAAI/bge-small-en-v1.5
MEM0_EMBEDDING_DIMS=384
MEM0_SPACY_MODEL=en_core_web_sm
MEM0_REQUIRE_SPACY_MODEL=true
```
The official container includes the required spaCy model. The embedding model may be downloaded on first use, so restricted or offline deployments should pre-populate the required cache.
## Memory model
Mem0 also needs an OpenAI-compatible text endpoint for extracting useful memories:
```dotenv theme={null}
MEM0_LLM_MODEL=llama3.1:latest
MEM0_LLM_API_KEY=ollama
MEM0_LLM_BASE_URL=http://host.docker.internal:11434
```
The memory model can differ from the model that creates presentations. Confirm that a container can reach the configured URL; `localhost` inside Docker does not refer to the host.
## Persistence and privacy
* Keep `MEM0_DIR` inside the persistent `/app_data` mount.
* Include memory data in backups and protect it like presentation content.
* Hosted memory-model endpoints receive the context sent for memory extraction.
* Set `MEM0_ENABLED=false` when iterative memory is unnecessary or the workflow must avoid that processing.
## Troubleshoot
Check application logs for missing spaCy or embedding models, unreachable endpoints, invalid dimensions, and filesystem permission errors. After changing the embedding model or dimensions, use a clean compatible collection rather than mixing incompatible vectors.
# One-click cloud deployment
Source: https://docs.presenton.ai/hosting/one-click-deployments
Deploy Presenton to Railway or DigitalOcean and finish the required production configuration.
One-click templates are the fastest route to a remotely accessible instance. The platform runs the container, but you still own credentials, persistent storage, HTTPS exposure, backups, and upgrades.
Create a service from the maintained Railway template.
Create an App Platform deployment from the Presenton repository.
## Before deploying
* Choose a region allowed by your data-handling requirements.
* Prepare credentials for one text provider and, optionally, an image or search provider.
* Decide whether the service will be private or internet-facing.
* Plan a persistent disk mounted at `/app_data`.
## Required platform configuration
1. Route the platform's HTTPS endpoint to container port `80`.
2. Mount durable storage at `/app_data`; ephemeral storage loses application data during replacement or redeployment.
3. Store provider keys and `AUTH_PASSWORD` in the platform's secret manager.
4. Set `AUTH_USERNAME`, `AUTH_PASSWORD`, and `CAN_CHANGE_KEYS=false` before sharing the URL.
5. Configure restart behavior and monitor available disk space.
A successful deployment without a persistent `/app_data` disk is not production-ready. Test persistence by creating a presentation, restarting or redeploying the service, and confirming that it remains available.
## Verify the deployment
* Open the generated HTTPS URL and sign in.
* Generate and export a short presentation.
* Confirm the selected provider can be reached from the platform.
* Test the REST API and `/mcp` only if they will be used.
* Create a backup and perform a test restore before storing important content.
For another container platform, apply the same contract: container port `80`, durable `/app_data`, protected secrets, authentication, HTTPS, monitoring, and backups.
# Self Host Presenton in Five Minutes
Source: https://docs.presenton.ai/hosting/overview
Start a persistent Presenton instance with Docker and explore support for custom enterprise requirements.
This guide gets Presenton running locally with Docker, persistent storage, and a text provider. It also explains what the deployment includes and where to go for custom enterprise capabilities.
## Before you start
You need:
* [Docker](https://docs.docker.com/get-started/get-docker/)
* Credentials for a supported text provider, or a reachable local model
* Port `5001` available on your computer
Presenton Cloud needs no hosting setup. Use this guide only when you want to run Presenton in infrastructure you control.
Self-hosting the application does not make every workflow local. Configured hosted AI, image, or search providers receive the content sent to them. Choose local providers and disable external integrations when content must remain inside your network.
## 1. Start Presenton
```bash theme={null}
mkdir -p app_data
```
Then start Presenton:
```bash theme={null}
docker run --detach --name presenton \
--publish 5001:80 \
--volume "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
```powershell theme={null}
New-Item -ItemType Directory -Force app_data
```
Then start Presenton:
```powershell theme={null}
docker run --detach --name presenton `
--publish 5001:80 `
--volume "${PWD}\app_data:/app_data" `
ghcr.io/presenton/presenton:latest
```
The host folder is mounted at `/app_data` so presentations and settings survive container replacement.
## 2. Open Presenton
Visit [http://localhost:5001](http://localhost:5001). If the page does not load, check the container:
```bash theme={null}
docker ps --filter name=presenton
```
If the container is running but the page still does not load, inspect its recent logs:
```bash theme={null}
docker logs --tail 100 presenton
```
## 3. Connect a text provider
Follow the first-run Settings flow and choose a provider. In `v0.9.7-beta` and later, the local administrator can connect a Presenton account with the displayed device code and use Presenton Cloud as the installation-wide generation provider. This provider connection is separate from local application sign-in.
For another hosted-provider setup, enter its API key and supported model in the application.
To keep administrator-supplied credentials out of the UI, restart the container with environment variables instead:
```bash theme={null}
docker stop presenton
```
Remove the stopped container:
```bash theme={null}
docker rm presenton
```
Start it again with your provider settings:
```bash theme={null}
docker run --detach --name presenton \
--publish 5001:80 \
--env LLM=openai \
--env OPENAI_API_KEY="YOUR_API_KEY" \
--env OPENAI_MODEL=gpt-4.1 \
--env CAN_CHANGE_KEYS=false \
--volume "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
Do not paste real keys into source files or commit a `.env` file. Use your deployment platform's secret manager for a remote instance.
## 4. Generate and persist a test deck
Create a short two- or three-slide presentation. Restart the container with `docker restart presenton`, reopen the dashboard, and confirm the deck remains available.
The application loads, a text provider generates a deck, export completes, and the deck remains after restart.
## What you are self-hosting
The container runs the Presenton web application, REST API, and MCP server. A self-hosted deployment includes:
* Browser-based presentation generation, editing, templates, and export
* Persistent presentations, uploads, generated assets, settings, and local memory under `/app_data`
* Configurable text, image, search, and database providers
* Multi-user authentication with private workspaces and administrator-managed access
* A built-in MCP endpoint for compatible clients
* Docker and GPU-capable Compose services
## Why self-host
Choose the network, persistent storage, database, backup policy, and geographic location.
Combine hosted or local text, image, and search providers without coupling them to one vendor.
Use the built-in REST API and remote HTTP MCP server from your own tools.
Inspect and modify the Apache-2.0-licensed application for your environment.
## Enterprise support
Scope custom roles and permissions for teams with different responsibilities.
Discuss OAuth, OpenID Connect, and identity-provider integration for your organization.
Plan private, on-premise, air-gapped, or hybrid deployments around your requirements.
Connect Presenton to internal systems, workflows, templates, and data sources.
Need capabilities beyond the open-source self-hosted deployment? [Contact the Presenton enterprise team](https://presenton.ai/contact-sales) to discuss RBAC, OAuth and SSO, custom integrations, deployment assistance, onboarding, and support.
Review common enterprise requirements and contact the team to scope a solution.
# Get a Pexels API key
Source: https://docs.presenton.ai/hosting/provider-api-keys/get-pexels-api-key
Sign in to Pexels, open the Image & Video API section, and copy your API key for use in Presenton or other integrations.
Get your Pexels API key from your [Pexels](https://pexels.com) account when you need image access for Presenton or another integration that uses the Pexels API.
## Before you start
* Make sure you can sign in to your Pexels account.
* Use the account that should own the API key.
Treat the API key like a secret. Do not share it publicly or paste it into unsecured places.
## Get a [Pexels](https://pexels.com) API key
On the Pexels website, open the account menu in the top-right corner and select **Log in** if you are not already signed in.
Log in with your email or one of the available sign-in providers.
After signing in, open the account menu again and select **Image & Video API**.
On the Pexels API page, click **Your API Key**.
On the **Your API Key** page, use the copy button to copy the key.
## Verify the result
You can copy the Pexels API key from your account and paste it into the place where the integration asks for it.
# Get a Pixabay API key
Source: https://docs.presenton.ai/hosting/provider-api-keys/get-pixabay-api-key
Sign in to Pixabay, open the API area, and find your API key in the API documentation reference section.
Get your Pixabay API key from the Pixabay API documentation when you need to connect Pixabay to Presenton or another image integration.
## Before you start
* Make sure you can sign in to your [Pixabay](https://pixabay.com) account.
* Use the account that should own the API access.
Treat the API key like a secret. Do not share it publicly or include it in unsecured documents or screenshots.
## Get a [Pixabay](https://pixabay.com) API key
On the Pixabay website, click **Log in** and sign in to your account if you are not already logged in.
After signing in, click on **Explore** and open the site navigation menu and select **API**.
On the Pixabay Developer API page, click **View API documentation**.
In the documentation page, scroll down to the API reference section, then look for the **Search Images** endpoint and the required `key` parameter.
The API key reference is not at the top of the documentation page. You need to scroll down to the API reference area to reach the `key` field.
## Verify the result
You can locate your Pixabay API key in the API documentation reference and use it where the integration asks for the key value.
# Configure Amazon Bedrock
Source: https://docs.presenton.ai/hosting/providers/amazon-bedrock
Connect Presenton to Amazon Bedrock with an API key, AWS credentials, a model ID, or an inference profile.
Presenton uses Amazon Bedrock's Converse API for presentation generation, editing, and AI chat. The value you configure as the model is passed to Bedrock as `modelId`.
## Before you start
You need:
* Bedrock model access in the AWS account and region you will use.
* A standard model ID or inference profile ARN.
* Either a Bedrock API key or AWS credentials with invoke permissions.
* A running self-hosted Presenton instance.
## 1. Choose the model reference
Use one of these formats:
| Model reference | When to use | Example |
| --------------------- | ------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
| On-demand model ID | The model supports on-demand invocation | `us.anthropic.claude-3-5-haiku-20241022-v1:0` |
| Inference profile ARN | The model requires a provisioned or cross-region inference profile | `arn:aws:bedrock:us-east-1:YOUR_ACCOUNT_ID:inference-profile/us.anthropic.claude-sonnet-4-6` |
Some newer models do not accept a plain model ID for on-demand throughput. Copy the full inference profile ARN from the Bedrock console when AWS requires one.
## 2. Choose one authentication method
```dotenv theme={null}
LLM=bedrock
BEDROCK_REGION=us-east-1
BEDROCK_MODEL=us.anthropic.claude-3-5-haiku-20241022-v1:0
BEDROCK_API_KEY=replace-with-your-key
```
```dotenv theme={null}
LLM=bedrock
BEDROCK_REGION=us-east-1
BEDROCK_MODEL=us.anthropic.claude-3-5-haiku-20241022-v1:0
BEDROCK_AWS_ACCESS_KEY_ID=replace-with-your-access-key
BEDROCK_AWS_SECRET_ACCESS_KEY=replace-with-your-secret
```
```dotenv theme={null}
LLM=bedrock
BEDROCK_REGION=us-east-1
BEDROCK_MODEL=us.anthropic.claude-3-5-haiku-20241022-v1:0
BEDROCK_AWS_ACCESS_KEY_ID=replace-with-your-access-key
BEDROCK_AWS_SECRET_ACCESS_KEY=replace-with-your-secret
BEDROCK_AWS_SESSION_TOKEN=replace-with-your-session-token
```
Use only one primary authentication path. Do not combine `BEDROCK_API_KEY` with explicit AWS access keys.
For local development, `BEDROCK_PROFILE_NAME` can select a named profile from `~/.aws/credentials`; ensure the credentials file is available to the process or container.
## 3. Grant IAM permissions
The IAM user or role needs permission to invoke the configured model or inference profile:
```json theme={null}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "arn:aws:bedrock:us-east-1:YOUR_ACCOUNT_ID:inference-profile/*"
}
]
}
```
Scope `Resource` to the specific models or inference profiles required by your organization. Also enable model access in the Bedrock console for the foundation model behind the selected profile.
## 4. Start Presenton
```bash theme={null}
docker run -it --name presenton \
--publish 5001:80 \
--env LLM=bedrock \
--env BEDROCK_REGION=us-east-1 \
--env BEDROCK_AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID \
--env BEDROCK_AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY \
--env BEDROCK_MODEL=us.anthropic.claude-3-5-haiku-20241022-v1:0 \
--env CAN_CHANGE_KEYS=false \
--volume "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
```bash theme={null}
docker run -it --name presenton \
--publish 5001:80 \
--env LLM=bedrock \
--env BEDROCK_REGION=us-east-1 \
--env BEDROCK_AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID \
--env BEDROCK_AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY \
--env BEDROCK_MODEL=arn:aws:bedrock:us-east-1:YOUR_ACCOUNT_ID:inference-profile/us.anthropic.claude-sonnet-4-6 \
--env CAN_CHANGE_KEYS=false \
--volume "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
You can instead set the same values in Settings → Text provider or in the `.env` file used by Docker Compose.
## 5. Test the connection
Open [http://localhost:5001](http://localhost:5001), generate a two-slide presentation, and inspect the container logs if generation fails:
```bash theme={null}
docker logs --tail 150 presenton
```
## Troubleshooting
The model requires a foundation model or inference profile ARN. Copy the full inference profile ARN from the same region in the Bedrock console and use it as `BEDROCK_MODEL`.
Confirm the principal has `bedrock:InvokeModel` and `bedrock:InvokeModelWithResponseStream` for the model or inference profile, and confirm model access is enabled for the AWS account.
Check the model string for whitespace, confirm it exists in `BEDROCK_REGION`, and use a full inference profile ARN for models that require one.
Supply `BEDROCK_API_KEY`, or supply both `BEDROCK_AWS_ACCESS_KEY_ID` and `BEDROCK_AWS_SECRET_ACCESS_KEY`. Do not mix the two authentication methods.
Include `BEDROCK_AWS_SESSION_TOKEN`, verify that the credentials have not expired, and restart Presenton after replacing them.
Presenton can generate and edit a test presentation through the selected Bedrock model in the configured region.
# Use a local model with Ollama
Source: https://docs.presenton.ai/hosting/providers/ollama
Connect Docker-based Presenton to an Ollama model running on your machine.
This setup keeps text-generation requests on your machine. Image or search requests remain external unless you also choose local providers or disable those features.
## 1. Install and start Ollama
Install Ollama for your operating system, then pull a model:
```bash theme={null}
ollama pull llama3.2:3b
```
Confirm the service responds:
```bash theme={null}
ollama list
```
## 2. Start Presenton with the Ollama settings
```bash theme={null}
docker run --name presenton \
--publish 5001:80 \
--add-host host.docker.internal:host-gateway \
--volume "./app_data:/app_data" \
--env LLM=ollama \
--env OLLAMA_URL=http://host.docker.internal:11434 \
--env OLLAMA_MODEL=llama3.2:3b \
--env DISABLE_IMAGE_GENERATION=true \
--env MEM0_ENABLED=false \
ghcr.io/presenton/presenton:latest
```
On Docker Desktop, `host.docker.internal` normally works without the extra host mapping. Keeping it in the command is useful for compatible Linux Docker setups.
## 3. Verify the connection
Open [http://localhost:5001](http://localhost:5001), go to text-provider settings, choose Ollama, and use the model check. Confirm `llama3.2:3b` appears as available.
## 4. Generate a small test deck
Create a three- or four-slide presentation with a straightforward prompt. Smaller local models may need simpler instructions and may be less reliable with complex structured layouts.
## 5. Add local capabilities gradually
* Enable Mem0 after configuring a compatible local memory model.
* Use ComfyUI for local image generation.
* Use SearXNG for self-hosted web search.
* Give Docker GPU access when the model runtime can use it.
`localhost` inside the Presenton container points to the container itself. Use a host gateway or container-network hostname that Presenton can reach.
# System requirements
Source: https://docs.presenton.ai/hosting/system-requirements
Choose practical CPU, memory, storage, network, and optional GPU capacity for self-hosted Presenton.
Presenton runs the web application, API, document parser, OCR, and presentation export service in one container. Text and image generation can run on hosted providers or on separate local model services such as Ollama and ComfyUI.
The estimates below cover the Presenton application and assume that text and image models run on hosted providers. Add the [local model capacity](#local-model-and-gpu-capacity) when Ollama, LM Studio, ComfyUI, or another inference service runs on the same host.
## Recommended server sizes
Use these tiers as initial capacity, not as hard limits. An **active job** means a presentation being generated, a document being parsed, or a presentation being exported—not simply a user with the page open.
| Deployment | CPU | Memory | Free SSD space | Practical starting workload |
| -------------------------- | ---------: | ------------: | -------------: | --------------------------------------------------------------------------- |
| Evaluation or personal use | **2 vCPU** | **4 GB RAM** | **10 GB** | One active job at a time, small or normal documents, hosted AI providers |
| Small team (recommended) | **4 vCPU** | **8 GB RAM** | **20–50 GB** | About 2 simultaneous active jobs, regular uploads and exports |
| Document-heavy or API use | **8 vCPU** | **16 GB RAM** | **50–100+ GB** | About 4 simultaneous active jobs, large PDFs, OCR, or sustained API traffic |
Do not plan a production deployment with less than 2 vCPU or 4 GB RAM. The interface may start on a smaller host, but document parsing, Chromium-based export, and overlapping jobs can run out of memory or become unresponsive.
For production, prefer sustained CPU capacity over a heavily throttled or burst-only instance. Capacity is shared with the operating system, Docker, a reverse proxy, and any database or local provider on the host; do not count memory reserved for those services as available to Presenton.
## How to adjust the estimate
Start with the tier closest to the expected workload, then increase it when any of the following apply:
* Add approximately **1–2 vCPU and 2 GB RAM for each additional simultaneous document-processing or export job**. This is a planning allowance; measure the actual files and templates used by your team.
* Use at least **8 GB RAM** when users regularly upload long, scanned, image-heavy, or high-resolution PDFs.
* Increase CPU before raising `LITEPARSE_NUM_WORKERS`. As a starting rule, keep at least one CPU core available for the application and do not configure more parser workers than the remaining vCPUs.
* Leave memory headroom for short peaks. Avoid setting the container memory limit equal to its normal observed usage.
* Provider latency and rate limits can remain the bottleneck even after the server is enlarged.
## Host and container requirements
| Component | Requirement |
| ----------------- | ------------------------------------------------------------------------ |
| Architecture | 64-bit `amd64` (x86-64) or `arm64` |
| Production host | A currently supported 64-bit Linux distribution |
| Container runtime | A current Docker Engine release or compatible container platform |
| Source deployment | Git and Docker Compose v2 in addition to Docker Engine |
| Application port | A host port routed to container port `80`; examples use host port `5001` |
| Persistent data | A durable volume mounted at `/app_data` |
| Browser | A current version of Chrome, Edge, Firefox, or Safari |
The published container includes the application runtime, Chromium, OCR, fonts, and export dependencies. A server running the published image does **not** need a separate Node.js, Python, Chromium, or Tesseract installation. Building from source is more demanding; allow at least **4 vCPU, 8 GB RAM, and 20 GB of free disk** during the build.
Docker Desktop on macOS or Windows is suitable for evaluation and local use. A Linux host is the recommended production target.
## Storage planning
Mount `/app_data` on persistent, low-latency SSD or block storage. It can contain the database, uploaded source files, generated images, presentations, templates, local memory, and exported PPTX or PDF files.
Reserve storage for all of the following:
* **5–10 GB for container images and upgrades.** An upgrade can temporarily keep both the old and new image on disk.
* **Uploads at their original size.** Retained source documents are not represented by the presentation count alone.
* **Approximately 50–250 MB per retained, image-rich 10-slide presentation** as an initial estimate for generated assets and exports. Image resolution, source files, templates, and multiple export copies can raise this substantially.
* **At least 20% free space** so exports, uploads, database writes, and upgrades have working room.
* **Backup capacity outside the application volume.** A full backup needs space comparable to the used size of `/app_data`; keep additional generations according to the retention policy.
For example, a team retaining 100 image-rich presentations should start with roughly **25–50 GB** for Presenton data and operating headroom, then adjust from measured growth. The 10 GB minimum is intended only for evaluation with limited retained content.
An external PostgreSQL or MySQL database does not replace `/app_data`; files and generated assets still require persistent storage. See [Storage and processing](/self-hosted/configuration/storage-and-processing) and [Backups and recovery](/hosting/backups-and-recovery).
## Network and ports
Presenton needs stable outbound access to every configured text, image, search, database, and authentication provider.
| Direction | Port or protocol | Purpose |
| --------------------------- | ---------------------------------- | ------------------------------------------------------------------------- |
| Inbound | Host port mapped to container `80` | Web interface, REST API, and MCP |
| Inbound, optional | TCP `1455` | ChatGPT/Codex OAuth callback only |
| Outbound | DNS and HTTPS (`443`) | Container registry, hosted AI, image, search, and authentication services |
| Outbound or private network | Provider-specific | Ollama, LM Studio, ComfyUI, SearXNG, and external databases |
There is no fixed bandwidth requirement. For planning, use a stable **10 Mbps connection as an evaluation floor** and **50 Mbps or more for a team** that frequently uploads documents or generates images. Latency to hosted providers usually affects generation time more than raw bandwidth.
Publish port `1455` only when the ChatGPT/Codex authentication callback is required. Put remote deployments behind HTTPS, enable authentication, and restrict provider and database ports to trusted networks. See [Security and access](/hosting/security-and-access).
## Local model and GPU capacity
A GPU is **not required** when Presenton uses hosted text and image providers. Attaching a GPU to the Presenton container does not accelerate a hosted provider.
When a local model server shares the host, its model weights, context cache, and inference runtime are additional to the Presenton requirements. The following are rough allowances for common 4-bit-quantized text models:
| Local text model size | Additional system RAM or GPU VRAM | Suggested total host memory |
| --------------------- | --------------------------------: | --------------------------: |
| 3B–4B parameters | 4–6 GB | 16 GB RAM |
| 7B–8B parameters | 6–10 GB | 16–24 GB RAM |
| 13B–14B parameters | 10–16 GB | 32 GB RAM |
| 30B–32B parameters | 24–32 GB | 48–64 GB RAM |
Long context windows, higher-precision weights, multiple loaded models, and concurrent inference require more memory. CPU-only inference works but can be much slower; plan **8 or more modern CPU cores** for a small local model when generation speed matters.
For local image generation through ComfyUI, **8 GB VRAM is a practical floor** for smaller or optimized workflows, while **12–16+ GB VRAM** is a better starting point for higher-resolution or more complex workflows. Exact requirements are determined by the selected checkpoint and workflow.
NVIDIA GPU passthrough requires a compatible NVIDIA driver, the NVIDIA Container Toolkit, and a container started with GPU access. A local provider running on another machine needs no GPU on the Presenton host.
## Validate before production
1. Deploy the recommended tier for the expected workload.
2. Generate a representative presentation from the largest typical source document.
3. Export it to every format the team uses.
4. Repeat with the expected number of simultaneous active jobs.
5. Record peak CPU, memory, temporary disk use, `/app_data` growth, provider latency, and job duration.
6. Keep at least **25% memory headroom** and **20% disk headroom** after the test; move up a tier if either margin is not available.
Run the published image or build Presenton from source.
Measure bottlenecks and tune the deployment after launch.
# Presenton Documentation
Source: https://docs.presenton.ai/index
Create, edit, automate, and operate Presenton across Cloud and self-hosted deployments.
Build with Presenton
Editable presentation workflows for prompts, files, templates, and APIs.
Understand Presenton
Start with the product overview, workflow, core concepts, deployment modes, and feature availability.
Create and edit decks
Generate a first draft, refine slides, work with content blocks, and export to PPTX or PDF.
Use reusable templates
Bring existing presentation designs into repeatable templates for consistent, editable output.
Run Presenton yourself
Install Presenton with Docker, configure providers, and explore support for custom enterprise requirements.
Build with the API
Generate, track, edit, and export presentations from your product, automation, or internal workflow.
Troubleshoot and compare versions
Diagnose generation, editing, export, hosting, and integration issues, or open a frozen documentation snapshot.
# Authentication
Source: https://docs.presenton.ai/self-hosted/configuration/authentication
Configure multi-user access, administrator recovery, and API keys for the browser, REST API, and MCP server.
Presenton supports multiple accounts with a private workspace for each user. The first account becomes the primary administrator and can create, reset, or remove other accounts from **Admin → Users**.
Local accounts control access to this installation. The optional **Login with Presenton** device flow connects an installation-wide cloud generation provider; it does not replace local sign-in.
## Set up the primary administrator
On a new installation, open Presenton and follow the account setup screen. For an unattended deployment, preseed the primary administrator on first boot. Usernames must contain at least three characters and new passwords must contain at least eight characters.
```bash theme={null}
docker run -it --name presenton \
--publish 5001:80 \
--env AUTH_USERNAME=admin \
--env AUTH_PASSWORD=replace-with-a-long-password \
--volume "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
Or place them in a protected `.env` file for Compose:
```dotenv theme={null}
AUTH_USERNAME=admin
AUTH_PASSWORD=replace-with-a-long-password
```
If an account already exists, the startup values are ignored unless you explicitly enable credential override.
## Manage users
The primary administrator can open **Admin → Users** to create users, reset their passwords, or remove their access. Each user receives a private workspace for presentations, templates, tasks, and uploaded assets.
Existing single-user installations migrate automatically. The existing account becomes the primary administrator while its owned data remains attached to the same account.
## Connect an optional Presenton account
The primary administrator can choose **Presenton** during provider onboarding or in Settings, copy the displayed device code, and approve it on the hosted Presenton page. The resulting provider connection is shared by the installation and can be replaced or disconnected only by the administrator.
| Identity | Purpose | Storage |
| ---------------------------- | ------------------------------------------------------------------ | --------------------------------------------- |
| Local Presenton user | Signs in to the self-hosted browser and owns a private workspace | Local application database and session cookie |
| Presenton account connection | Authorizes optional cloud-backed generation and document workflows | One encrypted global provider record |
| Presenton API key | Authenticates REST API and MCP requests | Hashed local API-key record |
Connecting the provider does not grant browser access to the self-hosted instance. Disconnecting it revokes the delegated cloud credentials without deleting local users or presentations.
## How each interface authenticates
| Interface | Authentication |
| -------------------- | ----------------------------------- |
| Browser UI | User sign-in session |
| `/api/v1/*` | Admin-generated Presenton API key |
| `/mcp` | Admin-generated Presenton API key |
| Electron desktop app | Authentication and MCP are disabled |
## Create an API key
The primary administrator opens **Admin → API keys**, selects **Generate key**, and copies the new `sk-presenton-...` value. The key is shown only when it is created.
Send the key as a bearer token for REST API or MCP requests:
```bash theme={null}
curl --request GET \
--url http://localhost:5001/api/v1/ppt/presentation/all \
--header "Authorization: Bearer $PRESENTON_API_KEY"
```
API keys cannot sign in to the browser UI. Revoking a key from the admin panel takes effect immediately.
## Rotate credentials
Set the new username and password together with `AUTH_OVERRIDE_FROM_ENV=true`, replace the container, and then remove the override setting. Rotation preserves the administrator's user ID and owned data.
```bash theme={null}
docker stop presenton
```
Remove the stopped container:
```bash theme={null}
docker rm presenton
```
Start it once with credential override enabled:
```bash theme={null}
docker run -it --name presenton \
--publish 5001:80 \
--env AUTH_USERNAME=admin \
--env AUTH_PASSWORD=replace-with-a-new-long-password \
--env AUTH_OVERRIDE_FROM_ENV=true \
--volume "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
Credential override invalidates existing browser sessions and API keys. Remove `AUTH_OVERRIDE_FROM_ENV` after the one-time rotation so every restart does not repeat the operation.
## Recover access
For one boot, start the instance with `RESET_AUTH=true` and supply the primary administrator's new username and password. Then stop the instance, remove the recovery variables, and start it normally.
```bash theme={null}
docker stop presenton
```
Remove the stopped container:
```bash theme={null}
docker rm presenton
```
Start it once with recovery enabled:
```bash theme={null}
docker run -it --name presenton \
--publish 5001:80 \
--env RESET_AUTH=true \
--env AUTH_USERNAME=admin \
--env AUTH_PASSWORD=replace-with-a-new-long-password \
--volume "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
Do not manually remove authentication fields from `/app_data/userConfig.json`. Use the recovery variables so the database account and its ownership links remain intact.
Generate an API key and configure compatible local or remote MCP clients.
# Use ComfyUI for presentation images
Source: https://docs.presenton.ai/self-hosted/configuration/comfyui
Connect Presenton Open Source to a reachable ComfyUI server and an API-format image workflow.
Presenton can send generated image prompts to your own ComfyUI workflow. This supports local or hosted models such as FLUX, Stable Diffusion, and SDXL while keeping the image pipeline under your control.
## Before you start
* Build and test a text-to-image workflow directly in ComfyUI.
* Ensure the Presenton container can reach the ComfyUI server.
* Decide whether to configure the provider in **Settings** or with environment variables.
## 1. Expose ComfyUI to Presenton
Start ComfyUI on an interface reachable from the Presenton container:
```bash theme={null}
python main.py --listen 0.0.0.0
```
The default port is `8188`. Restrict network access with a firewall or private container network; an exposed ComfyUI server can run resource-intensive workflows.
| ComfyUI location | Example URL from Presenton |
| ---------------------- | ---------------------------------- |
| Docker host | `http://host.docker.internal:8188` |
| Compose service | `http://comfyui:8188` |
| Another LAN host | `http://192.168.1.100:8188` |
| Secured remote service | `https://comfyui.example.com` |
`localhost` inside the Presenton container points to Presenton, not to ComfyUI running on the host.
## 2. Mark the prompt node
Presenton must know where to inject each image prompt:
1. Find the positive text-prompt node in ComfyUI.
2. Right-click it and choose **Title**.
3. Rename it to exactly `Input Prompt`.
Presenton searches the exported workflow for `_meta.title` equal to `Input Prompt` (case-insensitive), then replaces its writable prompt text. A compatible node resembles:
```json theme={null}
{
"6": {
"inputs": {
"text": "placeholder prompt",
"clip": ["4", 1]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "Input Prompt"
}
}
}
```
## 3. Export the API workflow
1. Open ComfyUI settings and enable **Dev mode Options**.
2. Open **File** from the ComfyUI menu.
3. Choose **Export (API)**.
Use the API export, not the normal workflow save. Presenton needs the API node graph.
## 4. Configure Presenton
In **Settings → Image provider**, select **ComfyUI**, enter the server URL, paste the complete exported workflow JSON, and save.
For a managed deployment, set the same values as environment variables:
```dotenv theme={null}
IMAGE_PROVIDER=comfyui
COMFYUI_URL=http://host.docker.internal:8188
COMFYUI_WORKFLOW={"6":{"inputs":{"text":"placeholder prompt"},"class_type":"CLIPTextEncode","_meta":{"title":"Input Prompt"}}}
```
`COMFYUI_WORKFLOW` contains the exported JSON itself, not a filesystem path. For Compose, quote or escape the JSON according to your environment-file tooling. The Settings UI is often easier for large workflows.
## 5. Test the integration
Generate a short presentation that requests images, then verify:
* ComfyUI receives a job at `/prompt`.
* The `Input Prompt` node contains the generated prompt.
* The workflow produces an image output rather than only previews or latent data.
* Presenton can read the ComfyUI history and download the output.
* Repeated images use different seeds where supported by the workflow.
## Troubleshooting
| Symptom | Check |
| ---------------------------------- | ------------------------------------------------------------------- |
| Cannot connect | Test `COMFYUI_URL` from inside the Presenton container |
| `Input Prompt` not found | Re-export after renaming the prompt node |
| Workflow rejected | Confirm you used **Export (API)** and the workflow runs manually |
| Job completes but no image appears | Ensure the workflow has a save/output image node |
| Every result looks identical | Confirm the sampler seed is writable and not fixed by a custom node |
Compare ComfyUI with stock, hosted, and OpenAI-compatible image providers.
# Images and web search
Source: https://docs.presenton.ai/self-hosted/configuration/images-and-search
Configure stock images, generated visuals, compatible image APIs, and optional web research.
Image generation and web research are separate from the text model. You can combine providers—for example, Ollama for text, Pexels for images, and a private SearXNG instance for search.
## Image providers
Set `IMAGE_PROVIDER` to one of the supported values.
| Capability | `IMAGE_PROVIDER` | Required or related settings |
| --------------------------- | ------------------- | -------------------------------------------------- |
| Pexels stock images | `pexels` | `PEXELS_API_KEY` |
| Pixabay stock images | `pixabay` | `PIXABAY_API_KEY` |
| Gemini Flash images | `gemini_flash` | `GOOGLE_API_KEY` |
| Nano Banana Pro | `nanobanana_pro` | `GOOGLE_API_KEY` |
| DALL·E 3 | `dall-e-3` | `OPENAI_API_KEY`, optional quality |
| GPT Image 1.5 | `gpt-image-1.5` | `OPENAI_API_KEY`, optional quality |
| ComfyUI | `comfyui` | `COMFYUI_URL`, optional workflow |
| Open WebUI | `open_webui` | `OPEN_WEBUI_IMAGE_URL`, `OPEN_WEBUI_IMAGE_API_KEY` |
| OpenAI-compatible image API | `openai_compatible` | Base URL, API key, and model |
Set `DISABLE_IMAGE_GENERATION=true` to create presentations without generated or searched images.
### Stock-image example
```dotenv theme={null}
IMAGE_PROVIDER=pexels
PEXELS_API_KEY=replace-with-your-key
```
### OpenAI image example
```dotenv theme={null}
IMAGE_PROVIDER=gpt-image-1.5
OPENAI_API_KEY=replace-with-your-key
GPT_IMAGE_1_5_QUALITY=medium
```
Supported GPT Image 1.5 quality values are `low`, `medium`, and `high`; the default is `medium`. DALL·E 3 supports `standard` and `hd` quality.
### ComfyUI example
```dotenv theme={null}
IMAGE_PROVIDER=comfyui
COMFYUI_URL=http://host.docker.internal:8188
COMFYUI_WORKFLOW={"6":{"inputs":{"text":"placeholder prompt"},"class_type":"CLIPTextEncode","_meta":{"title":"Input Prompt"}}}
```
`COMFYUI_WORKFLOW` contains the API-exported workflow JSON. The prompt node must be titled `Input Prompt` so Presenton can inject each generated prompt.
Expose the server safely, prepare the prompt node, export the API workflow, and troubleshoot generation.
### OpenAI-compatible image API
```dotenv theme={null}
IMAGE_PROVIDER=openai_compatible
OPENAI_COMPAT_IMAGE_BASE_URL=https://proxy.example.com/v1
OPENAI_COMPAT_IMAGE_API_KEY=replace-with-your-key
OPENAI_COMPAT_IMAGE_MODEL=gpt-image-1
```
This is useful for gateways such as LiteLLM or another service that exposes a compatible image endpoint. It does not change the text provider.
## Web search
Web search is opt-in. Enable it only when decks need current public information.
```dotenv theme={null}
WEB_GROUNDING=true
WEB_SEARCH_PROVIDER=auto
WEB_SEARCH_MAX_RESULTS=5
```
| `WEB_SEARCH_PROVIDER` | Behavior | Additional setting |
| --------------------- | --------------------------------------------------------------------------------------------------- | -------------------------- |
| `auto` | Uses native search for supported OpenAI, Google, or Anthropic configurations; otherwise remains off | None |
| `native` | Requests native provider search | A compatible text provider |
| `searxng` | Uses a self-hosted SearXNG instance | `SEARXNG_BASE_URL` |
| `tavily` | Uses Tavily | `TAVILY_API_KEY` |
| `exa` | Uses Exa | `EXA_API_KEY` |
`WEB_SEARCH_MAX_RESULTS` defaults to `5` and supports up to `10` results.
```dotenv theme={null}
WEB_GROUNDING=true
WEB_SEARCH_PROVIDER=searxng
SEARXNG_BASE_URL=http://searxng:8080
WEB_SEARCH_MAX_RESULTS=5
```
```dotenv theme={null}
WEB_GROUNDING=true
WEB_SEARCH_PROVIDER=tavily
TAVILY_API_KEY=replace-with-your-key
WEB_SEARCH_MAX_RESULTS=5
```
```dotenv theme={null}
WEB_GROUNDING=true
WEB_SEARCH_PROVIDER=exa
EXA_API_KEY=replace-with-your-key
WEB_SEARCH_MAX_RESULTS=5
```
Web results and generated images can introduce inaccurate, outdated, or licensed material. Review facts, citations, image rights, and attribution requirements before sharing a presentation.
# Configure by goal
Source: https://docs.presenton.ai/self-hosted/configuration/recipes
Choose a feature, then set the exact ports and environment variables it requires.
Use this page when you know what you want Presenton to do but do not yet know which settings make it happen.
## Quick decision table
| Goal | Required ports | Main settings or actions |
| ---------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------ |
| Open the browser application | `5001:80` by default | Mount `/app_data`; select a text provider |
| Use a ChatGPT/Codex subscription | `5001:80` and `1455:1455` | `LLM=codex`, `CODEX_MODEL`; complete **Sign in with ChatGPT** |
| Use an API-key provider | `5001:80` | `LLM`, provider API key, and provider model |
| Use the REST API | `5001:80` | Admin-generated Presenton API key |
| Use MCP | `5001:80` | Admin-generated Presenton API key, client URL ending in `/mcp` |
| Use Ollama on the Docker host | `5001:80`; Ollama must be reachable from the container | `LLM=ollama`, `OLLAMA_URL`, `OLLAMA_MODEL` |
| Enable stock or generated images | `5001:80` | `IMAGE_PROVIDER` plus its credentials or endpoint |
| Generate without images | `5001:80` | `DISABLE_IMAGE_GENERATION=true` |
| Enable web research | `5001:80` | `WEB_GROUNDING=true`, `WEB_SEARCH_PROVIDER`, optional provider key |
| Lock provider settings | `5001:80` | `CAN_CHANGE_KEYS=false` |
| Persist presentations and settings | No extra port | Mount durable storage at `/app_data` |
| Use an external database | Database must be reachable from the container | `DATABASE_URL`, `MIGRATE_DATABASE_ON_STARTUP` |
| Disable anonymous telemetry | No extra port | `DISABLE_ANONYMOUS_TRACKING=true` |
## Use an existing ChatGPT or Codex subscription
Choose the Codex provider when you want to sign in with a free or paid ChatGPT account instead of supplying an OpenAI API key.
The OAuth redirect is fixed to:
```text theme={null}
http://localhost:1455/auth/callback
```
Therefore Docker must publish both ports:
* `5001:80` for the Presenton browser application.
* `1455:1455` for the ChatGPT/Codex OAuth callback.
```bash theme={null}
docker run -it --name presenton \
--publish 5001:80 \
--publish 1455:1455 \
--env LLM=codex \
--env CODEX_MODEL=gpt-5.5 \
--volume "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
Then open Presenton, go to the text-provider settings, select **Sign in with ChatGPT**, complete authentication in the browser, and choose a supported Codex model.
If `1455:1455` is missing, the OpenAI sign-in page may open, but the redirect cannot reach the callback server inside the container. This port is not needed for normal API-key providers.
The current `v0.9.7-beta` application accepts `gpt-5.6`, `gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, and `gpt-5.3-codex-spark` as Codex model identifiers. Availability can still depend on the signed-in account.
### Docker Compose
The repository's `production`, `production-gpu`, `development`, and `development-gpu` services already map `1455:1455`.
```dotenv theme={null}
LLM=codex
CODEX_MODEL=gpt-5.5
```
```bash theme={null}
docker compose up production
```
### Remote Docker host
Because the browser redirect targets `localhost:1455`, `localhost` means the machine running the browser. When Presenton runs on another host, use an approved network arrangement that makes both Presenton and the callback available locally. For an SSH-accessible server, one option is local port forwarding:
```bash theme={null}
ssh -L 5001:localhost:5001 -L 1455:localhost:1455 user@presenton-server
```
While the tunnel is active, open `http://localhost:5001` and complete the ChatGPT sign-in from that browser session.
Port `1455` is for Codex OAuth, not MCP. MCP uses the normal Presenton web port and `/mcp` path.
## Use OpenAI with an API key
This path uses API billing and does not require port `1455`.
```bash theme={null}
docker run -it --name presenton \
--publish 5001:80 \
--env LLM=openai \
--env OPENAI_API_KEY=YOUR_OPENAI_API_KEY \
--env OPENAI_MODEL=gpt-4.1 \
--env IMAGE_PROVIDER=dall-e-3 \
--env DALL_E_3_QUALITY=standard \
--env CAN_CHANGE_KEYS=false \
--volume "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
`CAN_CHANGE_KEYS=false` hides and locks provider credentials in the UI. Leave it `true` or unset for a personal instance where settings should remain editable.
## Use Google for text and images
One Google API key can supply the Gemini text and image modes:
```dotenv theme={null}
LLM=google
GOOGLE_API_KEY=replace-with-your-key
GOOGLE_MODEL=models/gemini-2.0-flash
IMAGE_PROVIDER=gemini_flash
CAN_CHANGE_KEYS=false
```
Use `LLM=vertex` and the Vertex-specific authentication settings when you need Google Cloud project controls instead of the direct Gemini API.
## Run text generation locally with Ollama
Run Ollama on the Docker host, pull the model there, and point Presenton at the host gateway:
```bash theme={null}
ollama pull llama3.2:3b
```
```dotenv theme={null}
LLM=ollama
OLLAMA_URL=http://host.docker.internal:11434
OLLAMA_MODEL=llama3.2:3b
START_OLLAMA=false
```
`START_OLLAMA=false` means Presenton does not start its own Ollama service. If `host.docker.internal` is unavailable on your Linux Docker setup, provide an equivalent reachable host gateway or run both services on the same Docker network.
To avoid sending image prompts to an external provider:
```dotenv theme={null}
DISABLE_IMAGE_GENERATION=true
```
For a more complete local visual workflow, configure ComfyUI instead of disabling images.
## Use local text with stock images
Text and images do not need to use the same provider:
```dotenv theme={null}
LLM=ollama
OLLAMA_URL=http://host.docker.internal:11434
OLLAMA_MODEL=llama3.2:3b
IMAGE_PROVIDER=pexels
PEXELS_API_KEY=replace-with-your-key
```
This keeps text generation local while sending image searches to Pexels.
## Enable current-information web research
For supported OpenAI, Google, and Anthropic configurations, `auto` uses the provider's native search behavior:
```dotenv theme={null}
WEB_GROUNDING=true
WEB_SEARCH_PROVIDER=auto
WEB_SEARCH_MAX_RESULTS=5
```
For other text providers, choose an external search provider explicitly:
```dotenv theme={null}
WEB_GROUNDING=true
WEB_SEARCH_PROVIDER=searxng
SEARXNG_BASE_URL=http://searxng:8080
WEB_SEARCH_MAX_RESULTS=5
```
Set `WEB_GROUNDING=false` when current public information is unnecessary or external research is not allowed.
## Enable the REST API and MCP
Both interfaces use the normal web port. Configure the primary administrator first:
```dotenv theme={null}
AUTH_USERNAME=admin
AUTH_PASSWORD=replace-with-a-long-password
```
Open **Admin → API keys**, generate a `sk-presenton-...` key, and send it as a bearer token:
* REST API: `http://localhost:5001/api/v1`
* MCP: `http://localhost:5001/mcp`
No additional MCP port is required. The Electron desktop app does not expose MCP.
Upload documents and generate PPTX or PDF output over REST.
Generate an API key and configure local or remote clients.
## Improve document extraction
LiteParse defaults are suitable for most documents:
```dotenv theme={null}
LITEPARSE_DPI=120
LITEPARSE_NUM_WORKERS=1
```
Increase `LITEPARSE_DPI` when scanned or image-heavy documents need clearer OCR. Increase workers only when the host has enough CPU and memory for concurrent parsing.
## Use an external database
Without `DATABASE_URL`, Presenton uses SQLite under `/app_data`. For an external database:
```dotenv theme={null}
DATABASE_URL=postgresql://presenton:password@postgres:5432/presenton
MIGRATE_DATABASE_ON_STARTUP=true
```
The database hostname must be reachable from the container. Continue mounting `/app_data`; presentations, uploads, templates, exports, authentication state, and memory are not all replaced by the external database.
## Apply configuration changes
Environment changes require a container restart or recreation:
```bash theme={null}
docker compose up --detach --force-recreate production
```
Check the restarted service separately:
```bash theme={null}
docker compose logs --tail 100 production
```
After every provider or networking change, generate a short test presentation and verify the browser, API, export, and MCP paths that your deployment intends to support.
# Storage and processing
Source: https://docs.presenton.ai/self-hosted/configuration/storage-and-processing
Configure app data, databases, presentation memory, document parsing, and telemetry.
Presenton stores more than database records. Plan persistence for `/app_data` first, then add an external database or tune document and memory processing when the workload requires it.
## Persistent app data
`/app_data` contains presentations, uploaded files, generated assets, templates, exports, settings, authentication state, the default SQLite database, and local memory data.
```bash theme={null}
docker run -it --name presenton \
--publish 5001:80 \
--volume "./app_data:/app_data" \
ghcr.io/presenton/presenton:latest
```
Use a named volume or durable platform disk in production. Back it up before image upgrades, migrations, or authentication recovery.
## Database
Without `DATABASE_URL`, Presenton uses SQLite in `/app_data`. This is suitable for personal and small single-instance deployments.
Set `DATABASE_URL` to move application records to PostgreSQL or MySQL. Keep `/app_data` persistent as well—generated assets, uploads, exports, templates, and local memory are still stored there.
```dotenv theme={null}
DATABASE_URL=postgresql://presenton:password@postgres:5432/presenton
MIGRATE_DATABASE_ON_STARTUP=true
```
```dotenv theme={null}
DATABASE_URL=mysql://presenton:password@mysql:3306/presenton
MIGRATE_DATABASE_ON_STARTUP=true
```
The repository's Compose services enable startup migrations. For production, take a database backup before applying a new release and avoid running multiple instances through a migration until you have verified the release's deployment behavior.
## Presentation memory
Presenton uses Mem0 OSS with local Qdrant and SQLite storage. Memory is scoped to a presentation and helps the assistant preserve relevant context during iterative edits.
| Variable | Default | Purpose |
| -------------------------- | --------------------------------------------------- | --------------------------------------------- |
| `MEM0_ENABLED` | `true` | Enable or disable memory |
| `MEM0_LLM_MODEL` | `OLLAMA_MODEL` or `llama3.1:latest` | Model used by memory extraction |
| `MEM0_LLM_API_KEY` | `ollama` | API-key placeholder for the compatible client |
| `MEM0_LLM_BASE_URL` | `OLLAMA_URL` or `http://host.docker.internal:11434` | Memory model endpoint |
| `MEM0_DIR` | `/app_data/mem0` | Local memory storage root |
| `MEM0_EMBEDDER_PROVIDER` | `fastembed` | Embedding provider |
| `MEM0_EMBEDDER_MODEL` | `BAAI/bge-small-en-v1.5` | Embedding model |
| `MEM0_EMBEDDING_DIMS` | `384` | Vector dimensions |
| `MEM0_SPACY_MODEL` | `en_core_web_sm` | spaCy model |
| `MEM0_REQUIRE_SPACY_MODEL` | `true` | Require the configured spaCy model |
The official Docker image includes the required spaCy model. Disable Mem0 if your deployment does not need iterative presentation memory or cannot reach the configured memory model.
## Document parsing
LiteParse extracts content from uploaded documents before the presentation outline is generated.
```dotenv theme={null}
LITEPARSE_DPI=120
LITEPARSE_NUM_WORKERS=1
```
Increase DPI when image-heavy or scanned documents need clearer extraction, at the cost of memory and processing time. Increase workers only after measuring available CPU and memory under concurrent uploads.
Review supported office documents, PDFs, spreadsheets, text files, and images.
## Telemetry
Disable anonymous tracking with:
```dotenv theme={null}
DISABLE_ANONYMOUS_TRACKING=true
```
This setting controls anonymous product telemetry; it does not prevent a configured hosted AI, image, or search provider from receiving the content sent to that provider. Use local providers and disable external search and images when the workflow requires local-only processing.
## Backup checklist
* Back up `/app_data` on a regular schedule.
* Back up the external database separately when `DATABASE_URL` is set.
* Test restoration in a separate instance.
* Protect backups because they may contain uploaded documents and generated presentations.
* Keep the application version and configuration used by each backup.
# Text providers
Source: https://docs.presenton.ai/self-hosted/configuration/text-providers
Configure hosted models, local runtimes, model gateways, and OpenAI-compatible endpoints.
The text provider creates outlines, writes slide content, and powers AI-assisted edits. Select one provider in the application, or set `LLM` and that provider's required credentials and model where environment-based configuration is supported.
## Supported providers
| Provider | `LLM` value | Required settings | Common optional settings |
| --------------------- | ------------ | ------------------------------------------------------------- | ---------------------------------------------------------------------- |
| Presenton Cloud | `presenton` | Administrator-approved device login in onboarding or Settings | None |
| OpenAI | `openai` | `OPENAI_API_KEY` | `OPENAI_MODEL` (default `gpt-4.1`) |
| DeepSeek | `deepseek` | `DEEPSEEK_API_KEY` | `DEEPSEEK_MODEL`, `DEEPSEEK_BASE_URL` |
| Google Gemini | `google` | `GOOGLE_API_KEY` | `GOOGLE_MODEL` |
| Google Vertex AI | `vertex` | `VERTEX_API_KEY`, or project credentials | `VERTEX_MODEL`, `VERTEX_PROJECT`, `VERTEX_LOCATION`, `VERTEX_BASE_URL` |
| Azure OpenAI | `azure` | API key, model, API version, and endpoint or base URL | Deployment name |
| Amazon Bedrock | `bedrock` | Region, model, and one supported AWS credential method | Session token or profile |
| OpenRouter | `openrouter` | `OPENROUTER_API_KEY`, `OPENROUTER_MODEL` | `OPENROUTER_BASE_URL` |
| Fireworks | `fireworks` | `FIREWORKS_API_KEY`, `FIREWORKS_MODEL` | `FIREWORKS_BASE_URL` |
| Together AI | `together` | `TOGETHER_API_KEY`, `TOGETHER_MODEL` | `TOGETHER_BASE_URL` |
| Cerebras | `cerebras` | `CEREBRAS_API_KEY` | `CEREBRAS_MODEL`, `CEREBRAS_BASE_URL` |
| Anthropic | `anthropic` | `ANTHROPIC_API_KEY` | `ANTHROPIC_MODEL` |
| LiteLLM | `litellm` | `LITELLM_BASE_URL`, `LITELLM_MODEL` | `LITELLM_API_KEY` |
| LM Studio | `lmstudio` | `LMSTUDIO_BASE_URL`, `LMSTUDIO_MODEL` | `LMSTUDIO_API_KEY` |
| Ollama | `ollama` | `OLLAMA_MODEL` | `OLLAMA_URL`, `START_OLLAMA` |
| Custom compatible API | `custom` | `CUSTOM_LLM_URL`, `CUSTOM_MODEL` | `CUSTOM_LLM_API_KEY` |
| ChatGPT through Codex | `codex` | Interactive OAuth | `CODEX_MODEL` |
Set `CAN_CHANGE_KEYS=false` to prevent provider keys from being changed in the UI.
## Presenton Cloud provider
Use this provider when you want the self-hosted interface and local dashboard with generation handled by a connected Presenton account. Sign in to the local administrator account, choose **Presenton** during onboarding or in provider settings, and approve the displayed device code on the hosted Presenton page.
The approved connection is global to the installation and its delegated credentials are encrypted at rest. No API key, OAuth client secret, callback port, or provider environment variables are required. Selecting Presenton stores `LLM=presenton`; setting that value alone does not create the required account connection.
This provider sends generation inputs and uploaded documents used in its workflows to Presenton Cloud. It does not authenticate users to the self-hosted browser, REST API, or MCP server.
## ChatGPT sign-in through Codex
Use this provider when you want to authenticate with an existing free or paid ChatGPT account instead of an OpenAI API key.
```dotenv theme={null}
LLM=codex
CODEX_MODEL=gpt-5.5
```
Docker must publish the OAuth callback port in addition to the application port:
```bash theme={null}
--publish 5001:80 --publish 1455:1455
```
Open Presenton, select **Sign in with ChatGPT**, and complete the browser flow. OpenAI redirects the browser to `http://localhost:1455/auth/callback`, so omitting the callback mapping prevents containerized sign-in from completing. The source repository's Compose services already publish this port.
Port `1455` is only for ChatGPT/Codex OAuth. The REST API and MCP server both use the normal Presenton web port.
See Docker Run, Compose, supported model identifiers, and remote-host port forwarding.
## Hosted-provider examples
```dotenv theme={null}
LLM=openai
OPENAI_API_KEY=replace-with-your-key
OPENAI_MODEL=gpt-4.1
```
```dotenv theme={null}
LLM=google
GOOGLE_API_KEY=replace-with-your-key
GOOGLE_MODEL=models/gemini-2.0-flash
```
```dotenv theme={null}
LLM=anthropic
ANTHROPIC_API_KEY=replace-with-your-key
ANTHROPIC_MODEL=claude-3-5-sonnet-20241022
```
```dotenv theme={null}
LLM=openrouter
OPENROUTER_API_KEY=replace-with-your-key
OPENROUTER_MODEL=openai/gpt-4o
OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
```
## Cloud-provider authentication
### Vertex AI
Use either an API key or Google Cloud project authentication—not both.
```dotenv theme={null}
LLM=vertex
VERTEX_API_KEY=replace-with-your-key
VERTEX_MODEL=gemini-2.5-flash
```
```dotenv theme={null}
LLM=vertex
VERTEX_PROJECT=your-project-id
VERTEX_LOCATION=us-central1
VERTEX_MODEL=gemini-2.5-flash
```
### Azure OpenAI
```dotenv theme={null}
LLM=azure
AZURE_OPENAI_API_KEY=replace-with-your-key
AZURE_OPENAI_MODEL=gpt-4.1
AZURE_OPENAI_API_VERSION=2024-10-21
AZURE_OPENAI_ENDPOINT=https://YOUR-RESOURCE.openai.azure.com
```
Provide at least one supported endpoint or base URL. If your Azure configuration uses a deployment name distinct from the model, set the corresponding deployment variable as well.
Choose an authentication method, model ID or inference profile, and the required IAM permissions.
## Local and compatible providers
### Ollama
```dotenv theme={null}
LLM=ollama
OLLAMA_URL=http://host.docker.internal:11434
OLLAMA_MODEL=llama3.2:3b
START_OLLAMA=false
```
### LM Studio
```dotenv theme={null}
LLM=lmstudio
LMSTUDIO_BASE_URL=http://host.docker.internal:1234
LMSTUDIO_MODEL=openai/gpt-oss-20b
```
Presenton appends `/v1` to the LM Studio base URL when needed.
### Custom OpenAI-compatible API
```dotenv theme={null}
LLM=custom
CUSTOM_LLM_URL=https://gateway.example.com/v1
CUSTOM_LLM_API_KEY=replace-with-your-key
CUSTOM_MODEL=your-model-id
```
Use `DISABLE_THINKING=true` when a compatible model's reasoning mode causes unwanted behavior. Use `EXTENDED_REASONING` only with a provider and model that supports it.
## Apply and test changes
Restart the container after changing environment variables:
```bash theme={null}
docker compose up --detach --force-recreate production
```
Check the restarted service separately:
```bash theme={null}
docker compose logs --tail 100 production
```
Generate a short test presentation before relying on a new model in production. Provider access, supported model names, regional availability, and account quotas can all affect generation.
A model being available from a provider does not guarantee that your account can invoke it. Confirm access and quotas in the provider console when authentication succeeds but generation fails.
# Contributing
Source: https://docs.presenton.ai/self-hosted/contributing
Report an issue or prepare a focused contribution to Presenton.
Presenton is open source under the Apache 2.0 license. Before writing code, check the repository's current contribution scope: contributions outside `electron/` may not be accepted at this time.
Include reproduction steps, expected and actual behavior, and useful logs or screenshots.
Explain the user problem and the result you want before proposing implementation details.
## Current code contribution scope
The accepted scope centers on the Electron application, including its desktop application, FastAPI backend, Next.js frontend, and local runtime integrations.
```text theme={null}
presenton/
└── electron/ # Current contribution scope
├── desktop app
├── backend
├── frontend
└── local runtime integrations
```
Confirm the current scope in the canonical [CONTRIBUTING.md](https://github.com/presenton/presenton/blob/main/CONTRIBUTING.md) before starting. Repository policy can change independently of this documentation snapshot.
## Prepare the development environment
You need Node.js LTS, npm, Python, and the `uv` Python package manager.
```bash theme={null}
cd electron
```
Install the development dependencies:
```bash theme={null}
npm run setup:env
```
Then start the development environment:
```bash theme={null}
npm run dev
```
The setup command installs the Electron, FastAPI, and Next.js dependencies. `npm run dev` compiles TypeScript and starts the local backend and UI with the desktop application.
## Before opening a pull request
* Keep the change inside `electron/`, small, and focused.
* Verify both the development workflow and the relevant build workflow.
* Explain the problem, the change, and how you tested it.
* Include before-and-after screenshots for UI changes.
* Sign the Contributor License Agreement when prompted.
* Follow the repository Code of Conduct.
Pull requests left without a signed CLA for more than 30 days may be closed under the repository's contribution policy.
## AI-assisted contributions
AI-assisted pull requests are welcome. State that AI tools were used, describe the testing performed, and confirm that you reviewed the generated code yourself.
Check the live scope, setup steps, CLA policy, and community links before contributing.
# Choose your AI providers
Source: https://docs.presenton.ai/self-hosted/core-concepts/providers
Select the services that write content, create images, and search the web.
A provider is simply the service Presenton calls for one job. You can mix local and hosted providers based on privacy, quality, speed, and cost.
## Choose three capabilities
Creates outlines, writes slide content, and powers the AI assistant.
Finds stock photos or generates new visuals for slides.
Adds current public information when you enable research.
## Supported text providers
Presenton Cloud, OpenAI, Google Gemini, Anthropic, DeepSeek, Azure OpenAI, Vertex AI, Amazon Bedrock, OpenRouter, Fireworks, Together AI, Cerebras, LiteLLM, Ollama, LM Studio, custom OpenAI-compatible endpoints, and ChatGPT sign-in through Codex where supported.
## Use Presenton Cloud as a provider
In `v0.9.7-beta` and later, the local administrator can connect a Presenton account from onboarding or provider settings. Presenton displays a short device code and opens the hosted approval page. After approval, select **Presenton** as the text provider to route supported generation and document-upload workflows through Presenton Cloud.
This connection is a generation provider, not a sign-in method for the self-hosted application. Create or sign in to the local administrator account first.
The connection applies to the entire installation:
* Only the local administrator can connect, replace, or disconnect it.
* Delegated access and refresh credentials are encrypted at rest and are not returned to the browser.
* Selecting the provider stores `LLM=presenton`; connecting it alone does not replace another selected provider.
* Disconnecting revokes the cloud credentials and deselects Presenton.
* Official builds include the public device-flow client configuration, so no OAuth client secret or registration is required.
Presentations and documents processed through this provider leave the self-hosted environment. Use a local provider when your data-handling policy requires processing to remain on your infrastructure.
## Supported image providers
Pexels, Pixabay, Gemini Flash, Nano Banana Pro, DALL·E 3, GPT Image 1.5, ComfyUI, Open WebUI, and OpenAI-compatible image endpoints.
## Supported web search
Native provider search, self-hosted SearXNG, Tavily, and Exa.
| Your priority | Good starting point |
| -------------- | -------------------------------------------------------------------------- |
| Easiest setup | Connect Presenton Cloud, or use a hosted text model with Pexels or Pixabay |
| Local privacy | Ollama or LM Studio with ComfyUI or no generated images |
| One gateway | LiteLLM or OpenRouter |
| Private search | SearXNG |
Connect Presenton to Ollama step by step.
Find exact environment variables and examples for every supported text provider.
Set stock, generated-image, compatible API, and web research providers.
# v0.9.7-beta release notes
Source: https://docs.presenton.ai/self-hosted/release-notes
Presenton account connection, cloud-backed generation, migration, and reliability changes in Presenton v0.9.7-beta.
Presenton `v0.9.7-beta` lets a self-hosted installation connect a Presenton account as an optional generation provider. It also improves cloud-backed Smart and Standard workflows, provider lifecycle handling, exports, and dashboard behavior. These notes follow the [Docker v0.9.7-beta release](https://github.com/presenton/presenton/releases/tag/v0.9.7-beta), published August 17, 2026, and the [electron-v0.9.7-beta release](https://github.com/presenton/presenton/releases/tag/electron-v0.9.7-beta), published August 18, 2026.
## At a glance
An administrator can approve a device code and use Presenton Cloud as an installation-wide generation provider.
Standard and Smart generation, document uploads, templates, assets, and streamed results work through the connected account.
Provider revalidation, generation-mode persistence, exports, dialogs, and dashboard actions receive targeted fixes.
## What's changed
### Presenton account connection
* [Added **Login with Presenton**](https://github.com/presenton/presenton/pull/833) using an OAuth device flow that keeps the approval code out of callback URLs and browser history.
* Added administrator-managed connect, status, revalidation, and disconnect flows in onboarding and Settings.
* Stored delegated credentials as one encrypted, installation-wide provider record instead of per-user browser state.
* Kept the self-hosted administrator session separate from the optional Presenton account connection.
### Generation and templates
* Added `presenton` as a text-provider selection for linked installations.
* Routed linked Standard and Smart generation, document uploads, templates, and assistant requests through the Presenton Cloud workflow.
* Mirrored completed cloud presentations into the local dashboard while preserving generation type, streamed results, and cloud asset URLs.
* Added database migrations for the global provider record and for identifying existing Smart presentations correctly.
### Interface, exports, and packaging
* Improved provider connection states, mode-dialog positioning, dashboard action responsiveness, settings navigation, presentation deletion, and translation-overlay handling.
* Fixed export package integration, release versioning, and related backend tests.
* [Added an Enterprise overview to the source README](https://github.com/presenton/presenton/pull/825), covering Helm deployment, audit logs, centralized administration, and enterprise identity options.
## API and data compatibility
The self-hosted API remains under `/api/v1/`. This release adds administrator-controlled provider endpoints under `/api/v1/auth/presenton` for status, device authorization, polling, and logout. These routes support the application UI and do not replace normal browser, REST API, or MCP authentication.
Startup migrations create the global Presenton provider record and backfill the `smart` generation mode for presentations that already contain Smart HTML slides. Let migrations finish before starting concurrent instances.
Connecting a Presenton account sends generation inputs and uploaded documents used by that provider to Presenton Cloud. Choose a local or separately configured provider when content must remain within your own infrastructure.
## Before upgrading
1. Back up `/app_data` and any external database.
2. Pull `ghcr.io/presenton/presenton:latest`, or select an explicit version or image digest for a controlled rollout.
3. Let database migrations finish before starting additional application instances.
4. Verify local administrator sign-in independently from the optional Presenton provider connection.
5. Test Standard and Smart generation, document uploads, streamed completion, local dashboard copies, assets, and both export formats.
## Full changelogs
* [Docker: compare `v0.9.6-beta...v0.9.7-beta`](https://github.com/presenton/presenton/compare/v0.9.6-beta...v0.9.7-beta)
* [Desktop: compare `electron-v0.9.5-beta...electron-v0.9.7-beta`](https://github.com/presenton/presenton/compare/electron-v0.9.5-beta...electron-v0.9.7-beta)
# Fonts
Source: https://docs.presenton.ai/user-guide/branding-and-design/brand-colors-and-fonts
Detect, resolve, and verify the fonts used by a custom presentation template.
Template Studio detects the fonts used in an uploaded PowerPoint presentation and helps make them available to the generated custom template.
Presenton provides fonts available through Google Fonts. If the PPTX uses a font that is not available, Template Studio lets you upload the font file manually.
This workflow manages fonts for custom templates. Template Studio does not provide color configuration during template creation; colors and other visual styling come from the uploaded PowerPoint design.
## How font detection works
When you upload a filled `.pptx`, Template Studio reads the fonts referenced by its slides.
| Detection result | What happens |
| -------------------------------------- | -------------------------------------------------------------------------- |
| Font is available through Google Fonts | Presenton makes the font available automatically |
| Font is not available | Template Studio shows it as missing and provides an upload control |
| Missing font is not uploaded | A fallback font may change text width, wrapping, spacing, and slide layout |
## Review and resolve template fonts
Open **Templates**, start a new template, and upload the filled PPTX that contains your branded slide designs.
After the file is ready, continue to the font review step. Template Studio analyzes the fonts referenced by the presentation.
Check the font list. Fonts available through Google Fonts are provided by Presenton. Fonts that cannot be found are marked for manual upload.
Review detected fonts and identify missing files
Use the upload control beside each missing font and select the corresponding font file from your computer.
Upload a font that Presenton could not resolve
When the required fonts are available, continue to preview. Inspect titles, body text, line breaks, spacing, and alignment before creating the template.
## Choose the correct font file
* Upload the font family and weight requested by Template Studio.
* Use a font file that your organization is permitted to use and distribute.
* Keep regular, medium, semibold, bold, and italic variants available when the source deck uses them.
* Do not substitute a similarly named font without checking every affected slide.
Font files are licensed assets. Confirm that your font license permits use in the deployment, generated presentations, and exported files.
## Verify font fidelity
After the template is generated:
1. Open its layouts and check short and long sample text.
2. Confirm headings and body text use the intended family and weight.
3. Look for unexpected wrapping, clipping, overflow, and alignment changes.
4. Generate a short Standard presentation with the custom template.
5. Export both PPTX and PDF and inspect them in the applications your audience will use.
Upload the source PPTX and create the reusable template.
Test text behavior and character limits after generation.
# Templates
Source: https://docs.presenton.ai/user-guide/branding-and-design/templates
Turn your branded PowerPoint presentation into a reusable template for Standard presentations.
Templates let Presenton generate new presentations in an existing brand design. Use **Template Studio** to convert your own filled PowerPoint presentation into a reusable custom template.
Each slide in the uploaded PPTX can become a reusable layout. Presenton analyzes the slide structure, text fields, images, and other editable regions so new content can be placed into the same design.
Turn a branded PowerPoint presentation into a reusable template
## What a branded template preserves
A well-prepared custom template helps generated presentations reuse:
* Branded slide layouts and composition
* Typography and text hierarchy
* Image, chart, table, and content regions
* Repeated visual elements and spacing
* Layouts for titles, sections, content, data, and closing slides
Templates control slide structure. Themes separately control presentation-wide colors, fonts, and logos.
| Branding need | Use |
| ----------------------------------------------------- | ----------------- |
| Reuse the layouts from an existing PowerPoint design | Custom template |
| Apply colors, fonts, and a logo across a presentation | Custom theme |
| Start from a design supplied by Presenton | Built-in template |
## Prepare the source PowerPoint
Upload a filled `.pptx` that represents the brand and includes the slide types you want Presenton to reuse.
* Include real sample content instead of empty placeholders.
* Add one or more distinct examples of each required layout type.
* Remove obsolete, confidential, and duplicate slides.
* Keep custom font files available for upload.
* Check that logos, images, and other brand assets are clear and correctly positioned.
Do not use an empty PowerPoint master as the source. Template Studio learns from the content and structure of filled slides. Missing or near-duplicate examples can produce incomplete or unreliable layouts.
## Create the branded template
Open **Templates**, then select **Build Template** or **New Template**.
Select **Upload PPTX File**, choose the source presentation, and wait for it to become **Ready**. Select **Get Started**.
Upload a branded PowerPoint presentation
Review the detected fonts and upload any missing font files. Correct fonts are required for reliable text measurement, wrapping, and layout fidelity.
Inspect the thumbnails and slide preview. Confirm that the deck contains the branded layouts you want to reuse, then select **Create Template**.
Use a recognizable brand and use-case name. Add a description that explains when the template should be selected, then select **Create**.
The template appears in the **Custom** library while Presenton converts the source slides into reusable layouts. Wait for generation to finish before using or editing it.
## Refine the generated layouts
After creation, open the template and review each generated layout in the Template Editor.
* Edit sample text and confirm the intended typography.
* Set realistic minimum and maximum character limits in **Schema**.
* Test Low, Medium, and High content density.
* Use **Re-Construct** if a slide is blank, incomplete, or incorrectly constructed.
* Check layout names and descriptions under **Layouts**.
* Save after reviewing the edited slides and metadata.
Follow the full Template Studio upload and creation workflow.
Refine schemas, text behavior, reconstruction, and layout metadata.
## Validate the brand result
Before making the custom template the default choice for repeated work:
1. Generate a short Standard presentation with realistic content.
2. Confirm Presenton selects appropriate layouts for different slide purposes.
3. Check font rendering, text overflow, image placement, spacing, and logo treatment.
4. Export both PPTX and PDF.
5. Open the exports in the applications your audience will use.
A smaller collection of distinct, dependable branded layouts is more useful than a large collection of near-duplicate slides.
Custom templates apply to Standard presentations. Cloud Smart presentations use Smart designs rather than Standard template layouts.
# API Playground
Source: https://docs.presenton.ai/user-guide/cloud/api-playground
Configure a presentation request, test it, or copy the API code.
Cloud only
## Configure and run a request
Select **API Playground** from the Presenton Cloud dashboard.
Use one prompt for the full presentation. Presenton decides how to divide the content across the selected number of slides.
Write one prompt for the full deck
Use a separate content block for every slide. Add or remove slide blocks when you need exact control over the deck structure.
Provide content for each slide
Enter the presentation prompt or add content to each slide. Upload reference files when the request should use source material.
For **Presentation Content**, choose the number of slides. Then select **Standard** for template-based layouts or **Smart** for content-driven composition.
Choose the slide count for Presentation Content
Use only the settings required for the result you want.
Set content generation, tone, verbosity, image type, language, and export format.
Set tone, verbosity, media, language, and export format
Choose an instruction preset or write custom instructions for the presentation.
Add a preset or custom instruction
Choose whether to include Markdown emphasis, a table of contents, a title slide, and user information.
Choose the optional presentation sections
Select **Generate** to run the request and review the presentation in Presenton.
Select **Get Code** when the configuration is ready to use in your application or automation. Test with **Generate** first when you want to confirm the output before integrating it.
Follow the complete Playground workflow
# Edit PPTX with AI
Source: https://docs.presenton.ai/user-guide/cloud/edit-pptx-with-ai
Import an existing PowerPoint presentation and edit it with AI.
Cloud only
## Import and edit
From the dashboard, click **Edit PPTX with AI**. Select or drag in the PPTX you want to edit.
Select or drag in the PowerPoint file
After the file uploads, click **Check Fonts**.
Check the fonts used in the uploaded presentation
Review **Available Fonts** and **Missing Fonts**. If a font is missing, click **Upload** and select its font file.
Review available and missing fonts
Select the matching font file when a font is missing
If every font is already available, continue without uploading a font file.
Confirm that all fonts are ready, then click **Import Presentation**.
Import after all required fonts are ready
Wait for the editable deck to open. Enable **Select Edit** for direct changes or use the **AI Assistant** to update slide content and design.
Edit the imported presentation directly or with AI
# Create a presentation
Source: https://docs.presenton.ai/user-guide/create-new-presentation
Create a presentation in Presenton Cloud or open-source Presenton.
## Create a presentation
Choose **Cloud** for Presenton Cloud or **Open-source** for your local or self-hosted installation. Each tab follows the workflow from prompt to generated presentation.
## Watch the workflow
## Generation essentials
| Decision | Guidance |
| ----------------- | --------------------------------------------------------------------------------------------------------------------------- |
| Presentation type | Use **Standard** for reusable template layouts. Choose **Smart** when available and the design should adapt to the content. |
| Prompt | Name the audience, desired outcome, scope, and facts that must remain unchanged. |
| Source material | Attach only relevant, authoritative documents, spreadsheets, images, or presentations. |
| Controls | Set the slide count, language, tone, verbosity, and structural options that carry a real requirement. |
| Outline | Correct missing content, weak sequencing, unsupported claims, and unnecessary slides before generation. |
Use the prompt to explain what to create and attachments to provide evidence. For example: `Create a seven-slide executive update from the attached report. Preserve every reported figure and end with three decisions.`
Select **Create new Presentation** from the Cloud dashboard.
Choose **Standard** for template-based layouts or **Smart** for content-driven composition.
Switch between Standard and Smart
Choose **Auto slides** or a fixed count, then select the output language.
Choose Auto slides or a fixed slide count
Select the presentation language
Describe the presentation you want. Attach reference files when Presenton should use specific source material.
Describe the presentation you want
Attach files beside the prompt
Set tone, verbosity, title slide, table of contents, web search, or additional instructions when needed.
Adjust only the settings you need
Select **Get Started**, review the outline, and choose the design before generating the presentation.
Review the outline before generating slides
After generation, the presentation opens in the editor.
Continue in the Presenton Editor
Complete [open-source onboarding](/user-guide/onboarding#open-source) first.
Start a new presentation and confirm the configured provider shown above the prompt.
Keep **Auto slides** or choose a slide count, select the language, and open **Advanced settings** when needed.
Generation controls above the prompt
Choose Auto slides or a fixed slide count
Select the presentation language
Review Advanced settings when needed
Enter a prompt, upload reference files, or use both.
Prompt and attached source file ready for generation
Select **Get Started**, choose a template, review the outline, and generate the presentation.
Use **Built-in** for templates provided by Presenton. Use **Custom** when you want to create or reuse your own template.
Choose a Built-in template from Presenton
Choose or build your own Custom template
[Follow the complete template creation workflow](/user-guide/template-creation)
Review and edit the outline with AI
After generation, the presentation opens in the editor.
Continue in the Presenton Editor
## Verify source-based presentations
* Compare important names, dates, claims, and figures with the original files.
* Recalculate totals, percentages, and changes shown in tables or charts.
* Confirm units, reporting periods, category labels, and data sources.
* Review image relevance, cropping, and usage rights.
* Inspect the exported PPTX or PDF for overflow, clipping, and layout changes.
Choose direct Canvas editing or the AI assistant for the changes you still need.
Download the verified presentation as PPTX or PDF.
# Design creation
Source: https://docs.presenton.ai/user-guide/design-creation
Turn a PowerPoint presentation into a reusable custom design for Smart presentations.
Use **Design Studio** to convert a filled PowerPoint presentation into a reusable custom design for Smart mode. Presenton analyzes the source slides, resolves their fonts, and generates a design that Smart presentations can use with flexible content.
Design creation is a Presenton Cloud Smart-mode workflow. For fixed Standard layouts, use [Template creation](/user-guide/template-creation).
## Designs and templates
| Reusable asset | Presentation mode | Best for |
| -------------- | ----------------- | ------------------------------------------------------------------------------ |
| Design | Smart | Flexible slide composition based on the source presentation's visual direction |
| Template | Standard | Predictable layouts converted from individual source slides |
Upload a filled PPTX with representative content and a consistent visual system. An empty master or slides made only from placeholders do not give Design Studio enough information to analyze the design reliably.
## Create a custom design
Start a new presentation. Open the mode selector and choose **Smart**.
Open the presentation generator
Select Smart for flexible design-based generation
In **Choose a design**, select **Create new design**. You can start from the creation card, the button beside the section heading, or the empty state under **Your designs**.
Built-in Smart designs and the Create new design action
Create the first custom design from the empty state
In **Design Studio**, select **Upload PPTX File** and choose the filled PowerPoint presentation whose visual design you want to reuse. The displayed limits are PPTX only, up to 100 MB, with an estimated five-minute generation time.
Upload a PowerPoint presentation to Design Studio
After the file appears, select **Check Fonts**. Presenton supplies fonts it can resolve and identifies any font files that must be uploaded manually.
Uploaded PPTX ready for font analysis
Continue after all required fonts are available
Select **Continue to Preview**. Review the detected slides and confirm that typography, images, spacing, and the overall design match the source PPTX.
Review the source slides before generating the design
Select **Generate Design**, enter a clear name, and confirm generation. Use a name that identifies the brand, team, or intended presentation type.
Name the reusable Smart design
Design generation runs asynchronously. You can stay on the page or select **Go to Designs**. Presenton displays the request status and sends an email when the design is ready.
Design generation request accepted for asynchronous processing
## Find and use the design
Open **Designs** from the dashboard. **Default** contains designs provided by Presenton; **Your designs** contains designs generated from your PPTX files.
Built-in designs supplied by Presenton
Generated custom design under Your designs
To create a Smart presentation with the design:
Start a Smart presentation, enter the prompt and optional attachments, open **Your designs**, and select the custom design. Then select **Get Started**.
Select a custom design for Smart generation
Presenton analyzes the prompt and sources, optionally performs web search, and builds the presentation outline.
Smart presentation outline generation in progress
Review the title, slide order, content, and supporting points. Reorder or remove slides where required, then select **Generate Presentation**.
Review Smart presentation content before generation
Check every slide for content accuracy, layout quality, image relevance, and text overflow. Use the editor and AI Assistant for refinements, then export the verified presentation.
Smart presentation generated with the custom design
## Verify a new design
* Generate a short presentation with varied slide purposes.
* Check that the visual direction remains consistent across slides.
* Confirm all intended fonts render correctly.
* Review both short and long content for overflow or weak spacing.
* Export PPTX and PDF and inspect both files before using the design for repeated work.
Use Template Studio when you need fixed, reusable layouts for Standard presentations.
Continue with Canvas editing or the AI assistant after generating with the design.
# Using the AI assistant
Source: https://docs.presenton.ai/user-guide/editing-and-refining/ai-assistant
Send one focused request for the active slide and review the result.
Use AI when the change is easier to describe than to build manually. Keep the active slide in scope, request one result, and review the completed edit before sending another prompt.
Add a slide and request one focused change with AI
Open the target slide and check the slide chip in the AI composer.
Enter a focused request, such as `Add a heading about the content`.
Submit the prompt and allow the change to finish.
Check the new content, its placement, and the objects that should remain unchanged.
Write a clear target, action, and constraint.
Confirm the slide scope and Follow AI mode.
See which context behavior still needs verified product media.
# Blocks and layout
Source: https://docs.presenton.ai/user-guide/editing-and-refining/canvas/block-editing
Find and add reusable content blocks.
Blocks are reusable slide sections with one or more layout variants.
This focused walkthrough shows only the relevant workflow: open **Blocks**, choose a reusable pattern or **Use Template**, select a variant, and review the inserted layout.
Browse block families beside the active slide
## Add a block
Select **Blocks** in the editor rail.
Search by purpose, such as `metadata`, or browse the available block families.
Expand the layout count on a block card and choose the variant that matches the slide.
Confirm that the inserted content fits the slide and follows the surrounding design.
Search result for a Metadata Card with two layouts
Move or resize an inserted element on the canvas.
# Move, resize, and rotate
Source: https://docs.presenton.ai/user-guide/editing-and-refining/canvas/drag-and-drop
Transform a selected canvas element.
Select an element on the slide to reveal its canvas handles and editing controls. Before moving it, note its alignment, spacing, size, and relationship with nearby text or visual elements so the revised layout remains balanced.
Click the object that should change and confirm that only the intended element is selected. If several objects behave as one unit, check whether they are grouped before transforming them.
Drag the object to move it. Use the visible handles to resize or rotate it, making one controlled adjustment at a time. Resize images proportionally when their original aspect ratio should remain unchanged.
Check overlap, margins, alignment, spacing, text wrapping, slide boundaries, and the relationship with nearby content. Preview the complete slide rather than judging the changed element in isolation.
Make one transform at a time and compare the result with the surrounding layout. Verify important changes in an exported PPTX or PDF when exact placement, cropping, or font rendering matters.
# Groups and layers
Source: https://docs.presenton.ai/user-guide/editing-and-refining/canvas/group-and-ungroup
Group selected objects or separate a group for individual editing.
Group related objects when they should move and resize as one composition. Ungroup them when an individual object needs a separate change.
Select multiple objects and choose Group
Select the objects that should behave as one composition. The selection count appears above the canvas.
Choose **Group** or use the displayed keyboard shortcut.
Move, resize, or rotate the grouped composition and review its relationship with nearby content.
Select a grouped composition and choose Ungroup
Select the grouped composition to reveal its object actions.
Choose **Ungroup** to separate the composition into individually selectable objects.
Select the required object, make the change, and check the surrounding layout.
The supplied captures verify **Group** and **Ungroup**. They do not show layer-order controls such as **Bring forward** or **Send backward**.
For a single object, use:
Transform one selected object.
Add a verified element from the Elements panel.
# Images and icons
Source: https://docs.presenton.ai/user-guide/editing-and-refining/canvas/image-editing
Add and edit image content.
## Add an image layout
Open **Images**, then choose **Image**, **Image + Text**, or **Image Grid**.
Image layouts available from the editor rail
## Edit an image
Add an image, replace its content, and adjust its presentation
1. Select the image element.
2. Use the image controls shown for the selection to replace or adjust it.
3. Resize or reposition the frame when needed.
4. Confirm the subject remains visible and the image does not cover nearby content.
## Edit an icon
Select an icon to change its color. Choose **Change Icon** to search for a more appropriate symbol, compare the available weights, and apply the replacement.
Recolor and replace an icon
# Shapes and lines
Source: https://docs.presenton.ai/user-guide/editing-and-refining/canvas/shape-editing
Add, position, and style shapes, arrows, and connectors.
Open **Elements** to add a **Rectangle**, **Circle**, **Ellipse**, **Triangle**, **Diamond**, **Pentagon**, **Hexagon**, **Arrow**, or **Line**. This walkthrough shows the complete workflow: position a shape, refine its appearance, and format a connector.
Select the required shape, arrow, or line from **Elements**. Drag the selection handles to resize it, then move it into place on the canvas.
Use the contextual controls to set the fill and border. Adjust opacity, corner radius, and shadow when they support the design.
Drag the endpoints into place, then choose the stroke, thickness, and end style from the toolbar.
Check the slide at its final size. Keep connectors easy to follow, maintain consistent styling, and make sure no element obscures text or data.
Watch the verified resize, rotate, and reposition workflow.
# Tables and charts
Source: https://docs.presenton.ai/user-guide/editing-and-refining/canvas/table-editing
Add and edit structured data on a slide.
## Add structured content
Open the appropriate editor rail, add one item at a time, and keep it selected while configuring its content and placement. This walkthrough shows the complete flow for adding a chart and a table, then editing them directly on the canvas.
Open **Tables** and select **Simple Table**.
Simple Table available from the editor rail
Edit table cells directly on the slide
Select the table, edit the required cells, and verify every label and value against the source.
Open **Charts** and choose the form that matches the data.
Chart and infographic types available from the editor rail
Add a chart and edit its data and presentation
Use a bar chart for category comparison, a line or area chart for change over time, and a table when exact values matter more than the pattern.
Visual editing does not validate data. Recheck units, periods, categories, totals, and plotted values before export.
# Text editing
Source: https://docs.presenton.ai/user-guide/editing-and-refining/canvas/text-editing
Add text blocks, rewrite copy, and format text on the slide.
Open **Texts** to add a **Title Block**, **Subtitle**, **Bullet List**, **Order List**, **List Item**, **Quote**, or **Body Text**. The walkthrough shows the complete workflow: write the copy, arrange the text blocks, then apply typography controls.
## Add a text block
1. Choose a text block from **Texts**.
2. Enter the required copy.
3. Position the new text without covering existing content.
## Edit existing text
1. Select a text box and rewrite its copy directly on the canvas.
2. Drag or resize the box to improve spacing and alignment.
3. Select the required text and use the floating toolbar to change its color, emphasis, size, or alignment.
4. Review hierarchy, wrapping, contrast, and overflow across the complete slide.
Use a focused AI request when the wording—not only the formatting—needs to change.
# Context-aware editing
Source: https://docs.presenton.ai/user-guide/editing-and-refining/context-aware-editing
Target an AI change to the selected slide or canvas element.
Select the content first, then prompt the assistant. Presenton adds the active slide and selected canvas element to the composer as context chips, making the intended scope visible before the request is sent.
## Edit the selected content
1. Open the slide you want to change.
2. Select the text, image, shape, or other canvas element.
3. Check the chips above the prompt. The recording shows both **Slide 1** and the selected ungrouped component.
4. Describe the requested change and send the prompt.
5. Review the edited element and the rest of the slide before continuing.
The example changes the selected cover title to **SEO Report 2026**. The assistant reports the completed edit in the same conversation.
The slide chip makes the current prompt scope visible
## Check scope before every prompt
* Remove a chip when that slide or element should not be part of the request.
* Name the intended object in the prompt when the change must be precise.
* Restate anything that must remain unchanged.
* Verify the visible result; a context chip guides the request but does not replace review.
# Editing with prompts
Source: https://docs.presenton.ai/user-guide/editing-and-refining/editing-with-prompts
Write focused editing requests that are easy to review.
The verified workflow uses one direct request. Keep each prompt focused on one related outcome, identify the active slide or selected content, and state any facts, values, or visual elements that must remain unchanged:
```text theme={null}
Add a heading about the content.
```
## Write a focused request
| Include | Purpose |
| ------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Target | Name the active slide, selected element, or specific content that should change so the edit stays within the intended scope. |
| Action | State one verifiable result: add, rewrite, shorten, remove, reorganize, or change the tone for a named audience. |
| Keep | Identify facts, figures, citations, brand terms, formatting, or objects that must remain unchanged. |
## Review before the next prompt
1. Confirm that the requested content was added, removed, or changed exactly once.
2. Check its position, hierarchy, text wrapping, and relationship to nearby elements.
3. Verify that protected facts, values, objects, and brand requirements did not change.
4. Compare the result with the original instruction and correct any unrelated changes.
5. Send the next request only after the current result is accurate and visually coherent.
Keep one prompt to one related outcome. Smaller requests are easier to verify, correct, and reverse without affecting unrelated slide content.
Confirm that the assistant is attached to the intended slide and selected element before describing the requested change.
# Presentation context and memory
Source: https://docs.presenton.ai/user-guide/editing-and-refining/presentation-context-and-memory
Use visible selection and conversation history as prompt context.
The assistant keeps two useful kinds of context visible while you work in the current chat:
* **Selection context:** chips identify the active slide and selected canvas element.
* **Conversation context:** recent prompts and assistant results remain in the panel above the composer.
The close-up follows one request from its selected scope through the assistant response. It does not imply permanent memory across new chats, reopened presentations, browsers, or deployments.
## Read the visible context
Before sending a follow-up prompt:
1. Check the slide and element chips.
2. Read the latest prompt and assistant result.
3. Restate critical facts, source requirements, and anything that must not change.
4. Review the result on the canvas.
Current-chat history and selected scope in the assistant panel
## Start with a clean context
Select **New chat** when you are moving to an unrelated task or do not want the next request to build on the visible conversation. Then select the intended slide or element again and confirm the new scope chips before prompting.
# Slide Editing
Source: https://docs.presenton.ai/user-guide/editing-and-refining/slide-editing
Add slides with AI or templates, then duplicate, reorder, or delete them.
Use the slide rail to select a slide and the controls below the canvas to add or manage slides. You can start with a blank slide, choose a template, generate a slide with AI, or organize the slides already in your deck.
## Watch the slide-editing workflow
This walkthrough shows how to generate a slide with AI, apply a template, and open the slide actions menu.
## Add a slide
Select the slide that should come before the new slide. Its thumbnail is highlighted in the slide rail.
Use one of the controls below the active slide:
| Control | Use it when |
| ---------------- | --------------------------------------------------------------- |
| **Blank** | You want an empty canvas and will add the content yourself. |
| **Use Template** | You want to start from an existing slide layout. |
| **AI slide** | You want Presenton to generate the slide from a focused prompt. |
Check the generated or selected layout, update its content, and confirm that it appears in the correct position in the slide rail.
For AI generation, describe one slide and its intended result. For example: `Create a ranking slide with a keyword-position chart and three SEO takeaways.`
## Duplicate, reorder, or delete a slide
Open the three-dot menu below the active slide to access its management actions.
| Action | Result |
| ------------------- | ------------------------------------------------- |
| **Duplicate Slide** | Creates a copy of the active slide. |
| **Move Up** | Moves the slide one position earlier in the deck. |
| **Move Down** | Moves the slide one position later in the deck. |
| **Delete Slide** | Removes the active slide from the deck. |
After moving or duplicating a slide, review the slide rail to confirm the sequence. After deleting a slide, confirm that the intended slide was removed before continuing.
## Continue editing
Add and edit content directly on the slide.
Request one focused change for the active slide.
# Template Editing
Source: https://docs.presenton.ai/user-guide/editing-and-refining/template-editing
Edit a saved template's text behavior, schema, reconstruction, and layout metadata.
Template Editing starts **after** [Template Creation](/user-guide/template-creation). Use it to test and refine how a saved template behaves when Presenton generates new content.
## Watch the template-editing workflow
This narrated walkthrough covers editing template text and schema limits, reconstructing a slide, checking layout metadata, and saving the refined template.
## Editing workflow
Choose a template slide from the thumbnail rail.
Edit text on the canvas or adjust its schema content and character limits.
Rebuild a slide when its template construction or rendering is incomplete.
Open **Layouts** to inspect slide IDs and descriptions.
Review the reconstructed slide and select **Save**.
## Edit text and schema behavior
Select template slides, edit canvas text, and verify the schema beside the slide
1. Select a text element on the template slide.
2. Replace its sample content.
3. Use the visible text toolbar when the template typography or text box needs adjustment.
4. Check the updated slide at the expected content length.
1. Open **Schema** and expand the required text field.
2. Update **Content** with representative sample text.
3. Set **Min Chars** and **Max Chars** to the expected content range.
4. Test **Low**, **Medium**, and **High** content density to see how the layout behaves at different text lengths.
Schema controls for content density, type, character bounds, and sample content
Use realistic short and long samples. The goal is to confirm that generated text remains readable without breaking the intended layout.
## Reconstruct a slide
Use **Re-Construct** when a slide is blank, partially rendered, or has a template-construction issue.
Start Re-Construct and wait while the canvas rebuilds
The reconstructed slide returns to the canvas with a completion message
After reconstruction, verify the slide content, text bounds, object placement, and schema before saving.
## Inspect Deck Layouts
Open **Layouts** to search the template's reusable slide layouts.
Open Deck Layouts, expand a layout, and inspect its ID and description
Deck Layouts list with search, copy controls, Slide ID, and Slide Description
For each important layout:
1. Confirm the **Slide ID** identifies the layout clearly.
2. Confirm the **Slide Description** matches the visible structure and intended use.
3. Use the copy control when the layout ID is needed elsewhere.
## Save the template
Select **Save** after reviewing the edited slides and layout metadata. **Copy ID** copies the template identifier; undo and redo are available beside it.
**Delete Template** removes the template. Use it only when deletion is intended.
Return to the separate workflow for creating a template from an existing PPTX.
# Managing presentations
Source: https://docs.presenton.ai/user-guide/managing-presentations
Find, review, organize, and export presentations from the dashboard.
Use the dashboard to start new work, find saved presentations, open a deck in the editor, and export the reviewed result as a PDF or PPTX file.
## Watch the workflow
## Manage presentations from the dashboard
The dashboard action row starts the main workflows: create a presentation, begin from a blank deck, import a PPTX for AI editing, or open the API Playground.
Dashboard actions for creating, importing, and using the API Playground
The **Decks** section shows a preview, title, presentation type, and creation date for every saved presentation. Select a card to open it in the editor. Use the three-dot menu for actions that apply to that deck.
Saved presentations in the Decks section
Cloud and open-source use the same presentation editor controls for naming, editing, and exporting. Use the dashboard actions visible in the current account or release to open or remove saved presentations. Cloud manages application storage. A self-hosted deployment owner must keep its persistent application storage available across upgrades and container replacement.
## Before exporting
* Review the story, slide order, and titles.
* Verify important numbers, names, and claims.
* Check text density, line wrapping, and content near slide edges.
* Inspect charts, tables, images, and custom fonts.
* Open the exported file once before sharing it.
Open, rename, and remove presentations.
Create and verify PPTX or PDF output.
Display a scoped, expiring presentation in your application with an iframe.
# Embed a presentation preview
Source: https://docs.presenton.ai/user-guide/managing-presentations/embed-presentation-preview
Create a scoped, expiring Presenton URL and display a presentation securely in your application with an iframe.
Use the Cloud API to create a temporary presentation URL, then load that URL in an iframe. This lets people view, edit, or export a specific presentation inside your application without exposing your Presenton API key or account session in browser code.
The integration endpoint is available in the Presenton Cloud API v3. Create the iframe URL on your server, not directly in the browser.
## How the integration works
1. Your browser asks your application server for a presentation preview.
2. Your server verifies that the signed-in application user may access the presentation.
3. Your server calls `POST /api/v3/presentation/integrate` with its Presenton API key.
4. Presenton returns a scoped, expiring `frontend_url` containing a presentation token.
5. Your server returns that URL to the browser, which uses it as the iframe `src`.
The presentation token can access only the selected presentation and only the capabilities listed in `scopes`. It does not expose your main API key.
## Before you begin
You need:
* A Presenton Cloud API key stored in a server-side secret such as `PRESENTON_API_KEY`.
* The UUID of a presentation owned by the same Presenton account.
* A backend route in your application that authenticates your users before creating preview URLs.
If you generate the presentation through the API, use the returned `presentation_id`. You can also retrieve presentation IDs with [List presentations](/api-reference/v3-presentation/list-presentations).
## 1. Choose the iframe permissions
Every request must include `presentation:read`. Add only the capabilities your embedded experience needs.
| Scope | Embedded capability |
| --------------------- | --------------------------------------------------------------------- |
| `presentation:read` | Load and view the presentation. Required for every integration token. |
| `presentation:edit` | Use edit-capable actions, including chat edits and slide updates. |
| `presentation:export` | Export the embedded presentation. |
For a preview, use only:
```json theme={null}
{
"scopes": ["presentation:read"]
}
```
For an embedded editor that can also export, request all three scopes:
```json theme={null}
{
"scopes": [
"presentation:read",
"presentation:edit",
"presentation:export"
]
}
```
Anyone who obtains the generated URL can use its granted capabilities until it expires. Keep the scope set narrow and the lifetime short.
## 2. Create an integration URL
Call the integrate endpoint from your server with your Presenton API key:
```bash theme={null}
curl --request POST \
--url https://api.presenton.ai/api/v3/presentation/integrate \
--header "Authorization: Bearer $PRESENTON_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"presentation": "00000000-0000-0000-0000-000000000000",
"scopes": ["presentation:read"]
}'
```
### Request fields
| Field | Required | Description |
| -------------- | -------- | --------------------------------------------------------------------------------------------------------------------- |
| `presentation` | Yes | UUID of the presentation to embed. The authenticated Presenton account must own it. |
| `scopes` | Yes | One or more allowed capabilities. The list must include `presentation:read`. |
| `expires_at` | No | Future ISO 8601 date and time. Defaults to 24 hours after creation and cannot be more than three days after creation. |
To set a shorter lifetime, calculate a future UTC timestamp when your server makes the request and send it as `expires_at`. The server example in the next section creates a one-hour link.
```json theme={null}
{
"presentation": "00000000-0000-0000-0000-000000000000",
"scopes": ["presentation:read"],
"expires_at": ""
}
```
Presenton returns the token metadata and a ready-to-use URL:
```json theme={null}
{
"token": "",
"frontend_url": "https://presenton.ai/presentation?id=00000000-0000-0000-0000-000000000000&type=smart&token=",
"user": "11111111-1111-1111-1111-111111111111",
"presentation": "00000000-0000-0000-0000-000000000000",
"scopes": ["presentation:read"],
"version": "smart",
"expires_at": ""
}
```
Use `frontend_url` exactly as returned. It already includes the presentation ID, presentation type, and scoped token; you do not need to construct the URL yourself.
## 3. Add a server endpoint
The following Express route creates a one-hour, read-only preview URL. Replace `requireUser` and `userCanViewPresentation` with your application's authentication and authorization checks.
```javascript theme={null}
import express from "express";
const app = express();
app.use(express.json());
app.post(
"/api/presentations/:presentationId/preview",
requireUser,
async (request, response) => {
const { presentationId } = request.params;
if (!(await userCanViewPresentation(request.user, presentationId))) {
return response.sendStatus(403);
}
const expiresAt = new Date(Date.now() + 60 * 60 * 1000).toISOString();
const presentonResponse = await fetch(
"https://api.presenton.ai/api/v3/presentation/integrate",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PRESENTON_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
presentation: presentationId,
scopes: ["presentation:read"],
expires_at: expiresAt,
}),
},
);
if (!presentonResponse.ok) {
return response.status(502).json({
error: "Could not create the presentation preview",
});
}
const integration = await presentonResponse.json();
response.set("Cache-Control", "no-store");
return response.json({
url: integration.frontend_url,
expiresAt: integration.expires_at,
});
},
);
```
Do not return your Presenton API key or place it in a public environment variable. The browser needs only the temporary `frontend_url`.
## 4. Render the iframe
Use the URL returned by your backend as the iframe source.
```html theme={null}
```
```jsx theme={null}
import { useEffect, useState } from "react";
export function PresentationPreview({ presentationId }) {
const [previewUrl, setPreviewUrl] = useState(null);
const [error, setError] = useState(null);
useEffect(() => {
const controller = new AbortController();
async function loadPreview() {
try {
const response = await fetch(
`/api/presentations/${presentationId}/preview`,
{ method: "POST", signal: controller.signal },
);
if (!response.ok) throw new Error("Preview request failed");
const { url } = await response.json();
setPreviewUrl(url);
} catch (previewError) {
if (previewError.name !== "AbortError") setError(previewError);
}
}
loadPreview();
return () => controller.abort();
}, [presentationId]);
if (error) return Could not load the presentation.
;
if (!previewUrl) return Loading presentation…
;
return (
);
}
```
Add responsive sizing in your application stylesheet:
```css theme={null}
.presentation-frame {
display: block;
width: 100%;
aspect-ratio: 16 / 9;
min-height: 420px;
border: 0;
border-radius: 12px;
}
@media (max-width: 640px) {
.presentation-frame {
min-height: 70vh;
}
}
```
Always provide a descriptive `title` for assistive technology. If the presentation is essential content, also provide a visible fallback link or explanation outside the iframe.
## Refresh expired previews
An expired token cannot be extended. Request a new integration URL from your backend and replace the iframe `src`.
A practical pattern is to keep the returned `expiresAt` value in memory and request a replacement shortly before it expires. Do not persist integration URLs in local storage, analytics events, logs, or shared caches.
## Security checklist
* Call the integrate endpoint only from trusted server-side code.
* Authorize the current application user before creating a URL for a presentation.
* Use `presentation:read` alone for preview-only experiences.
* Choose the shortest useful expiry; the maximum is three days.
* Send `Cache-Control: no-store` when your backend returns the URL.
* Treat `frontend_url` as a temporary credential because it contains the token.
* Create a new URL when permissions change instead of reusing an older URL.
## Troubleshooting
| Symptom | Likely cause | Resolution |
| -------------------------------------------------- | --------------------------------------------------- | -------------------------------------------------------------------------- |
| `401 Unauthorized` from the integrate endpoint | Missing or invalid API key | Verify the server-side `Authorization: Bearer ...` header. |
| `403` when creating the URL | The Presenton account does not own the presentation | Use a presentation created by the authenticated account. |
| `422 Validation Error` | Invalid UUID, scope, or request shape | Include `presentation:read` and send a valid presentation UUID. |
| `400` for `expires_at` | Expiry is in the past or more than three days away | Send a future timestamp within the allowed window. |
| Preview loads but editing or export is unavailable | The token lacks the corresponding scope | Create a new URL with `presentation:edit` or `presentation:export`. |
| Preview stops loading later | The integration token expired | Request a fresh URL and replace the iframe source. |
| Browser refuses to frame the page | A self-hosted frontend restricts frame ancestors | Configure the frontend to allow your application origin, then redeploy it. |
Review the complete request and response schema in the API reference.
# Export presentations
Source: https://docs.presenton.ai/user-guide/managing-presentations/export-presentations
Download a reviewed presentation as PPTX or PDF and verify the result.
Use PPTX when recipients need an editable presentation file. Use PDF when fixed visual delivery, printing, or broad viewing compatibility matters more than editability.
Open the presentation from the dashboard. In the editor header, select **Export**, then choose **Export as PDF** or **Export as PPTX**. Export is unavailable while the presentation is still generating. When processing finishes, the file downloads automatically.
Review the presentation before export
Choose PDF or PPTX from the Export menu
## Final export check
Check slide order, text overflow, image crops, chart labels, table cells, and object layers.
Choose **PPTX** for continued editing or **PDF** for a stable viewing copy. Export both when recipients need both workflows.
Inspect every slide in the target application. Font substitution and text wrapping can differ from the browser preview.
Make changes in Presenton, export again, and distribute only the verified file.
## If an export looks different
| Problem | What to check |
| --------------------------------- | -------------------------------------------------------------------------------------------------- |
| Text wraps or overflows | Font availability and substitution in the viewing application |
| Images look incorrectly cropped | Image crop and position in the editor |
| Charts or tables are hard to read | Labels, cell contents, colors, and slide scale |
| An older version downloads | Confirm the latest edit is visible before exporting again |
| Export fails | Wait for generation to finish, retry once, and verify the deployment's export service is available |
Do not treat a successful download as visual validation. Always open the exported file before sharing it.
## Deliver the exported file
Share the verified PPTX or PDF through your organization's approved collaboration or storage service. Apply appropriate access controls and re-export after the final change instead of distributing an older download.
# Find and organize presentations
Source: https://docs.presenton.ai/user-guide/managing-presentations/find-and-organize-presentations
Open, rename, and remove presentations from the dashboard.
The dashboard lists saved presentations under **Decks**. Each card shows the presentation type, first-slide preview, title, creation date, and a three-dot actions menu.
Select a card to open the presentation editor. To rename the presentation, select its title in the editor header, enter the new title, and save the change. The title is also used to create a safe filename during export.
Saved presentation cards in the Decks section
## Presentation card actions
Select the three-dot menu on a presentation card to open its available actions.
Presentation card with preview, title, date, and actions menu
* **Delete** removes the selected presentation after confirmation.
Check the card title and preview before confirming deletion. Export a copy first if the presentation must be retained outside Presenton.
## Open and review a presentation
Select a presentation card to open its slides in the editor. Use the thumbnail rail to review the deck, then select **Export** when it is ready to download.
Presentation opened from the dashboard
## Naming pattern
Use a title that distinguishes purpose and version, for example `Q3 Product Review - Leadership - Final`. Keep draft status in the title only while it is useful, and rename the final deck before export.
## If a presentation is hard to find
* Confirm you are using the same Presenton deployment and account where it was created.
* Look for the title and creation date shown on the card.
* Open likely matches and check the first-slide preview and slide contents.
* Rename important presentations before exporting them.
# Onboarding flow
Source: https://docs.presenton.ai/user-guide/onboarding
Set up Presenton Cloud or open-source Presenton.
## Complete onboarding
Choose **Cloud** to register and open the managed dashboard. Choose **Open-source** to configure your local or self-hosted installation.
1. Register for a Presenton Cloud account.
2. [Log in](https://presenton.ai/auth/login).
3. Choose a mode from the dashboard.
Register or sign in to Presenton Cloud
Your three Cloud workflows
Create a presentation from a prompt or reference files.
[Start with Create new Presentation](/user-guide/create-new-presentation)
Import an existing PPTX and edit it with AI.
[Start with Edit PPTX with AI](/user-guide/cloud/edit-pptx-with-ai)
Test presentation generation and get API request code.
[Start with API Playground](/user-guide/cloud/api-playground)
Generate a deck from a prompt or reference files.
Open-source onboarding configures local access and the providers used by your local or self-hosted Presenton installation. You can optionally connect a Presenton account as the generation provider without using it as the local login.
Create the first administrator account when the setup screen asks for it. Open-source Presenton does not require a Presenton Cloud account.
Create the administrator account
Log in with the administrator account when authentication is enabled.
Sign in to your Presenton installation
Choose where presentation content is generated: Presenton Cloud, ChatGPT, a local model, or an API provider.
Choose ChatGPT, Local, or an API provider
Select **Presenton**, copy the displayed device code, and approve it on the hosted Presenton page. Only the local administrator can manage this installation-wide connection. It is separate from the local account used to sign in to this installation.
Sign in with ChatGPT, then select a supported model.
Sign in with ChatGPT, then select a model
Select a local provider such as Ollama or LM Studio, enter the local URL, then check available models.
Connect Ollama or LM Studio
Select an API provider, enter its API key or endpoint, then validate and load models.
Connect an API provider and load its models
Enable image generation if you want Presenton to create visuals, then choose the provider.
Enable images and select a provider
Enable web search when generated presentations should include current web context, then choose the search provider.
Enable web search and select a provider
Start your first deck from the Generate page. Enter a prompt, choose slide count and language, attach files if needed, then select **Get Started**.
Start from the Generate page
[Text provider settings](/self-hosted/configuration/text-providers) · [Image and search settings](/self-hosted/configuration/images-and-search) · [Create new Presentation](/user-guide/create-new-presentation#open-source)
# Start with Editing
Source: https://docs.presenton.ai/user-guide/presentation-editor
Open a presentation, choose the right editing tool, and export the result.
Use the editor after AI generation or when reopening a saved presentation. The workspace has three parts:
* **Slide rail:** select the slide to edit.
* **Canvas:** review and edit the active slide.
* **Editor rail:** add blocks, text, charts, tables, images, elements, or open AI.
## Watch the editing workflow
This narrated walkthrough shows how to select a slide, edit text and objects on the canvas, add content from the editor rail, use AI for a focused change, and review the result.
## Edit a presentation
Select a thumbnail from the slide rail.
Use the canvas for direct changes, AI for a focused request, or the slide rail to add a slide.
Edit the selected content, then check the result before moving to another element.
Confirm the slide sequence, content, and layout. Select **Export**, then choose **PDF** or **PPTX**.
## Choose the right tool
Add or directly edit blocks, text, images, shapes, tables, and charts.
Describe one focused change for the active slide.
Select a slide or add a new one from the slide rail.
Refine schema behavior, reconstruction, and layout metadata in a saved template.
## Export the result
Export options verified in the editor
Select **Export**, then choose **PDF** or **PPTX**. Open the downloaded file and check text wrapping, image crops, chart labels, table values, and object positions.
# Start With Presenton
Source: https://docs.presenton.ai/user-guide/start-with-presenton
Learn what Presenton is and choose Cloud or open-source setup.
## About Presenton
Presenton helps you create editable presentations from a prompt, reference files, or one of your existing presentations.
## See the complete workflow
Create a presentation from a topic, brief, document, or other supported file.
Keep its layouts and branding, generate new presentations with the template, and edit the content with AI.
Update slide content and design directly or ask the AI Assistant to make changes.
Export the finished presentation as PPTX or PDF.
## Setup
Use the managed version of Presenton. No installation or AI provider configuration is required.
1. Open [Presenton Cloud](https://presenton.ai/auth/login).
2. Register or log in.
3. Continue to the dashboard.
Register or sign in to Presenton Cloud
Choose one of two ways to run open-source Presenton:
Install Presenton on Windows, macOS, or Linux. Choose this for local use without managing Docker.
OR
Run Presenton in Docker on your computer or server. Choose this for a hosted or shared deployment.
Need detailed instructions? Read [Install the desktop app](/self-hosted/tutorials/install-desktop-app) or [Hosting Presenton](/hosting/overview).
# Template creation
Source: https://docs.presenton.ai/user-guide/template-creation
Turn a PowerPoint design into a reusable presentation template.
Create a template from a filled PowerPoint presentation when you want generated decks to follow an existing design. Each source slide can become a reusable layout.
Use a presentation with representative content instead of an empty slide master. Distinct slide designs help Template Studio identify useful layouts.
## Start with a built-in template
Before creating a custom template, open **Templates** and select the **Built-in** tab. Built-in templates are ready to use and can save time when one already matches the structure and visual style you need.
Each template card shows a slide preview, the number of available layouts, a template name, and a short description. Compare these details to choose a template that fits the intended presentation.
Browse the built-in template library
Create a custom template only when the built-in library does not provide the layouts or brand treatment you need.
## Complete workflow
This short walkthrough shows how to open Template Studio, upload a filled PowerPoint presentation, review the detected fonts and source slides, and turn its layouts into a reusable template.
## Create the template step by step
Open **Templates** and select **Build Template** or **New Template**.
Open the custom template library
Select **Upload PPTX File**, choose the presentation you want to reuse, and wait until its status changes to **Ready**. Select **Get Started** to continue.
PPTX file ready for Template Studio
Template Studio analyzes the fonts used by the presentation. Upload any missing font files shown in the font list so text keeps its intended typography, spacing, and wrapping.
Review detected fonts and upload missing files
Inspect the slide thumbnails and the large preview. Confirm that the presentation contains the layouts you want to reuse, then select **Create Template**.
Preview source slides before creating layouts
Enter a clear template name. Add a description that explains when the design should be used, then select **Create**.
Enter the template name and description
The template appears in the **Custom** library while its layouts are generated. Wait for generation to finish before using it in a presentation.
Template generation progress in the Custom library
## Verify the result
After generation finishes, open the template and review its layouts. Create a short test presentation and check that text remains readable, visual elements are positioned correctly, and the exported PPTX matches the intended design.
A smaller collection of reliable, distinct layouts is more useful than many near-duplicate slides.
Edit text behavior, schema limits, reconstructed slides, and layout metadata after the template is created.
Test the finished template in a short Standard presentation.
# Charts and visual content
Source: https://docs.presenton.ai/user-guide/working-with-content/charts-and-visual-content
Create and edit charts, tables, diagrams, icons, shapes, and visual layouts.
Use the Standard presentation editor to add structured data, visual explanations, and reusable layouts to a slide. Open the relevant tool in the editor rail, choose an element, and refine it on the canvas.
## Edit charts and tables directly
Use a chart when the audience needs to see a pattern or comparison. Use a table when exact values matter. Add and edit both from the Canvas editor.
Watch the complete Canvas workflow for adding a chart and table, then editing their content directly.
Open **Charts**, then choose a chart or infographic that matches the relationship in the data.
Chart and infographic types
After adding a chart, select it on the canvas to edit its data and presentation. Depending on the chart type, you can configure the title, values, category labels, legend, axes, grid, and series colors.
Open **Tables** and select **Simple Table**.
Simple Table in the editor rail
Select a table cell to edit its content. Use the table actions to add or remove rows and columns, or move a column left or right. Verify every label and value against the source data.
### Chart controls
The Standard editor groups its chart choices by purpose:
| Chart family | Types |
| ----------------------------------- | ------------------------------------------------------ |
| Bars and columns | Bar, Horizontal Bar, Stacked Bar, Horizontal Stack Bar |
| Lines and areas | Line, Area |
| Proportions | Pie, Donut, Polar Area |
| Relationships and radial comparison | Scatter, Bubble, Radar |
Use bar charts for category comparison, line or area charts for change over time, pie-like charts for a small number of parts in a whole, and scatter or bubble charts for relationships between measures.
## Build diagrams with icons and shapes
Combine icons, labels, shapes, arrows, and lines when the audience needs to understand a process, hierarchy, or relationship. Keep the reading direction obvious and use one visual meaning for each shape or color.
### Edit and replace icons
Select an icon on the slide to update its color or replace its symbol. Use **Change Icon** to search for a concept, compare matching symbols, choose an icon weight, and apply the replacement.
Follow the Canvas guide to recolor an icon or replace it with a better symbol.
### Add shapes and connectors
Open **Elements** to insert a rectangle, circle, ellipse, triangle, diamond, pentagon, hexagon, arrow, or line. Select the element on the canvas to move, resize, rotate, or restyle it.
Watch the focused Canvas guide for positioning and styling shapes, lines, and connectors.
## Add a reusable visual layout
Open **Blocks** when you need a complete slide section rather than one object. Search the block library, review the available layout variants, and select the layout that matches the content you need to present.
Browse reusable block families, compare layout variants, and add a complete visual section to the active slide.
## Choose the right visual form
| Use | When the audience needs |
| ---------------------- | -------------------------------------------------- |
| **Chart** | A pattern, trend, distribution, or comparison |
| **Table** | Exact values or a structured comparison |
| **Diagram** | A process, hierarchy, sequence, or relationship |
| **Icon** | A compact label or recognizable concept |
| **Shape or connector** | Emphasis, grouping, direction, or a custom diagram |
| **Block layout** | A reusable arrangement of several related elements |
## Review before delivery
* Recalculate source values and derived percentages.
* Confirm that axes do not distort the comparison.
* Include units, dates, category labels, and data source context.
* Check that colors remain distinguishable and text remains legible.
* Confirm that table values, chart categories, series, and source labels still match the source after editing.
* Open the exported PPTX or PDF and inspect labels for clipping.
# Documents
Source: https://docs.presenton.ai/user-guide/working-with-content/documents
Turn reports, briefs, PDFs, presentations, spreadsheets, text, and images into a grounded deck.
Use a document when the presentation must follow existing facts or a known narrative. The most reliable workflow combines a focused source with a short instruction explaining what the audience needs from it.
## Supported source files
The visible source-file list differs between the live Cloud and open-source screens. Always follow the list shown by the product you are using.
The current Cloud Generate screen advertises these extensions:
`.pdf`, `.txt`, `.md`, `.pptx`, `.ppt`, `.docx`, `.doc`, `.csv`, `.xlsx`, `.xls`, `.html`, `.htm`, `.adoc`, and `.asciidoc`.
Attach documents and review supported source formats
The current open-source Generate screen describes the upload area as accepting **Office docs, spreadsheets, images, PDF/TXT**. The exact extensions and processing behavior are controlled by the installed release and deployment configuration.
The current local upload component accepts up to eight supporting files. Remove unrelated or duplicate files before uploading.
Attach office documents, spreadsheets, images, PDFs, or text
## Prepare the source
* Use one authoritative file for the first attempt.
* Remove unrelated appendices, duplicate versions, and hidden spreadsheet sheets.
* Note the names, dates, figures, and conclusions that must remain exact.
* Prefer selectable text. Scanned PDFs and images depend on OCR quality.
* Use clear headings and labels so extracted sections retain their meaning.
## Generate from a document
Cloud and open-source use the same document-to-presentation sequence, with product-specific source lists and provider behavior.
Start a new presentation and open the Generate page.
Select **Attachments (optional)** or drop one or more files accepted by the active product into the upload area. Wait until each filename appears, then choose an explicit output language. You can clear all attachments or remove an individual file before continuing.
A source document ready to process
Add a prompt that names the audience, desired outcome, priority sections, and facts that must be preserved.
Set the remaining controls and select **Get Started**. Presenton uploads and decomposes the files, then requests outline generation. Large or scanned sources can take longer.
Correct omissions, unsupported claims, and sequencing before choosing the presentation design.
Review the generated outline before choosing a design
Review the outline and choose a template
Compare the finished slides with the source, then export and inspect the result.
Open-source document parsing, OCR, supported file behavior, and limits depend on the services configured by the deployment administrator. When files are attached, the current browser flow requires an explicit language instead of **Auto**. Cloud account limits can also change independently of the visible file-extension list.
Verify every important number, date, name, chart, table, and claim against the original file. Document grounding reduces guesswork but does not replace review.
Follow the complete prompt, attachment, outline, and generation workflow.
Choose direct Canvas editing or use the AI assistant after generation.
# Images and media
Source: https://docs.presenton.ai/user-guide/working-with-content/images-and-media
Use uploaded, stock, generated, and editable visuals in presentation slides.
Choose visuals for evidence or explanation. Product screenshots, diagrams, charts, and specific photographs usually communicate more than generic decorative images. Add the visual during generation when it belongs to the story, or replace it later from the editor.
## Add an image layout
Open **Images** in the editor rail, then choose **Image**, **Image + Text**, or **Image Grid**. Select the option that matches the amount of visual content and supporting text the slide needs.
Watch how to add Image, Image + Text, and Image Grid layouts from the editor rail.
## Replace and adjust an image
Enable **Select Edit**, then select the image. Select it again to open **Update Image**. The panel has three tabs:
* **Stock search** or **AI Generate**: search Pexels/Pixabay when a stock provider is configured, or describe an image for the configured image-generation provider. Generated-image history can be available when stock search is not active.
* **Upload**: upload an image, choose it from the uploaded-image library, or delete an uploaded asset. The current editor upload limit is 5 MB per image.
* **Edit**: replace the image and choose **Fill**, **Contain**, or **Stretch**. Use **Focus point** to control which part remains visible when the image is fitted or cropped.
The canvas controls also support direct image positioning and the element-specific crop, zoom, flip, opacity, rounded-corner, and supported-icon color controls.
Follow the canonical Canvas workflow for replacing, cropping, resizing, and positioning an image.
## Recolor or replace an icon
Select an icon to change its color. Choose **Change Icon** when the symbol does not match the intended concept, search for a replacement, compare the available weights, and apply the new icon.
Open the icon walkthrough for recoloring a symbol or choosing a replacement.
## Provider availability
| Product | How image sources are provided |
| ----------- | -------------------------------------------------------------------------------------------------------------- |
| Cloud | Image generation and search are provided by the Cloud configuration shown in the product |
| Open-source | The deployment owner configures the image provider, credentials, URLs, and whether image generation is enabled |
The current self-hosted provider configuration includes stock providers such as Pexels and Pixabay, generated-image providers such as DALL-E 3, GPT Image 1.5, Gemini Flash, and NanoBanana Pro, and configurable options such as ComfyUI, Open WebUI, or a custom OpenAI-compatible image endpoint. Only use providers that are enabled in your product or deployment.
Review provider, credential, endpoint, and image-generation settings for a self-hosted deployment.
## Choose the right visual
| Visual | Best use |
| ------------------- | ------------------------------------------------- |
| Uploaded screenshot | Product state, evidence, or a process step |
| Stock photograph | A real place, person, object, or familiar concept |
| Generated image | A custom scene, illustration, or visual metaphor |
| Icon | A compact label or simple concept |
| Chart | A pattern, comparison, distribution, or trend |
| Table | Exact values or a structured comparison |
Always check relevance, cropping, legibility, source rights, and exported fidelity.
# Upload source files (self-hosted)
Source: https://docs.presenton.ai/api-reference/files/upload-source-files
/openapi/self-hosted.json post /api/v1/ppt/files/upload
Upload supported source files and return identifiers that can be used in self-hosted generation requests.
[Read the files and content guide](/user-guide/api-and-automation/files-and-content).
# Delete image (self-hosted)
Source: https://docs.presenton.ai/api-reference/images/delete-an-uploaded-image
/openapi/self-hosted.json delete /api/v1/ppt/images/{id}
Delete one uploaded image from this Presenton instance.
[Read the files and content guide](/user-guide/api-and-automation/files-and-content).
# Uploaded images (self-hosted)
Source: https://docs.presenton.ai/api-reference/images/list-uploaded-images
/openapi/self-hosted.json get /api/v1/ppt/images/uploaded
List images stored by this Presenton instance.
[Read the files and content guide](/user-guide/api-and-automation/files-and-content).
# Upload image (self-hosted)
Source: https://docs.presenton.ai/api-reference/images/upload-an-image
/openapi/self-hosted.json post /api/v1/ppt/images/upload
Upload an image to this Presenton instance.
[Read the files and content guide](/user-guide/api-and-automation/files-and-content).
# Subscribe webhook (self-hosted)
Source: https://docs.presenton.ai/api-reference/webhook/subscribe-a-webhook
/openapi/self-hosted.json post /api/v1/webhook/subscribe
Subscribe an endpoint to supported events from this Presenton instance.
[Read the async and webhooks guide](/user-guide/api-and-automation/async-and-webhooks).
# Unsubscribe webhook (self-hosted)
Source: https://docs.presenton.ai/api-reference/webhook/unsubscribe-a-webhook
/openapi/self-hosted.json delete /api/v1/webhook/unsubscribe
Remove one webhook subscription from this Presenton instance.
[Read the async and webhooks guide](/user-guide/api-and-automation/async-and-webhooks).
# Presenton Documentation
Source: https://docs.presenton.ai/index
Create, edit, automate, and operate Presenton across Cloud and self-hosted deployments.
Build with Presenton
Editable presentation workflows for prompts, files, templates, and APIs.
Understand Presenton
Start with the product overview, workflow, core concepts, deployment modes, and feature availability.
Create and edit decks
Generate a first draft, refine slides, work with content blocks, and export to PPTX or PDF.
Use reusable templates
Bring existing presentation designs into repeatable templates for consistent, editable output.
Run Presenton yourself
Install Presenton with Docker, configure providers, and explore support for custom enterprise requirements.
Build with the API
Generate, track, edit, and export presentations from your product, automation, or internal workflow.
Troubleshoot and compare versions
Diagnose generation, editing, export, hosting, and integration issues, or open a frozen documentation snapshot.
# Account and access problems
Source: https://docs.presenton.ai/troubleshooting/account-and-access
Fix sign-in problems and find presentations that appear to be missing.
## I cannot sign in
1. Confirm that you are opening the correct Presenton Cloud or self-hosted address.
2. Enter the username or email for that account again instead of relying on an old saved browser value.
3. Check Caps Lock and remove accidental spaces before or after the password.
4. Try a private browser window to rule out an expired session or browser extension problem.
5. If you still cannot sign in, contact your workspace or Presenton administrator to verify the account and reset access.
A Presenton API key beginning with `sk-presenton-` cannot be used to sign in to the browser. It authenticates REST API and MCP requests only.
## My presentations or templates are missing
* Confirm that you signed in with the same account and opened the same Presenton deployment you used before.
* Check whether you are viewing Presenton Cloud, a local installation, or a different self-hosted server. Their workspaces are separate.
* Ask your administrator whether your account was changed, removed, or recreated. Content belongs to the account that created it.
* If only one presentation is missing, check whether it was duplicated, renamed, or deleted from another browser session.
## I was signed out while working
Sign in again, reopen the presentation, and check the latest saved state before repeating any edits. If sign-outs continue across browsers, record the time they happen and ask your administrator to check session or authentication changes.
## If you administer self-hosted Presenton
* Confirm that the user is opening the correct server and that the account still exists under **Admin → Users**.
* Use the documented reset or recovery flow instead of editing authentication data in `/app_data` manually.
* Credential override and authentication recovery can invalidate existing browser sessions and API keys.
* If all users appear new or all content is missing, confirm the container mounts the original persistent directory at `/app_data`.
See [Authentication](/self-hosted/configuration/authentication) for user management, credential rotation, and administrator recovery.
# API and integration problems
Source: https://docs.presenton.ai/troubleshooting/api-and-integrations
Fix authentication, asynchronous tasks, webhooks, and MCP connections.
This page is for developers and administrators. If you create and edit presentations in the browser, start from the main [Troubleshooting guide](/troubleshooting).
## Cloud integrations
* Confirm the request uses the documented Cloud v3 base URL, method, path, content type, and a valid bearer token.
* Do not send self-hosted v1 payloads or authentication keys to Cloud endpoints.
* Record the sanitized request shape, HTTP status, response body, request identifier, and time of the failure.
* Treat asynchronous intermediate states as non-final, preserve the task identifier, and poll until it reaches a documented final state.
* Make webhook processing idempotent, deduplicate repeated deliveries, and return a successful response promptly after accepting an event.
## Self-hosted integrations
* Confirm the request uses the v1 endpoints exposed by the installed release rather than Cloud v3 paths.
* Confirm the request sends an active `sk-presenton-...` API key as a bearer token without logging or exposing it.
* Generate a replacement key after administrator credential recovery, rotation, or suspected exposure.
* Confirm the MCP client can reach the Presenton host from its network environment; MCP is unavailable in the desktop app.
* Check application logs for route, authentication, validation, provider, rendering, and background-task failures.
* Retry with a minimal payload, then add files, templates, webhooks, and optional fields one at a time.
# Files, content, and image problems
Source: https://docs.presenton.ai/troubleshooting/content-and-media
Fix uploads, missing source content, unreadable files, and incorrect or missing images.
## A file will not upload
1. Open the file on your computer to confirm it is not damaged.
2. Remove password protection or encryption before uploading it.
3. Save older Office files in a current format, such as `.docx`, `.pptx`, or `.xlsx`.
4. Rename the file with a short, simple filename and try again.
5. If the file is large, create a smaller copy containing only the pages or sheets you need.
Try a small file of the same type. If the small file works, the original file's size, protection, or contents are likely the cause.
## Important source content is missing
* Use a text-based PDF when possible. Scanned pages may need clearer scans or OCR before upload.
* Give documents clear headings and give spreadsheet columns consistent labels.
* Check that tables, chart labels, and numerical values are readable at normal zoom.
* Mention the facts or sections that matter most in your prompt.
* Compare the generated outline with the source before creating slides, then add any missing topics to the outline.
## Images are missing, irrelevant, or low quality
* Describe the subject and visual style more specifically in the prompt.
* Replace an unsuitable image in the editor instead of regenerating the entire presentation.
* Confirm that an uploaded image opens normally and has enough resolution for the intended slide size.
* If every generated presentation lacks images, ask your Presenton administrator to check the configured image or search provider.
## If you manage a self-hosted instance
* Confirm the upload and persistent-data directories are writable and have sufficient free space.
* Check document-processing logs for parser, OCR, unsupported-format, file-size, memory, or timeout errors.
* Verify image and search provider credentials and connectivity independently from the text provider.
* For services running on the host, use a hostname and port reachable from the container rather than container `localhost`.
Never share a confidential source document just to reproduce a problem. Create a small sanitized file with the same format and structure instead.
# Editing and export problems
Source: https://docs.presenton.ai/troubleshooting/editing-and-export
Recover missing edits and fix AI editing, PPTX, PDF, font, and layout problems.
## My latest changes are missing
1. Stop editing and refresh the presentation to check its latest saved state.
2. Confirm that you opened the correct presentation and account.
3. If the presentation is shared or duplicated, make sure you are editing the intended copy.
4. Duplicate the recovered presentation before making more changes if you are unsure which state is current.
## An AI edit changes too much or targets the wrong item
* Select the slide or object you want to change before opening the assistant.
* Ask for one specific change at a time.
* Identify what must remain unchanged, such as the slide layout, wording, colors, or other objects.
* Undo an unwanted result before sending a more precise instruction.
For example: `On slide 4, shorten the selected paragraph to three bullets. Keep the figures, title, and layout unchanged.`
## Export does not finish
* Wait for any active generation or editing task to complete.
* Refresh the presentation, then try the export once more.
* Test a short presentation in the same format. If it exports, duplicate the affected presentation and remove groups of slides to identify the problematic slide.
* Try the other export format to determine whether the problem affects PPTX, PDF, or both.
## The exported file looks different
* Open the file in the application your audience will use. PowerPoint, browser previews, and PDF viewers can render the same file differently.
* Check for text overflow, cropped images, substituted fonts, chart labels, table widths, and objects outside slide boundaries before export.
* Replace unavailable custom fonts with common fonts, or ask the workspace administrator whether the required fonts are installed.
* Compare the exported result with Presenton's editor preview and note the slide numbers where they differ.
## If you manage a self-hosted instance
* Confirm `/app_data` is writable and has enough free disk space.
* Check application and rendering logs when AI edits or exports fail.
* Verify the export runtime can reach its internal render page and required assets.
* Check available memory and confirm custom fonts are available to the renderer.
# Presentation generation problems
Source: https://docs.presenton.ai/troubleshooting/generation
Fix generation that will not start, takes too long, fails, or produces an unexpected presentation.
## Generation does not start
1. Make sure the prompt explains the presentation topic and that every required option has been selected.
2. Wait for attached files to finish uploading or processing before selecting **Generate**.
3. Refresh Presenton, start a new presentation, and retry with a short prompt and a small slide count.
4. If that works, add the original files and settings back one at a time to find what causes the problem.
## Generation takes too long or stops
* Do not repeatedly select **Generate**; this can start duplicate work.
* Try fewer slides and a smaller source file.
* If one file is very large, include only the pages or sheets needed for the presentation.
* Note whether the process stops during file processing, outline creation, slide generation, image selection, or final rendering. This detail helps support locate the failure.
## The presentation was created, but the result is not right
* State the audience, purpose, tone, and desired outcome directly in the prompt.
* Review the outline before generating slides. Correct missing topics, ordering, or emphasis there first.
* Ask for exact facts to be preserved and avoid asking Presenton to infer figures that are not in the source.
* Use a source with clear headings and readable text when the presentation misses important details.
* Regenerate only after changing the prompt, outline, source, or settings; retrying the same input may produce a similar result.
## A file-based presentation fails
Try the same prompt without the file. If it works, open the source file on your computer, confirm it is not password protected, and upload a smaller copy. See [Files, content, and images](/troubleshooting/content-and-media) for format and extraction checks.
## If you manage a self-hosted instance
* Verify the selected text provider URL, model name, credentials, network access, and account quota.
* Confirm the model meets the structured-output and context requirements for the installed Presenton release.
* Check application logs for provider, schema, rate-limit, timeout, rendering, storage, or memory errors.
* Confirm `/app_data` is writable, has sufficient free space, and persists across container restarts.
If generation fails for every user with a small known-good prompt, the problem is likely deployment-wide. If it fails for only one prompt, presentation, or file, preserve a sanitized copy of that input for testing.
# Hosting problems
Source: https://docs.presenton.ai/troubleshooting/hosting
Fix self-hosted installation, startup, persistence, and provider failures.
This page is for administrators of self-hosted Presenton. If you use Presenton Cloud, return to the main [Troubleshooting guide](/troubleshooting).
## Application does not open
Confirm the container is running, the configured host port is free, and traffic is published to container port `80`. Review container logs for startup failures.
## Presentations or settings disappeared
Confirm the replacement container mounts the same persistent host directory to `/app_data`. A container without that mount starts with empty application data.
## Provider cannot connect
* Verify the provider URL, model, and credentials.
* Test the provider outside Presenton when possible.
* Use a hostname reachable from inside the container.
* Confirm the required model is installed and running.
## Authentication callback fails
Confirm all required callback ports are published and reachable from the browser performing authentication. Check that another process is not already using the configured port.
## Before upgrading
Back up `/app_data`, pin the new image tag, review release notes, and test providers, templates, API integrations, editing, and export before replacing production.
# Troubleshooting
Source: https://docs.presenton.ai/troubleshooting/index
Solve common problems while creating, editing, and exporting presentations or using Presenton integrations.
This section is for everyone who uses Presenton. Start with what you can see in the app; you do not need server access or technical logs for the first checks. Separate guidance is included for workspace administrators, self-hosted operators, and API developers when they need it.
## Before you retry
1. Save or duplicate the presentation if you can, especially before testing a different template or removing content.
2. Copy the exact error message and note what you clicked immediately before it appeared.
3. Refresh Presenton, reopen the presentation, and try the action once more.
4. If the problem continues, try a smaller prompt, file, or presentation to see whether it affects one item or everything.
5. Keep passwords, API keys, private documents, and confidential presentation content out of screenshots and support messages.
If you use Presenton Cloud, follow the user checks on each page. Instructions involving Docker, `/app_data`, providers, or logs are only for someone who manages a self-hosted instance.
## Choose what went wrong
Fix generation that will not start, takes too long, fails, or produces an unexpected result.
Fix uploads, missing source content, unreadable files, and image problems.
Recover missing edits and solve AI editing, PPTX, PDF, font, and layout problems.
Check the account, workspace, deployment, and access method you are using.
Diagnose installation, startup, storage, and provider problems as an administrator.
Diagnose authentication, tasks, webhooks, and MCP as a developer.
Collect the right details and report the problem without exposing private information.
# Report an issue or contact support
Source: https://docs.presenton.ai/troubleshooting/support
Collect useful diagnostics and ask for help safely.
If the user checks did not solve the problem, send enough detail for someone else to reproduce it. You do not need server logs when you use Presenton Cloud or do not manage the self-hosted server.
## Include these details
* Whether you use Presenton Cloud, the desktop app, or a self-hosted server
* Your browser or desktop operating system and, if known, the Presenton version
* What you were trying to do and the exact step that failed
* Expected behavior, actual behavior, and whether the same test previously worked
* The exact error text and a screenshot with private information removed
* When it happened and whether it affects one presentation, one file, or everything
* A small, safe example that reproduces the problem, when possible
* For administrators or developers: sanitized logs, HTTP status, request identifier, task state, deployment method, and provider
## Do not include
* API tokens, passwords, cookies, private keys, signed URLs, or authentication headers
* Provider secrets, database credentials, or complete environment files
* Confidential source documents, presentation content, customer data, or internal screenshots
* Personal information, access details, or production logs unrelated to the problem
For product support, email [suraj@presenton.ai](mailto:suraj@presenton.ai). For reproducible Open Source issues, use the [Presenton GitHub repository](https://github.com/presenton/presenton) after removing secrets and private data. Replace sensitive values with placeholders and create a small sanitized source file when reproduction requires an input.
# Presenton Documentation
Source: https://docs.presenton.ai/index
Create, edit, automate, and operate Presenton across Cloud and self-hosted deployments.
Build with Presenton
Editable presentation workflows for prompts, files, templates, and APIs.
Understand Presenton
Start with the product overview, workflow, core concepts, deployment modes, and feature availability.
Create and edit decks
Generate a first draft, refine slides, work with content blocks, and export to PPTX or PDF.
Use reusable templates
Bring existing presentation designs into repeatable templates for consistent, editable output.
Run Presenton yourself
Install Presenton with Docker, configure providers, and explore support for custom enterprise requirements.
Build with the API
Generate, track, edit, and export presentations from your product, automation, or internal workflow.
Troubleshoot and compare versions
Diagnose generation, editing, export, hosting, and integration issues, or open a frozen documentation snapshot.
# Presenton Documentation
Source: https://docs.presenton.ai/index
Create, edit, automate, and operate Presenton across Cloud and self-hosted deployments.
Build with Presenton
Editable presentation workflows for prompts, files, templates, and APIs.
Understand Presenton
Start with the product overview, workflow, core concepts, deployment modes, and feature availability.
Create and edit decks
Generate a first draft, refine slides, work with content blocks, and export to PPTX or PDF.
Use reusable templates
Bring existing presentation designs into repeatable templates for consistent, editable output.
Run Presenton yourself
Install Presenton with Docker, configure providers, and explore support for custom enterprise requirements.
Build with the API
Generate, track, edit, and export presentations from your product, automation, or internal workflow.
Troubleshoot and compare versions
Diagnose generation, editing, export, hosting, and integration issues, or open a frozen documentation snapshot.
# Presenton Documentation
Source: https://docs.presenton.ai/index
Create, edit, automate, and operate Presenton across Cloud and self-hosted deployments.
Build with Presenton
Editable presentation workflows for prompts, files, templates, and APIs.
Understand Presenton
Start with the product overview, workflow, core concepts, deployment modes, and feature availability.
Create and edit decks
Generate a first draft, refine slides, work with content blocks, and export to PPTX or PDF.
Use reusable templates
Bring existing presentation designs into repeatable templates for consistent, editable output.
Run Presenton yourself
Install Presenton with Docker, configure providers, and explore support for custom enterprise requirements.
Build with the API
Generate, track, edit, and export presentations from your product, automation, or internal workflow.
Troubleshoot and compare versions
Diagnose generation, editing, export, hosting, and integration issues, or open a frozen documentation snapshot.
# Presenton Documentation
Source: https://docs.presenton.ai/index
Create, edit, automate, and operate Presenton across Cloud and self-hosted deployments.
Build with Presenton
Editable presentation workflows for prompts, files, templates, and APIs.
Understand Presenton
Start with the product overview, workflow, core concepts, deployment modes, and feature availability.
Create and edit decks
Generate a first draft, refine slides, work with content blocks, and export to PPTX or PDF.
Use reusable templates
Bring existing presentation designs into repeatable templates for consistent, editable output.
Run Presenton yourself
Install Presenton with Docker, configure providers, and explore support for custom enterprise requirements.
Build with the API
Generate, track, edit, and export presentations from your product, automation, or internal workflow.
Troubleshoot and compare versions
Diagnose generation, editing, export, hosting, and integration issues, or open a frozen documentation snapshot.
# Presenton Documentation
Source: https://docs.presenton.ai/index
Create, edit, automate, and operate Presenton across Cloud and self-hosted deployments.
Build with Presenton
Editable presentation workflows for prompts, files, templates, and APIs.
Understand Presenton
Start with the product overview, workflow, core concepts, deployment modes, and feature availability.
Create and edit decks
Generate a first draft, refine slides, work with content blocks, and export to PPTX or PDF.
Use reusable templates
Bring existing presentation designs into repeatable templates for consistent, editable output.
Run Presenton yourself
Install Presenton with Docker, configure providers, and explore support for custom enterprise requirements.
Build with the API
Generate, track, edit, and export presentations from your product, automation, or internal workflow.
Troubleshoot and compare versions
Diagnose generation, editing, export, hosting, and integration issues, or open a frozen documentation snapshot.