{}OPF
DocsSchema referenceView source

Presentation

Open-source JSON format for describing PowerPoint presentations. Agents describe narratives, content, audience, reusable assets, and design — the engine handles OOXML complexity. Fields that reference catalog…

Schema $id
https://openpresentation.org/schema/opf/v1
Type
object
Source
spec/schemas/opf.schema.json
Fields
21 · 1 required

Field index

FieldTypeReq.DefaultDescription
$schemaconstOptional OPF schema version. When omitted, validators and engines should assume the latest supported OPF schema.
namestringDisplay name of the presentation for GUI/TUI lists, library/search indexing, OS-level metadata, and default export filenames. This is deck identity, not slide content. Use slides[].title and slides[].subtitle for text that should appear on presented slides.
descriptionstringFree-form prose describing what this presentation is about. Used by agents and humans as a deck-level summary; complements purpose (the goal) and narrative (the structured storyline). Round-trips to OOXML 'docProps/core.xml' as '<dc:description>' (PowerPoint surfaces this as the…
filenamestringOptional base filename for exports (without extension). Engine strips a trailing .pptx, .pdf, .png, or .svg (case-insensitive) and appends the target format's extension. When omitted, the engine slugifies name when present. See /docs/opf for full validation rules.
organizationref:Organization | array<ref:Organization>Organization associated with the presentation, usually the presenting company. Array form supports hosts, partners, clients, and sponsors. The primary organization (declared via Organization.role or, if no role is set, the first item) drives default branding such as cover-slide…
speakerref:Speaker | array<ref:Speaker>Person presenting the deck. Array form supports panels and multi-speaker decks. Used for cover slides, bio slides, footers, and panel attribution.
authorstring | array<string>Optional credit for the person who authored or contributed to the deck, distinct from speaker. Array form supports multiple contributors. Round-trips to OOXML 'docProps/core.xml' as '<dc:creator>' (semicolon-joined when multiple) and seeds '<cp:lastModifiedBy>' on first write; s…
audiencestring | array<string | ref:Audience>Intended audiences for the presentation. Accepts either: - A single string shorthand: free-form description ('Series B investors'), an audiences catalog id ('executives'), an HTTPS URL, or a 'pkg:' reference. - An array of string shorthands and/or inline Audience objects for cus…
purposestring | ref:PurposePrimary goal of the presentation. Accepts either: - A string shorthand: free-form goal ('Raise a Series B round of $30M'), a purposes catalog id ('decide', 'align'), an HTTPS URL, or a 'pkg:' reference. - An inline Purpose object for custom purpose metadata or catalog-backed ove…
languagestring | ref:LanguageLanguage for the presentation content. Accepts either: - A string shorthand: a BCP-47 language tag ('en-US', 'en-GB', 'ja-JP', 'fr'), a languages catalog id ('english', 'japanese'), an HTTPS URL, or a 'pkg:' reference. - An inline Language object for custom language metadata or…
tonestring | ref:ToneDesired tone for the presentation. Accepts either: - A string shorthand: a tones catalog id ('formal'), an HTTPS URL, or a 'pkg:' reference. - An inline Tone object for custom tone metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-…
takeawaystring | array<string>Audience-facing takeaway the presentation should leave behind. Array form supports multiple takeaways. Deck-level intent used by AI to seed and pressure-test slide content.
durationintegerTarget presentation duration, as an integer number of minutes. Used by AI to set pace and depth, and to compare against the resolved narrative's durationRange.
tagsarray<string>Free-form labels used for categorization, search, and filtering. Lowercase kebab-case is recommended for consistency across a deck library.
designref:DesignOptional design system covering theme, color scheme, font scheme, dimensions, background, logo, watermark, header, and footer applied to the deck. When omitted, engines use their default design configuration.
variablesref:VariablesOptional named color variables for values the deck uses in more than one place or wants to name for intent (e.g. a risk red, a brand highlight). Content color fields reference entries as 'var:<id>' strings. Variables complement the color scheme: scheme slots and roles stay the p…
narrativestring | ref:NarrativeStructured storyline describing the deck's arc and beats. Resolves to the 'id' of a 'narratives' catalog record. Accepts two forms: - String shorthand for the common case: 'narrative = "classic-story"'. Accepts a bare id (lowercase kebab-case), an HTTPS URL pointing at a record…
slidesarray<ref:Slide>yesOrdered array of slides that make up the presentation.
assetsref:AssetsOptional reusable asset registry for images, data files, videos, documents, fonts, and other resources referenced elsewhere in the deck via 'asset:<id>' strings.
catalogsref:CatalogsOptional per-kind catalog overrides. Each kind may declare a non-default 'source' and/or inline 'records' that override or supplement the default catalog at https://www.pptx.gallery/<kind>. References elsewhere in the document (e.g. design.theme, narrative) resolve through this…
extensionsobjectCustom data passthrough for agent workflows; ignored by the engine but preserved across read/write round-trips.

$schema

typeconstrequirednodefault

Optional OPF schema version. When omitted, validators and engines should assume the latest supported OPF schema.

$schema.json
{
  "$schema": "https://openpresentation.org/schema/opf/v1"
}

name

typestringrequirednodefault

Display name of the presentation for GUI/TUI lists, library/search indexing, OS-level metadata, and default export filenames. This is deck identity, not slide content. Use slides[].title and slides[].subtitle for text that should appear on presented slides.

name.json
{
  "name": "Q4 2026 Business Review"
}

description

typestringrequirednodefault

Free-form prose describing what this presentation is about. Used by agents and humans as a deck-level summary; complements purpose (the goal) and narrative (the structured storyline). Round-trips to OOXML 'docProps/core.xml' as '<dc:description>' (PowerPoint surfaces this as the…

description.json
{
  "description": "Quarterly business review covering revenue, product, and hiring milestones for the executive team."
}

filename

typestringrequirednodefault

Optional base filename for exports (without extension). Engine strips a trailing .pptx, .pdf, .png, or .svg (case-insensitive) and appends the target format's extension. When omitted, the engine slugifies name when present. See /docs/opf for full validation rules.

filename.json
{
  "filename": "q4-2026-business-review"
}

organization

typeref:Organization | array<ref:Organization>requirednodefault

Organization associated with the presentation, usually the presenting company. Array form supports hosts, partners, clients, and sponsors. The primary organization (declared via Organization.role or, if no role is set, the first item) drives default branding such as cover-slide…

organization.json
{
  "organization": "organization-value"
}

speaker

typeref:Speaker | array<ref:Speaker>requirednodefault

Person presenting the deck. Array form supports panels and multi-speaker decks. Used for cover slides, bio slides, footers, and panel attribution.

speaker.json
{
  "speaker": "speaker-value"
}

author

typestring | array<string>requirednodefault

Optional credit for the person who authored or contributed to the deck, distinct from speaker. Array form supports multiple contributors. Round-trips to OOXML 'docProps/core.xml' as '<dc:creator>' (semicolon-joined when multiple) and seeds '<cp:lastModifiedBy>' on first write; s…

author.json
{
  "author": "Bob Lee"
}

audience

typestring | array<string | ref:Audience>requirednodefault

Intended audiences for the presentation. Accepts either: - A single string shorthand: free-form description ('Series B investors'), an audiences catalog id ('executives'), an HTTPS URL, or a 'pkg:' reference. - An array of string shorthands and/or inline Audience objects for cus…

audience.json
{
  "audience": "executives"
}

purpose

typestring | ref:Purposerequirednodefault

Primary goal of the presentation. Accepts either: - A string shorthand: free-form goal ('Raise a Series B round of $30M'), a purposes catalog id ('decide', 'align'), an HTTPS URL, or a 'pkg:' reference. - An inline Purpose object for custom purpose metadata or catalog-backed ove…

purpose.json
{
  "purpose": "Raise a Series B round of $30M"
}

language

typestring | ref:Languagerequirednodefault

Language for the presentation content. Accepts either: - A string shorthand: a BCP-47 language tag ('en-US', 'en-GB', 'ja-JP', 'fr'), a languages catalog id ('english', 'japanese'), an HTTPS URL, or a 'pkg:' reference. - An inline Language object for custom language metadata or…

language.json
{
  "language": "en-US"
}

tone

typestring | ref:Tonerequirednodefault

Desired tone for the presentation. Accepts either: - A string shorthand: a tones catalog id ('formal'), an HTTPS URL, or a 'pkg:' reference. - An inline Tone object for custom tone metadata or catalog-backed overrides. Object form mirrors https://openpresentation.org/schema/opf-…

tone.json
{
  "tone": "formal"
}

takeaway

typestring | array<string>requirednodefault

Audience-facing takeaway the presentation should leave behind. Array form supports multiple takeaways. Deck-level intent used by AI to seed and pressure-test slide content.

takeaway.json
{
  "takeaway": "Agent latency is the new bottleneck for AI products."
}

duration

typeintegerrequirednodefault

Target presentation duration, as an integer number of minutes. Used by AI to set pace and depth, and to compare against the resolved narrative's durationRange.

duration.json
{
  "duration": 1
}

tags

typearray<string>requirednodefault

Free-form labels used for categorization, search, and filtering. Lowercase kebab-case is recommended for consistency across a deck library.

tags.json
{
  "tags": [
    "qbr",
    "internal",
    "fy26-q4"
  ]
}

design

typeref:Designrequirednodefault

Optional design system covering theme, color scheme, font scheme, dimensions, background, logo, watermark, header, and footer applied to the deck. When omitted, engines use their default design configuration.

design.json
{
  "design": "design-value"
}

variables

typeref:Variablesrequirednodefault

Optional named color variables for values the deck uses in more than one place or wants to name for intent (e.g. a risk red, a brand highlight). Content color fields reference entries as 'var:<id>' strings. Variables complement the color scheme: scheme slots and roles stay the p…

variables.json
{
  "variables": "variables-value"
}

narrative

typestring | ref:Narrativerequirednodefault

Structured storyline describing the deck's arc and beats. Resolves to the 'id' of a 'narratives' catalog record. Accepts two forms: - String shorthand for the common case: 'narrative = "classic-story"'. Accepts a bare id (lowercase kebab-case), an HTTPS URL pointing at a record…

narrative.json
{
  "narrative": "classic-story"
}

slides

typearray<ref:Slide>requiredyesdefault

Ordered array of slides that make up the presentation.

slides.json
{
  "slides": []
}

assets

typeref:Assetsrequirednodefault

Optional reusable asset registry for images, data files, videos, documents, fonts, and other resources referenced elsewhere in the deck via 'asset:<id>' strings.

assets.json
{
  "assets": "assets-value"
}

catalogs

typeref:Catalogsrequirednodefault

Optional per-kind catalog overrides. Each kind may declare a non-default 'source' and/or inline 'records' that override or supplement the default catalog at https://www.pptx.gallery/<kind>. References elsewhere in the document (e.g. design.theme, narrative) resolve through this…

catalogs.json
{
  "catalogs": "catalogs-value"
}

extensions

typeobjectrequirednodefault

Custom data passthrough for agent workflows; ignored by the engine but preserved across read/write round-trips.

extensions.json
{
  "extensions": {}
}