OpenPresent
Thesis

Local-first presentation studio

Everyone can generate a deck. Almost nobody can edit one.

Generating the first draft is solved. The second draft is where it falls apart: you want to fix one number on slide seven, you prompt again, and the model hands you a whole new deck with your manual fixes gone. OpenPresent makes the deck a document you and your agent keep editing instead.

Ideas, rendered.

A typed presentation runtime for agents who think in stories, not slide coordinates.

1600×900Stable logical stage
18pxMinimum body text
0Cloud dependencies

One file, edited repeatedly. Nothing is regenerated to change one thing.

# the same deck, across a week
you       double-click the headline, type over it
agent     “tighten slides 4 through 6”  → edits those three
you       undo the second one, keep the rest
tomorrow  reopen — deck and conversation are both still there
Problem

The format was the right call. Treating the deck as output was not.

HTML won for good reasons. PowerPoint is zipped XML driving an opaque layout engine, so a model writes it blind, while HTML is the language models write best and the browser runs everywhere. But a deck that arrives as one generated artifact inherits the same four problems.

Editing means regenerating

Change one figure and the model rewrites everything around it. The three things you had already fixed by hand go with it.

Nothing carries over

Tomorrow’s session has never seen the deck. You re-explain the story, the structure, and the constraints from scratch, every time.

One dead file

A wall of inlined markup nobody can diff, review, or pick up next quarter. It is an artifact, not a document.

Inconsistent by construction

Each regeneration re-rolls the design, so two decks from one team look unrelated — and so does slide fifteen next to slide one.

The result is a deck you cannot revise — only replace.

Loop

Edit it. Don’t regenerate it.

You and the agent work on the same source, at the same time, at whatever granularity the change actually needs — a word, a slide, a section.

You edit directly

Click an element to select it, double-click text to change it. The slide repaints without reloading, so you never lose your place.

The agent edits in place

Exact-match, single-occurrence edits against the real source. Ask for one slide and one slide changes; it cannot quietly rewrite the rest.

Nothing is lost

Every change is a step you can walk back, and each presentation resumes its own agent conversation when you open it again.

Slides take arbitrary React children, so primitives cover the patterns that repeat and plain markup covers everything specific to your story. Both stay editable, because neither gets regenerated.

Studio

A workspace you and your agent share.

Live canvas

Click any element to select it, double-click text to edit in place. Edits repaint the slide without reloading, so you keep your place.

Your agent, your model

Codex, Claude, Gemini, or Kiro, whichever you already have. Pick the model per presentation; each deck resumes its own conversation.

Approvals you control

Safe in-project edits can apply automatically. Destructive ones always ask. Anything reaching outside the folder is refused, not prompted.

History that reads like actions

"Added metric slide". "Agent: tightened the opening". Step back through it, or jump straight to any earlier point.

Export one file

A self-contained HTML document you choose the location for. It opens anywhere, with no folder of assets to keep beside it.

Nothing leaves the machine

Loopback only. No account, no cloud service, no telemetry. Your agent runs locally under your own provider credentials.

Check

A check before it ships.

The model never sees what it made, so a few mistakes survive every draft: a 12px legend, an element off the stage, two things overlapping. The deck gets checked, and each finding goes back to the agent as data rather than through you.

dom.tiny-text warning · slide “opening” · 3 elements Legend labels render at 13px on the logical stage. Fix: raise to at least 18px so the text survives projection.
# check the source, or the running deck
openpresent validate src/deck.tsx
openpresent validate http://127.0.0.1:4173 --min-font-size 18

Text below a readable size, elements off the canvas or overlapping, missing alt text, unreachable controls, malformed structured data.

Agents

Give your agent the studio, not a blank file.

OpenPresent ships an MCP server. Point your agent at it and the server starts Studio locally, opens the workspace, and exposes the authoring loop as tools. Your agent gets a live deck it can read, edit, and check, instead of guessing at HTML it will never see rendered.

// Claude Code, Codex, or any MCP client
{
  "mcpServers": {
    "openpresent": {
      "command": "npx",
      "args": [
        "-y", "@openpresent/mcp",
        "--project", "~/Documents/OpenPresent/q3-review",
        "--open"
      ]
    }
  }
}

Add --create to scaffold an empty folder first. If Studio is already running, the server attaches to it with --attach-url instead of starting a second one.

get_state, get_outline, get_selectionRead the deck, the active slide, and what the author has selected.
apply_editGuarded source edits: exact match, single occurrence, checkpointed.
insert_slide, list_slide_templatesAdd one slide or many, with the imports they need.
validate_deckRun the checks and get findings back as structured data.
capture_slideScreenshot a slide so the model can look at its own work.
undo, redoEvery change is reversible, by the agent or by you.
Skills

Taste, installed alongside the tools.

Tools let an agent change a deck. They do not tell it what a good deck is. OpenPresent ships that as a skill you install into the presentation, so the direction travels with the work instead of living in someone's prompt.

deck-direction
  • Separate supplied facts from assumptions, and never invent a metric.
  • Establish the narrative spine before composing any slide.
  • Choose the visual system first: one accent, one type scale, deliberate density.
  • Reach for the least rigid authoring level the story actually needs.
  • Treat charts and images as evidence, and motion as meaning rather than decoration.
openpresent studio ./my-deck --create --skill deck-direction --open

The skill lands in the presentation as a plain Markdown file your agent reads. Edit it, replace it with your own house style, or drop in additional skills the same way.

Files

A presentation is a document, not a project.

Studio supplies React and the build, so your folder holds only your work. No package.json, no lockfile, no node_modules. Move it, copy it, email it, or put it in version control like anything else you own.

~/Documents/OpenPresent/q3-review/
  index.html
  src/deck.tsx      ← your slides
  src/styles.css

And because it is ordinary React, you are never locked out of your own deck. Edit it by hand whenever the agent is not the fastest path.

Start

Open it and start editing.

That is the whole setup: no account, no API key, no container. The first run creates a presentation and opens it; after that the same command reopens whatever you were last working on. Requires Node.js 20.19 or newer and an agent CLI you have already signed in to.