# 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.

Cloud

Managed API · v3

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.
Four labeled steps showing a prompt sent to the Presenton API, generated, and returned as an editable presentation

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.
Five labeled steps showing source files uploaded, saved as file values, and used to generate a grounded presentation

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.
A labeled decision diagram comparing Standard mode reusable layouts with Smart mode adaptive composition

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.
Five labeled steps showing a filled PPTX imported in Template Studio, saved as a template, and used through the 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.
Six labeled steps showing template selection, schema inspection, slide JSON construction, validation, and rendering

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.
Six labeled steps showing template contracts and source content sent to an AI agent, validated, and rendered by Presenton

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.
A labeled async workflow showing task creation followed by polling or webhook delivery and a completed presentation

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.
Five labeled steps showing direct presentation generation on a self-hosted Presenton instance

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
Five labeled steps showing source files uploaded to an instance and their returned paths used for generation

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.
Five labeled steps showing an installed template name added to an Open Source generation request

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.
Five labeled steps showing a PPTX imported on a self-hosted instance, saved as an installed template, and used for generation

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
A labeled self-hosted async workflow showing task creation, polling or webhook delivery, and a completed presentation

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 Diagram showing a brief and evidence combining into generation input, then producing a focused outline ## 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. Diagram showing input ready, outline ready, generating, ready, editing, exported, and failed states ## 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. Diagram showing direction and sources, outline review, slide generation, editing, and PPTX or PDF 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. Diagram showing Presenton moving from Draft to Edit to Export, with PPTX and PDF outputs ## 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. Diagram showing the current deck, source material, outline, and user request feeding editing context, which produces a proposed update 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. Diagram showing a presentation made from an outline, template, slides, layouts, and editable elements ## 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. Pexels home page with the account menu open and the Log in option visible Log in with your email or one of the available sign-in providers. Pexels login page with email and password fields and sign-in options After signing in, open the account menu again and select **Image & Video API**. Pexels account page with the account menu open and the Image and Video API option highlighted On the Pexels API page, click **Your API Key**. Pexels API page with the Your API Key button visible On the **Your API Key** page, use the copy button to copy the key. Pexels Your API Key page showing the API key field and a copy icon ## 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. Pixabay home page with the Log in button visible in the top-right corner After signing in, click on **Explore** and open the site navigation menu and select **API**. Pixabay navigation menu open with the API link visible in the About column On the Pixabay Developer API page, click **View API documentation**. Pixabay Developer API page with the View API documentation button visible In the documentation page, scroll down to the API reference section, then look for the **Search Images** endpoint and the required `key` parameter. Pixabay API documentation scrolled to the Search Images reference showing the required key parameter and API key value 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

Close-up of Template Studio font analysis showing detected fonts and a missing font upload control
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

Close-up of Template Studio Font Management with an upload action for a missing font
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

Complete workflow for converting a PowerPoint presentation into a reusable template with Template Studio
## 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

Close-up of Template Studio with an uploaded PowerPoint presentation ready for processing
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

Close-up of API Playground using Presentation Content with 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

Close-up of API Playground using Slide Specific Content with separate content blocks 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

Close-up of the API Playground slide-count menu for a Presentation Content request
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

Close-up of API Playground Generation Settings with the tone menu open
Choose an instruction preset or write custom instructions for the presentation.

Add a preset or custom instruction

Close-up of the API Playground Instruction tab with custom presentation instructions
Choose whether to include Markdown emphasis, a table of contents, a title slide, and user information.

Choose the optional presentation sections

Close-up of the API Playground Included tab with 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

Complete API Playground workflow from configuration to Generate and Get Code
# 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

Uploading a PPTX from the Presenton Import Presentation page
After the file uploads, click **Check Fonts**.

Check the fonts used in the uploaded presentation

Uploaded PPTX with the Check Fonts button
Review **Available Fonts** and **Missing Fonts**. If a font is missing, click **Upload** and select its font file.

Review available and missing fonts

Font Management showing available fonts and one missing font

Select the matching font file when a font is missing

File picker selecting the missing Arial Regular font file
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

Close-up of Font Management confirming the uploaded font and showing Import Presentation
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

Imported PowerPoint presentation open in the Presenton Editor with Select Edit and AI Assistant
# 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.

Open the Cloud generator

Close-up of the Presenton Cloud generator with prompt, attachments, controls, and Get Started
Choose **Standard** for template-based layouts or **Smart** for content-driven composition.

Switch between Standard and Smart

Selecting Standard and Smart presentation modes
Choose **Auto slides** or a fixed count, then select the output language.

