> ## Documentation Index
> Fetch the complete documentation index at: https://docs.presenton.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Run the presentation API with Docker

> Start a secured Open Source API and generate an executive business presentation in minutes.

This tutorial starts Presenton with Docker and uses the self-hosted v1 API to create a quarterly operating review for an executive team.

## Before you start

* Install Docker Desktop or Docker Engine.
* Choose a supported text provider and image provider.
* Create an empty `app_data` directory for persistent files.

## 1. Create a protected environment file

Save as `presenton-api.env` and keep it out of source control:

```dotenv theme={null}
AUTH_USERNAME=admin
AUTH_PASSWORD=replace-with-a-long-password
CAN_CHANGE_KEYS=false

LLM=google
GOOGLE_API_KEY=replace-with-your-key
GOOGLE_MODEL=models/gemini-2.0-flash

IMAGE_PROVIDER=gemini_flash
```

You can replace Google with any [supported text provider](/open-source/v0.9.0-beta/configuration/text-providers) and configure images independently.

## 2. Start Presenton

```bash theme={null}
mkdir -p app_data

docker run --detach --name presenton \
  --publish 5001:80 \
  --env-file ./presenton-api.env \
  --volume "./app_data:/app_data" \
  ghcr.io/presenton/presenton:v0.9.0-beta
```

Wait for the application to start:

```bash theme={null}
docker logs --follow presenton
```

Open [http://localhost:5001](http://localhost:5001) and confirm the sign-in page loads.

## 3. Generate an executive operating review

Store credentials in shell variables:

```bash theme={null}
export PRESENTON_URL=http://localhost:5001
export PRESENTON_USERNAME=admin
export PRESENTON_PASSWORD=replace-with-a-long-password
```

Then send a business brief to the API:

```bash theme={null}
curl --request POST \
  --url "$PRESENTON_URL/api/v1/ppt/presentation/generate" \
  --user "$PRESENTON_USERNAME:$PRESENTON_PASSWORD" \
  --header 'Content-Type: application/json' \
  --data '{
    "content": "Create a Q2 operating review for a B2B SaaS leadership team. Revenue reached $8.4M against an $8.0M plan, net revenue retention was 112%, enterprise pipeline coverage is 3.1x, onboarding time improved from 21 to 16 days, and support response time increased from 2.8 to 3.6 hours. The main decisions are whether to accelerate enterprise hiring and how to restore support service levels.",
    "instructions": "Create an executive scorecard, explain drivers, separate facts from recommendations, and finish with decisions and accountable next actions. Preserve every supplied number exactly.",
    "tone": "professional",
    "verbosity": "concise",
    "n_slides": 7,
    "language": "English",
    "template": "general",
    "include_title_slide": true,
    "include_table_of_contents": false,
    "export_as": "pptx"
  }'
```

## 4. Open and review the result

A successful response resembles:

```json theme={null}
{
  "presentation_id": "d3000f96-096c-4768-b67b-e99aed029b57",
  "path": "/app_data/exports/Q2_Operating_Review.pptx",
  "edit_path": "/presentation?id=d3000f96-096c-4768-b67b-e99aed029b57"
}
```

Prepend `PRESENTON_URL` to a relative `edit_path`, then check:

* Every KPI matches the business brief.
* Recommendations are clearly distinguished from reported facts.
* The support-service issue receives appropriate prominence.
* Decisions have owners and timing before the deck is distributed.
* Charts use correct units, periods, and baselines.

## 5. Operate the container

```bash theme={null}
docker stop presenton
docker start presenton
docker logs --tail 100 presenton
```

The mounted `app_data` directory preserves presentations, exports, templates, configuration, and authentication state when the container is replaced.

<CardGroup cols={2}>
  <Card title="Complete API tutorial" icon="brackets-curly" href="/open-source/v0.9.0-beta/tutorials/generate-with-api">
    Add source documents, custom slide Markdown, and production safeguards.
  </Card>

  <Card title="Generate asynchronously" icon="clock-rotate-left" href="/open-source/v0.9.0-beta/guides/async-generation">
    Queue longer generation jobs instead of holding one request open.
  </Card>
</CardGroup>
