# Importing slides

You don't have to rebuild your existing decks from scratch. The slide editor imports **PDF** and **PPTX** files and emits a fully-editable V2 SlideDoc — text, images, and positions preserved.

## Where to start

On a brand-new agent's slides page, the **get-started cluster** offers Import as the first option. On an agent with an existing deck, the same Import button lives behind the **Use template** menu in the top toolbar.

{/* TODO(screenshots): /docs-images/slides/get-started.png — get-started cluster on a blank deck */}

Drag a file onto the Import zone or click to browse. Max file size: **50 MB**.

## Supported formats

| Format | Behavior |
|---|---|
| **PDF** | Each page becomes a slide. Text is OCR'd into editable text elements; images are extracted and placed at their original positions. Vector content rasters at high DPI. |
| **PPTX** | Each slide becomes a slide. Text runs preserve fonts, sizes, weights, colors. Images, shapes, and embedded video carry over. Speaker notes carry into [speaker notes](/docs/build/slides/script-and-instructions#speaker-notes). |

Other formats (Keynote `.key`, Google Slides) aren't supported directly. Export those to PDF or PPTX first.

## What happens during import

1. **Upload**

   The file POSTs to `/api/onboarding/upload-presentation`. The server validates the format, virus-scans, and returns a job ID.

2. **Process**

   A background worker parses the deck (PDF: OCR + image extraction; PPTX: schema-faithful conversion). The editor polls the job status every 2 seconds.

3. **Font resolution**

   For PPTX, fonts that aren't in our [curated whitelist](/docs/build/slides/theming#font) get substituted with the closest match. Substitutions are tracked.

4. **Materialize**

   The processed slides become a SlideDoc on your agent. The editor reloads to show them.

A progress indicator shows "Processed N of M slides" during the run. Imports of 50-slide decks typically complete in under 30 seconds.

## Font review

If your PPTX referenced fonts not in our whitelist, the editor surfaces a **Font review banner** above the top toolbar after import:

> *2 fonts were substituted. [Review →]*

Click the banner to open the **Font review modal**, which shows each substitution as a row:

| Requested | Resolved |
|---|---|
| `ProximaNova-Regular` | `Inter` |
| `Avenir Next` | `Avenir` |

You can:

- **Accept all** — confirm the substitutions and dismiss the banner.
- **Override individually** — pick a different font from the curated list for any row.
- **Dismiss** — leave substitutions as-is and ignore the banner. (It won't reappear.)

Font substitutions are stored in `metadata.importedFrom.fontReplacements` so you can re-review later.

## Migrating from legacy Workflow slides

If you started building your agent before the V2 SlideDoc framework shipped, you may have slides in the legacy Workflow format (each "slide" was a Workflow node with a `SlideContentBlock` array). The get-started cluster shows a **"Migrate from Workflow"** option in this case.

Click it and the editor:

1. Pulls all Workflow slides from the agent's draft.
2. Translates each `SlideContentBlock` to a V2 element (text → text, image → image, etc.).
3. Preserves positions where possible (legacy slides used a fixed two-pane layout, so most elements snap to a default grid).
4. Replaces the agent's SlideDoc with the migrated version.

The legacy Workflow slides remain on the agent until you publish — so you can compare and roll back.

## What doesn't import perfectly

A few things to check post-import:

- **Custom fonts** — replaced with whitelist fonts. See font review above.
- **Slide animations** — PPTX entrance/exit animations don't translate. The schema's `enter` field exists but the importer doesn't populate it.
- **SmartArt / charts** — PPTX SmartArt and charts come in as flattened images. They're not editable as native shape groups.
- **Embedded video in PPTX** — extracted and uploaded as a Video element when the source is MP4/WebM. Other codecs become a static image of the first frame.
- **Speaker notes** — preserved into the slide's [speaker notes](/docs/build/slides/script-and-instructions#speaker-notes). The agent script and AI instructions are NOT auto-populated — you'll add those after import.

## Schema reference

After a successful import, the deck's metadata records the source:

```json title="metadata.importedFrom"
{
  "source": "pptx",
  "originalFilename": "sales-deck-q2.pptx",
  "importedAt": "2026-05-08T14:23:11Z",
  "fontReplacements": [
    { "requested": "ProximaNova-Regular", "resolved": "Inter" }
  ],
  "fontReplacementsConfirmed": true
}
```

<ParamsTable params={[
  { name: "source",                     type: "\"pptx\" | \"pdf\" | \"manual\" | \"template\"", required: true,  description: "Where the deck came from." },
  { name: "originalFilename",           type: "string",                                          required: false, description: "The name of the imported file." },
  { name: "importedAt",                 type: "ISO 8601 string",                                 required: false, description: "When the import ran." },
  { name: "fontReplacements",           type: "Array<{ requested, resolved }>",                  required: false, description: "Font substitutions made during import." },
  { name: "fontReplacementsConfirmed",  type: "boolean",                                          required: false, description: "True once the user has accepted/overridden via the font review modal." },
]} />

## Read next

- [Templates](/docs/build/slides/templates) — alternative starting point if you don't have an existing deck
- [Theming](/docs/build/slides/theming) — apply your brand on top of an imported deck
