Local-first presentation studio
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.
A typed presentation runtime for agents who think in stories, not slide coordinates.
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
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.
Change one figure and the model rewrites everything around it. The three things you had already fixed by hand go with it.
Tomorrow’s session has never seen the deck. You re-explain the story, the structure, and the constraints from scratch, every time.
A wall of inlined markup nobody can diff, review, or pick up next quarter. It is an artifact, not a document.
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.
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.
Click an element to select it, double-click text to change it. The slide repaints without reloading, so you never lose your place.
Exact-match, single-occurrence edits against the real source. Ask for one slide and one slide changes; it cannot quietly rewrite the rest.
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.
Click any element to select it, double-click text to edit in place. Edits repaint the slide without reloading, so you keep your place.
Codex, Claude, Gemini, or Kiro, whichever you already have. Pick the model per presentation; each deck resumes its own conversation.
Safe in-project edits can apply automatically. Destructive ones always ask. Anything reaching outside the folder is refused, not prompted.
"Added metric slide". "Agent: tightened the opening". Step back through it, or jump straight to any earlier point.
A self-contained HTML document you choose the location for. It opens anywhere, with no folder of assets to keep beside it.
Loopback only. No account, no cloud service, no telemetry. Your agent runs locally under your own provider credentials.
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.
# 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.
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.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.
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.
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.
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.