Slides live as a portable JSON file (deck.json) inside a Minerva project. Humans drag, type, and style in a WYSIWYG canvas. Claude Code, running in the same folder, edits the same file.
- [2026-05-19] Initial release of Minerva! Try it out and let us know any issues or feature requests. Open issues and we will fix them asap.
Clone the repo, then pick whichever flow fits how you work. The first run installs dependencies and builds (~30s); after that, ./minerva is instant.
git clone https://github.com/arijitray1993/minerva.git my-slides
cd my-slidesclaude> Run `./minerva` in the background, then read MINERVA.md and follow it.
Claude starts the server, opens the editor in your browser.
./minerva
# in another terminal:
claudeEither way, the cloned dir now contains your deck alongside the editor source:
deck.json slide content (live-reloaded on edit)
assets/ images (drop files here or paste/upload in the UI)
comments.json feedback you leave for Claude from the editor
MINERVA.md the rules Claude follows when editing this deck
.minerva/ per-slide PNG previews + the server's port breadcrumb
packages/ editor source — off-limits to Claude
The editor URL prints to the terminal — by default http://localhost:5174, but Minerva auto-walks forward (5175, 5176, …) if that port is taken, so you can run multiple decks side-by-side without conflict.
Each deck is its own cloned folder. Clone again into a different directory:
git clone https://github.com/arijitray1993/minerva.git deck-research
git clone https://github.com/arijitray1993/minerva.git deck-talk
cd deck-research && ./minerva & # picks 5174
cd ../deck-talk && ./minerva & # picks 5175 (5174 is busy)Both servers know their own port via .minerva/server.json, so Claude's ./minerva render slide-1 always talks to the right one. No --port juggling.
- A real WYSIWYG editor. 30 shapes, rich text (font, size, color, bold/italic/underline/strike, super/sub, highlight, alignment), tables, images via drag-drop / paste / upload, drop shadows, corner radius, opacity, layer ordering, group/ungroup, zoom + pan, undo/redo, format painter.
- Claude as a competent collaborator. Right-click any element → "Leave Claude comment…" to scope a request. Claude reads
comments.jsonon session start, editsdeck.json, renders the slide to PNG, looks at the PNG, and iterates against the actual rendered output — not a hallucinated HTML preview. - One file is the whole deck.
deck.jsonis portable. Diff it, commit it, copy it between machines. No database, no SaaS account, no lock-in. - PDF export that looks like the canvas. Playwright drives the same
/printroute to produce a faithful, slide-only PDF.
Right click to leave a comment for claude
Simply select elements and right click to leave a comment for claude to work on.
Use template skills
- CVPR 2026 Poster skill: Simply ask Claude to look at
templates/CVPR26_POSTER_SKILL.md.
More coming soon...
Quick shortcuts
- Select multiple items: Cmd/Ctrl + click and drag a marquee, or Shift + click to add/remove from the current selection.
- Move canvas: Hold Space, then click-and-drag anywhere.
- Zoom in/out: Cmd/Ctrl + scroll wheel zooms toward the cursor. Cmd/Ctrl +
=/-zoom from the center, Cmd/Ctrl +0resets to fit. - Move elements: Drag with the mouse, or select and use arrow keys (1 px; Shift + arrow = 10 px).
- Crop images: Double-click an image to enter crop mode; drag the handles, Esc (or click outside) to exit.
- Edit text inline: Double-click a text element to type/format directly on the canvas.
- Copy / paste: Cmd/Ctrl + C, Cmd/Ctrl + V — duplicates with a small offset. Works across element types.
- Delete: Select + Delete/Backspace.
- Undo / redo: Cmd/Ctrl + Z, Cmd/Ctrl + Shift + Z.
-
Node 18 or newer.
-
A Chromium build, used by PDF export and PNG rendering. Minerva looks for one in this order:
$MINERVA_CHROMIUMenv var- Playwright's cache (
~/.cache/ms-playwright/chromium-*) - System Chrome / Chromium (
/Applications/Google Chrome.app,/usr/bin/google-chrome, etc.)
If none of these resolve, install one with:
npx playwright install chromium
./minerva # start the editor with the deck at the repo root
./minerva start [dir] # explicit deck dir
./minerva render <slide-id|all> # render via the running server (auto-detects port)
./minerva init [dir] # just scaffold deck.json, MINERVA.md, etc.
./minerva --port 5180 # pin to a specific port (fails if busy)
./minerva --no-open # don't open a browser tab
First invocation runs npm install + npm run build:workspaces. After a git pull that touched packages/, re-run npm run build:workspaces to pick up renderer changes.
packages/schema— Zod schema + types fordeck.jsonandcomments.json. The source of truth for the deck format.packages/server— Express + chokidar + ws + Playwright. Watches the deck, serves the UI, exports PDF, renders PNG previews.packages/web— Vite + React + Konva. The WYSIWYG editor.minerva— the shell entrypoint described above.scripts/build-publish.mjs— kept for a future npm publish; not used in the github-install flow.
If you use Minerva in academic work, please cite it. GitHub renders the
machine-readable CITATION.cff at the repo root as a
"Cite this repository" button at the top-right of the project page. For
BibTeX:
@software{ray2026minerva,
author = {Ray, Arijit},
title = {Minerva: a JSON-backed slide editor for human + Claude collaboration},
year = {2026},
url = {https://github.com/arijitray1993/minerva},
license = {MIT}
}Minerva is released under the MIT License — free to use, modify, and redistribute, including in commercial projects. Just keep the copyright notice in copies and substantial derivatives.