Choose Auto slides or a fixed slide count

Close-up of the Cloud slide-count control and fixed slide options

Select the presentation language

Close-up of the Cloud output-language menu
Describe the presentation you want. Attach reference files when Presenton should use specific source material.

Describe the presentation you want

Close-up of the Cloud prompt and attachment areas with a presentation topic entered

Attach files beside the prompt

Reference file attached beside the Cloud prompt
Set tone, verbosity, title slide, table of contents, web search, or additional instructions when needed.

Adjust only the settings you need

Close-up of Advanced settings for tone, verbosity, structure, web search, and instructions
Select **Get Started**, review the outline, and choose the design before generating the presentation.

Review the outline before generating slides

Close-up of a generated presentation outline ready for review
After generation, the presentation opens in the editor.

Continue in the Presenton Editor

Generated Cloud presentation open 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.

Open the Generate page

Close-up of the open-source Generate page with Standard mode, prompt, attachments, and Get Started
Keep **Auto slides** or choose a slide count, select the language, and open **Advanced settings** when needed.

Generation controls above the prompt

Open-source controls for Standard mode, slide count, language, and advanced settings

Choose Auto slides or a fixed slide count

Close-up of the open-source slide-count menu with fixed slide options

Select the presentation language

Close-up of the open-source language menu with Auto and supported output languages

Review Advanced settings when needed

Close-up of open-source Advanced Settings with instructions, tone, verbosity, table of contents, and title slide
Enter a prompt, upload reference files, or use both.

Prompt and attached source file ready for generation

Open-source Generate page with the prompt area and an attached PDF source document
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

Close-up of the open-source built-in template gallery

Choose or build your own Custom template

Close-up of the open-source custom template area with Build Template and a saved custom template
[Follow the complete template creation workflow](/user-guide/template-creation)

Review and edit the outline with AI

Open-source outline review with AI editing before generating the presentation
After generation, the presentation opens in the editor.

Continue in the Presenton Editor

Generated open-source presentation open 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

Presenton Generate page with the presentation mode selector set to Standard

Select Smart for flexible design-based generation

Mode selection dialog comparing fixed Standard layouts with flexible Smart layouts
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

Smart generation page showing built-in designs and Create new design

Create the first custom design from the empty state

Your designs tab with no custom designs and a Create new design button
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

Design Studio upload screen with a Select a PPTX file action
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

Design Studio with an uploaded PPTX and the Check Fonts action

Continue after all required fonts are available

Design Studio Font Management showing all fonts ready and Continue to Preview
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

Design Studio Slide Preview showing the uploaded presentation and Generate Design action
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

Name Your Design dialog with a design name and Generate Design action
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

Design Generation Started dialog showing processing status, request ID, and email notification
## 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

Designs library Default tab with built-in Smart designs

Generated custom design under Your designs

Designs library Your designs tab with a generated custom design and Use action
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

Smart generation page with a custom design selected under Your designs
Presenton analyzes the prompt and sources, optionally performs web search, and builds the presentation outline.

Smart presentation outline generation in progress

Generating outline dialog showing request, analysis, and web-search 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

Outline and Content page with generated slide sections and Generate Presentation
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

Generated Smart presentation open in the Presenton editor with slide thumbnails and AI Assistant
## 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

Presentation editor with the Blocks panel open and reusable block families listed
## 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

Blocks panel showing a metadata search result and 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

Two selected text objects with the Group action available
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

A grouped text composition selected with the Ungroup action available
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

Images panel with Image, Image plus Text, and Image Grid options
## 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

Tables panel with the Simple Table option

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

Charts panel with bar, line, pie, area, donut, scatter, radar, polar area, progress bar, and gauge options

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

Assistant composer showing Slide 1 as the selected scope
## 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

AI assistant panel showing recent prompts, assistant responses, Slide 1, and a selected component chip
## 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.

Slide actions menu

Slide actions menu showing Duplicate Slide, Move Up, Move Down, and Delete Slide above the Blank, Use Template, AI slide, and three-dot controls
| 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

Schema Editor showing Low, Medium, and High content density plus a Main Title string with minimum characters, maximum characters, 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.

Slide actions

Re-Construct and Copy ID controls below the active template slide

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

Deck Layouts panel showing searchable layout names, copy controls, an expanded 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

Template-level actions

Template actions with Copy ID, undo, redo, Delete Template, and Save
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

Presenton dashboard action row with Create new Presentation, Blank Presentation, Edit PPTX with AI, and 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

Presenton Decks section with saved presentation cards, previews, titles, dates, and presentation types
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 (