OPF

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…

Double-click slide content to edit. Ctrl/Cmd+Enter saves; Escape cancels. Changes update the JSON.

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 tutorial

Build with OPF

Create a deck, validate it and integrate previews or exports.

Developer quickstart

Set up an agent

Install skills and local tools to author, validate and export decks.

Agent quickstart

Preview and export

Download the source JSON, rendered SVG or editable PPTX.

Build a live editor

Exports editable PowerPoint. Text reflow has known limits; see what to expect →

example.opf.json1280 × 720
Slide rendered from the downloadable OPF example using the shared renderer
Download JSON SVG PPTXLimits

OPF 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.

PartPackageVersionFor
Core@openpresentation/opf0.31.0Format, validation and layout
CLI@openpresentation/cli0.31.0Terminal and agent workflows
Renderer@openpresentation/opf-render0.31.0SVG, PNG and PDF
PPTX@openpresentation/opf-pptx0.31.0PowerPoint export and import
Editor@openpresentation/opf-editor0.31.0Embeddable canvas editor
Gallery@openpresentation/gallery0.31.0Themes, 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.

Complete first OPF

{
  "slides": [{
    "title": "Start with a focused pilot",
    "text": "Learn what works before scaling."
  }]
}

Pilot slide: write a message.
Fields and schema reference

Fields

All schemas

Presentation

nameType stringOptional

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. Also the built-in variable 'deck.name'.

slidesType array<ref:Slide>Required

Ordered array of slides that make up the presentation.

designType ref:DesignOptional

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.

catalogsType ref:CatalogsOptional

The 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.

Presentation

Themes

Keep the final slide. Change only the theme. Each theme also has dark and alternate-accent variants, set with design.variant.

Minimal

Theme reference (excerpt)
{
  "design": {
    "theme": "minimal"
  }
}
The pilot metric slide with the Minimal theme.
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
Catalog JSON
{
  "design": {
    "theme": "acme:brand"
  },
  "catalogs": {
    "acme": {
      "source": "pkg:@acme/opf-catalog",
      "themes": {
        "brand": {
          "name": "Brand",
          "colorScheme": "cool-horizon"
        }
      }
    }
  }
}

View source record