{}OPF
DocsSchema referenceEdit on GitHub

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

Source

spec/schemas/opf.schema.json

Field index

FieldTypeReqDefaultDescription
$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.
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

Type: const · Optional · Default:

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

Type: string · Optional · Default:

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

Type: string · Optional · Default:

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

Type: string · Optional · Default:

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

Type: ref:Organization | array<ref:Organization> · Optional · Default:

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

Type: ref:Speaker | array<ref:Speaker> · Optional · Default:

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

Type: string | array<string> · Optional · Default:

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

Type: string | array<string | ref:Audience> · Optional · Default:

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

Type: string | ref:Purpose · Optional · Default:

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

Type: string | ref:Language · Optional · Default:

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

Type: string | ref:Tone · Optional · Default:

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

Type: string | array<string> · Optional · Default:

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

Type: integer · Optional · Default:

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

Type: array<string> · Optional · Default:

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

Type: ref:Design · Optional · Default:

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"
}

narrative

Type: string | ref:Narrative · Optional · Default:

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

Type: array<ref:Slide> · Required · Default:

Ordered array of slides that make up the presentation.

slides.json
{
  "slides": []
}

assets

Type: ref:Assets · Optional · Default:

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

Type: ref:Catalogs · Optional · Default:

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

Type: object · Optional · Default:

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

extensions.json
{
  "extensions": {}
}