A tool for working with PowerPoint presentations.
It can pull speaker notes out of a .pptx file into a readable text document, apply an edited notes file back onto a deck, and create a copy of the deck with all speaker notes removed.
It is useful when you want to review or edit the talk track separately, share slides without private notes, or quickly check what is inside a presentation without opening PowerPoint.
Make slidenotes available on your PATH:
bun install
bun linkAfter this, run the CLI directly as slidenotes.
Print the slide list, marking slides that have speaker notes:
slidenotes list path/to/input.pptxTotal slides: 4
1: Opening — notes: 8 words
2: Budget — notes: 6 words
3: No title — notes: 9 words
4: Appendix
Notes on 3 of 4 slides.
Export slide titles and speaker notes to a text file:
slidenotes export-notes path/to/input.pptxFor path/to/input.pptx, this writes:
path/to/input-speaker-notes.txt
Apply a notes text file back onto a presentation (the round trip of export-notes):
slidenotes import-notes path/to/input.pptx path/to/notes.txtThe notes file argument is optional and defaults to path/to/input-speaker-notes.txt, so export-notes, edit, import-notes works without extra arguments. For path/to/input.pptx, this writes:
path/to/input-with-notes.pptx
For every Slide #N block in the file, the slide's notes are replaced with the block's text; an empty block clears that slide's notes. Slides not listed in the file are left untouched. Importing works even on decks whose notes parts were fully stripped by remove-notes. One caveat: a notes line that itself starts with Slide #N: is indistinguishable from a slide header, so avoid that pattern in notes text.
Generate a copy of a presentation without speaker notes:
slidenotes remove-notes path/to/input.pptxFor path/to/input.pptx, this writes:
path/to/input-without-notes.pptx
When run in an interactive terminal, slidenotes shows progress while reading slides and exporting notes. Progress is written to stderr so stdout remains usable for scripts.
The exported text file uses one block per slide:
Slide #1: Opening
Welcome everyone.
Here is the plan.
Slide #2: Budget
Mention Q4 numbers.
Pause for questions.
Slide #3: No title
This note belongs to a slide without a title.
Slides without a detected title are exported as No title.
Generate a simple PowerPoint fixture:
bun run generate:fixtureThis writes test/fixture/simple-with-notes.pptx.
Try it with:
slidenotes list ./test/fixture/simple-with-notes.pptx
slidenotes export-notes ./test/fixture/simple-with-notes.pptx
slidenotes import-notes ./test/fixture/simple-with-notes.pptx
slidenotes remove-notes ./test/fixture/simple-with-notes.pptxInstall dependencies:
bun installRun tests:
bun testBuild a standalone executable for your current platform:
bun run buildThe local build writes dist/slidenotes.
Build release binaries for macOS and Windows:
bun run build:releaseThis writes:
dist/slidenotes-macos-arm64dist/slidenotes-macos-x64dist/slidenotes-windows-x64.exe
GitHub releases are created from version tags.
- Update the version in
package.json. - Commit and push the change.
- Create and push a version tag:
git tag v0.1.0
git push origin v0.1.0Pushing the tag runs .github/workflows/release.yml. The workflow runs tests, builds macOS and Windows CLI binaries, packages them, and attaches them to a GitHub Release.
Release artifacts:
slidenotes-macos-arm64.tar.gzfor macOS Apple Siliconslidenotes-macos-x64.tar.gzfor macOS Intelslidenotes-windows-x64.zipfor Windows x64
SlideNotes rewrites .pptx packages, and PowerPoint enforces undocumented constraints that no schema validator catches. docs/powerpoint-compatibility.md records the repair-prompt bugs we hit, their root causes (including a subtle theme-sharing × element-order interaction), and how to debug this class of problem. Read it before changing any code that creates or removes package parts.
src/SlideNotes.js- core PPTX reader, notes exporter/importer, and notes removersrc/notes-master-template.js- known-good notes master XML used when importing into a deck without onesrc/index.js- public exportbin/slidenotes.js- command-line entry pointscripts/generate-test-fixture.js- fixture generatortest/- tests and generated fixture helpers