Repository navigation
Releases
PinDeck 3.4.0: formatted speaker notes, and the speaker view works
PinDeck is a local editor for HTML slide decks: pin elements on a slide, describe the change, and
Claude Code or OpenAI Codex edits the HTML and CSS.
New
- Speaker notes show their formatting. The Notes field under the slide shows bold, italics, links
and lists.⌘B,⌘Iand⌘Uformat the selection,Enterstarts a new line, and pasted text
comes in plain. Notes with markup the field cannot show safely are still edited as HTML, and nothing
in them is lost on save.
Fixes
- The speaker view works. Present opens the deck on localhost, so reveal.js's speaker view (
S)
shows the notes and the next slide instead of an empty window. - Claude's PinDeck commands are no longer refused. When a deck's
CLAUDE.mdnames the CLI by
another path (such asnode ../pindeck/cli.mjs), Claude runs it by this server's path. A chat that
used an old path is told the right one.
Install
npx pindeck path/to/deck
Requires macOS or Linux, Node 20 or later, and the claude or codex CLI signed in. The full list of
versions is at the end of the README.
PinDeck 3.3.0: fixes from a code audit
PinDeck is a local editor for HTML slide decks: pin elements on a slide, describe the change, and
Claude Code or OpenAI Codex edits the HTML and CSS.
Fixes
- Imported pictures are kept. After a PowerPoint import, refining the slides no longer deletes
pictures the deck still uses when the turn was stopped, failed or only changedtheme.css. Undo
brings removed pictures back. - No more broken characters in long texts. Large notes, tables or SVG with non-ASCII characters
are saved as sent. - Claude reads only what it needs: the deck, its screenshots, attached PDFs and asset roots, as
Codex already did. It also cannot create a.gitfile in the deck folder, which could have made
git run a command.
Install
npx pindeck path/to/deck
Requires macOS or Linux, Node 20 or later, and the claude or codex CLI signed in. The full list of
versions is at the end of the README.
PinDeck 3.2.0
PinDeck is a local editor for HTML slide decks: pin elements on a slide, describe the change, and
Claude Code or OpenAI Codex edits the HTML and CSS.
PinDeck 3
3.2.0 is the first stable release of version 3: everything from the 3.0, 3.1 and 3.2 betas. Compared
with 2.11:
- OpenAI Codex as a second assistant next to Claude Code, with the models and efforts each backend
offers. Each deck keeps its own provider, model and effort. - Several decks on one port: a deck menu above the slide opens the other decks in the folder, each
with its own chat, assistant session and Undo. - Sandboxed deck pages: a deck's script cannot use the API or read other decks.
- Linux is no longer a beta. PinDeck runs there as a headless server, used from a Mac's browser
through an SSH tunnel.
Coming from PinDeck 2
Version 3 keeps its settings and chats in ~/.pindeck-v3, apart from PinDeck 2's ~/.pindeck, and
copies nothing over; see "Models, providers and configuration" in the README for copying them by hand.
PinDeck 2 stays available as npx pindeck@2 /path/to/deck, and in git on the 2.x branch.
Install
npx pindeck path/to/deck
Requires macOS or Linux, Node 20 or later, and the claude or codex CLI signed in. The full list of
versions is at the end of the README.
PinDeck 2.11.0
PinDeck is a local editor for HTML slide decks: pin elements on a slide, describe the change, and
Claude Code edits the HTML and CSS.
What's new in 2.11.0
- Screenshots in the chat: a screenshot sent with a message shows as a small picture of the
slide, pins included, instead of a "📷 screenshot" label. Click it to see it larger; Esc or a click
closes it. - What Claude looked at: when Claude reads one of PinDeck's screenshots, that step in the chat
shows the picture too. - PinDeck keeps the 40 newest screenshots of a deck; an older one says "no longer kept". Chats from
before 2.11 keep their plain label.
Install
npx pindeck path/to/deck
Requires macOS or Linux, Node 20 or later, and the claude CLI signed in. On Linux, see "Running on a
Linux server" in the README for the SSH tunnel. The full list of versions is at the end of the README.
PinDeck 3.2 beta 1: sandboxed deck pages, fixes from review and user tests
The second preview of PinDeck 3.x with several decks on one port. Deck pages now run sandboxed, and it brings fixes from a code review and a round of user tests. It is on npm's beta channel; npx pindeck installs 2.10.0.
What's new since 3.1.0-beta.1
- Security: deck pages run sandboxed, so a deck's own script can no longer use PinDeck's API, read other decks or send messages. The login link's
nextstays on PinDeck. A deck's own script cannot uselocalStorageeither (it throws). - Decks are
.htmlfiles only;.htmdecks open as pages. - On a Mac, Enter in the terminal opens PinDeck in the browser, with a new login link each time.
- Several decks in one folder: a turn no longer records or undoes another deck's files, and deleting a picture keeps a file another deck uses. Subfolder decks are locked for the assistant.
- Settings: each deck keeps its provider, model and effort, and a deck that never chose one keeps the model its conversation started with.
config.jsonis merged, not overwritten, and unusable saved settings are fixed before the first message. - Many tabs on one port; a deck server that stops reconnects;
pindeck loginandcli.mjsfind the right PinDeck; a deck opens in one PinDeck only. - Editing: typing survives another program saving the deck; text that cannot be saved because the deck changed meanwhile, including a new bullet, can be copied; Enter in a bullet leaves no copied ids; the deck menu works at every window width; the model and effort menus work from the keyboard.
- Undo: New chat keeps Undo; undone changes stay marked after a restart; only the latest change offers Undo.
- Screenshots show the pins of their own message; Stop works during a screenshot; failures reach the assistant with Chrome's own reason.
- Robustness: large decks get their ids in linear time; symlinked decks; a deck that is gone while PinDeck runs; Chrome as root; a warning when PinDeck 2 writes to the same state folder; a deck page that cannot start says why, and Send no longer hangs.
- From the code review: locked paths regardless of case (macOS) and
.git/configrestored after each turn; Codex reads PDFs of a deck reached through a symlink; "not signed in" only when Claude says so; betas tested before they are staged; model lists shared between decks; a faster deck list.
Try it
npx pindeck@beta path/to/deck
Or from the v3-beta branch. Requires macOS, or Linux (beta), Node 20 or later, and Claude Code (claude auth login) or Codex (codex login). Then open the login link PinDeck prints. Settings, chats and backups stay in ~/.pindeck-v3, apart from v2.
Known limits
- A deck whose own script uses
localStorageneeds a change to run in PinDeck. - Two named decks in one folder share files such as
theme.css. With both open, Undo refuses to overwrite a file the other deck changed. - Each open deck starts its own headless Chrome when it needs one.
- The Codex integration uses OpenAI's experimental
dynamicToolsapp-server extension, so a future Codex update may need a PinDeck update. - Try the beta on a copy of your deck.
Please report problems as issues and mention "v3 beta".
PinDeck 3.1 beta 1: several decks, screenshots from the chat
The first preview of PinDeck 3.1. It adds a deck menu, so one PinDeck serves several decks on one port, and screenshots you can open from the chat. It is on npm's beta channel; npx pindeck installs 2.10.0.
What's new since 3.0.0-beta.3
- Open another deck from the editor (#9): click the deck's name above the slide to see the
.htmlfiles in the deck's folder and its asset roots, and one folder down. Choose one to open it in the same tab (⌘-click for a new tab). Files PinDeck cannot open are greyed out with the reason. Listing decks changes no file; a deck gets its element ids only when it is first opened.- Each open deck keeps its own chat, assistant session and Undo.
pindecknow starts a small front that holds the port and the login, and runs one deck server per open deck. Over SSH, one tunnel serves every deck. - A deck with no editor open for 30 minutes closes (its Undo history goes, as on a restart) and reopens when chosen again.
- A folder without
index.htmlopens a page listing its decks instead of failing. pindeck login talk.htmlprints a link that opens that deck.
- Each open deck keeps its own chat, assistant session and Undo.
- Open a screenshot from the chat (#10): a screenshot the assistant took shows as a small picture on its chat line; click it to see it large. A screenshot PinDeck no longer keeps says so.
Try it
npx pindeck@beta path/to/deck
Or from the v3-beta branch. Requires macOS, or Linux (beta), Node 20 or later, and Claude Code (claude auth login) or Codex (codex login). Then open the login link PinDeck prints. Settings, chats and backups stay in ~/.pindeck-v3, apart from v2.
Known limits
- Two named decks in one folder share files such as
theme.css. With both open, Undo refuses to overwrite a file the other deck changed, as with two PinDecks today. - Each open deck starts its own headless Chrome when it needs one.
- The Codex integration uses OpenAI's experimental
dynamicToolsapp-server extension, so a future Codex update may need a PinDeck update. - Try the beta on a copy of your deck.
Please report problems as issues and mention "v3 beta".
PinDeck 3.0 beta 3: decks made without reveal.js
The third preview of PinDeck 3. It brings in what 2.10.0 added after its first beta, for both assistants. It is on npm's beta channel; npx pindeck installs 2.10.0.
What's new since beta.2
-
Decks made without reveal.js: a deck with a script of its own, Shower, deck.js or a hand-written deck can be edited once it names its slides and their size in its
<head>:<meta name="pindeck:slides" content="main.deck > section.slide"> <meta name="pindeck:size" content="1440x1080">Selecting, moving, text editing, pins, notes, new, moved and hidden slides, layout checks, screenshots and PDF export then work as for a reveal.js deck. Claude and Codex are both told what the deck's slides are. Contributed by Zeyu Xu (#4); see "Decks made without reveal.js" in the README.
-
Screenshots fill the picture: headless Chrome lays the page out shorter than its window, which left the slide letterboxed in some Chrome versions (#5, reported by Zeyu Xu).
Try it
npx pindeck@beta path/to/deck
Or from the v3-beta branch. Requires macOS, or Linux (beta), Node 20 or later, and Claude Code (claude auth login) or Codex (codex login). Then open the login link PinDeck prints. Settings, chats and backups stay in ~/.pindeck-v3, apart from v2.
Known limits
- The Codex integration uses OpenAI's experimental
dynamicToolsapp-server extension, so a future Codex update may need a PinDeck update. - Decks made without reveal.js have no build steps (
.fragment); whether presenting skips hidden slides is up to the deck's own script. - Try the beta on a copy of your deck.
Please report problems as issues and mention "v3 beta".
PinDeck 2.10.0
PinDeck is a local editor for HTML slide decks: pin elements on a slide, describe the change, and
Claude Code edits the HTML and CSS.
What's new in 2.10.0
- Decks by file name:
pindeck path/to/talk.htmlopens that deck (a folder still opens its
index.html). Several decks can share a folder, each with its own chat and undo history. - Claude on the whole deck: Claude may edit and create the deck's other files (scripts, style
sheets, notes), neverbrand.css,vendor/or other decks in the folder. One Undo takes back
everything a turn changed, created or deleted. - Shared files:
--asset-root <folder>(or"assetRoots"in config.json) lets a deck use files
outside its folder, such as../shared/style.css, in the editor, screenshots and PDF exports.
Symlinks that lead out of the deck are refused. - Shared instructions: the deck's
CLAUDE.mdandAGENTS.mdmay import other files with@path. - Decks made without reveal.js: a deck with its own script (or Shower, deck.js, a hand-written
deck) that names its slides with<meta name="pindeck:slides" content="…">and their size with
<meta name="pindeck:size" content="1440x1080">is edited like a reveal.js deck. Thanks to
Zeyu Xu (#4). Decks of other frameworks without these tags are recognised and refused with their
name, and the message says how to add the tags. - Screenshots fill the picture instead of being letterboxed in some Chrome versions (#5).
- Linux: pictures of PDF pages with Poppler, the PowerPoint import with LibreOffice, and waveforms
of non-WAV audio with ffmpeg, each when installed.
Install
npx pindeck path/to/deck
Requires macOS or Linux, Node 20 or later, and the claude CLI signed in. On Linux, see "Running on a
Linux server" in the README for the SSH tunnel. The full list of versions is at the end of the README.
PinDeck 3.0 beta 2: security fix, Linux, the whole deck
The second preview of PinDeck 3. It has everything from 2.9 and 2.10, including a security fix, so update from beta.1. It is on npm's beta channel; npx pindeck still installs 2.9.
Security
In 3.0.0-beta.1 the editor page contained the server's token, and the deck needed no token, so another user of the same machine could read both. Now PinDeck prints a one-time login link at start (pindeck login prints a new one), the browser keeps the token in an HttpOnly cookie, and no token appears in any page or on a command line.
What's new since beta.1
- Everything from 2.9 and 2.10: Linux as a beta (a headless server used through an SSH tunnel), safe saving, Undo/Redo that refuses to overwrite outside changes, decks with their own file names (
pindeck talk.html),--asset-rootfor shared files,@importsin the deck'sCLAUDE.mdandAGENTS.md, and recognising other slide frameworks. - Both assistants work on the whole deck: Claude and Codex may edit and create other files of the deck, never
brand.css,vendor/,.git/or other decks in the folder. One Undo takes back a whole turn. - Codex creates files with a new
pindeck_writetool and saves through PinDeck's safe saving. It can read asset roots but not write them. - Claude may run only PinDeck's own commands (layout, shot, slides, pdf, pdf-figure), each named separately.
- Fixes:
--provider codexwithout a saved model now picks Codex's default model, also while model lists are still loading. Stopping PinDeck waits for every backend process.
Try it
npx pindeck@beta path/to/deck
Or from the v3-beta branch. Requires macOS, or Linux (beta), Node 20 or later, and Claude Code (claude auth login) or Codex (codex login). Then open the login link PinDeck prints. Settings, chats and backups stay in ~/.pindeck-v3, apart from v2.
Known limits
- The Codex integration uses OpenAI's experimental
dynamicToolsapp-server extension, so a future Codex update may need a PinDeck update. - Try the beta on a copy of your deck.
Please report problems as issues and mention "v3 beta".
PinDeck 2.9.0
PinDeck is a local editor for HTML slide decks (reveal.js): pin elements on a slide, describe the
change, and Claude Code edits the HTML and CSS.
What's new in 2.9.0
- Linux (beta): PinDeck runs on a Linux server where the deck lives, with Claude Code there too,
and you use the editor from your Mac's browser through an SSH tunnel. The tunnel may use another
local port than the server. Screenshots, layout checks and PDF export work when Chrome or Chromium
is installed; features a server cannot provide are switched off, with the reason shown in the editor. - Security fix: the editor page no longer contains the editor's token, and the deck needs it too,
so other users of the same machine can no longer read the editor or the deck. PinDeck prints a
one-time login link at start;pindeck loginprints a new one. After a restart, log in again. - Safer saving: files are saved in one step, never half-written. An edit made on files that changed
meanwhile is refused, and Undo/Redo no longer overwrite changes made outside PinDeck. - Audio and video in Safari: deck files are now sent the way Safari needs to play media, and ogg,
opus, m4a, aac, flac and mov are recognised. - Decks anywhere: Claude gets the right command for PinDeck's layout checks wherever the deck sits,
and the deck'sAGENTS.mdreaches Claude along with itsCLAUDE.md. - Fixes: pictures of PDF pages on macOS have a white page instead of a transparent one, so dark
text no longer disappears on a dark slide; screenshots and PDF exports are no longer now and then
reported as failed;git-setupworks for decks behind symlinks or with spaces in their path.
Install
npx pindeck path/to/deck
Requires macOS or Linux, Node 20 or later, and the claude CLI signed in. On Linux, see "Running on a
Linux server" in the README for the SSH tunnel. The full list of versions is at the end of the README.