Slide decks,
in plain JSON.
OPF is an open, MIT-licensed file format for presentations. Write a deck as JSON, Markdown or YAML, validate it locally, and export PPTX, PDF, SVG or PNG.
Loading slide preview…
First deck in ten minutes
From a brief to a validated deck, PNG previews and a PPTX you open in PowerPoint or Keynote.
Start the tutorialBuild with OPF
Create a deck, validate it and integrate previews or exports.
Developer quickstartSet up an agent
Install skills and local tools to author, validate and export decks.
Agent quickstartOPF 0.31: one compatible set
The packages release separately, so their numbers differ. These six are the set this site installs and tests together; install them at exactly these versions. Verified against the npm registry on 2026-11-02.
| Part | Package | Version | For |
|---|---|---|---|
| Core | @openpresentation/opf | 0.31.0 | Format, validation and layout |
| CLI | @openpresentation/cli | 0.31.0 | Terminal and agent workflows |
| Renderer | @openpresentation/opf-render | 0.31.0 | SVG, PNG and PDF |
| PPTX | @openpresentation/opf-pptx | 0.31.0 | PowerPoint export and import |
| Editor | @openpresentation/opf-editor | 0.31.0 | Embeddable canvas editor |
| Gallery | @openpresentation/gallery | 0.31.0 | Themes, layouts and fonts catalog |
Node 22 or later (every package declares engines.node >=22); this site and the starters are tested on Node 24. The changelog says what changed in each release. Guides, schemas and agent skills are generated from the core release above; skills.json records their exact source and checksums.
Build a slide
Write a message
A title and one sentence are enough for a complete OPF deck.
{
"slides": [{
"title": "Start with a focused pilot",
"text": "Learn what works before scaling."
}]
}Fields and schema reference
Fields
All schemasPresentation
nameTypestringOptionalDisplay 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. Also the built-in variable 'deck.name'.
slidesTypearray<ref:Slide>RequiredOrdered array of slides that make up the presentation.
designTyperef:DesignOptionalOptional 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.
catalogsTyperef:CatalogsOptionalThe catalog records this document embeds, grouped by the catalog they came from: 'default' (the catalog bare ids come from), 'custom' (records the document defines itself) and any number of named catalogs ('acme', referenced as 'acme:<id>'). A saved document embeds every record it references, so it renders the same with no catalog registered. See Catalogs.
Themes
Keep the final slide. Change only the theme. Each theme also has dark and alternate-accent variants, set with design.variant.
Minimal
{
"design": {
"theme": "minimal"
}
}Use your own catalog
Embed records in a named group and reference them as group:id. Applications register external catalogs; the renderer does not fetch them.
Read the catalog guide{
"design": {
"theme": "acme:brand"
},
"catalogs": {
"acme": {
"source": "pkg:@acme/opf-catalog",
"themes": {
"brand": {
"name": "Brand",
"colorScheme": "cool-horizon"
}
}
}
}
}