Jake Jinyong Kim · Last checked 2026-10-20
Keep python-pptx if you work in Python and need to read or update existing .pptx files, and keep PptxGenJS if you generate new decks from JavaScript. Runstamp, for Node.js, renders a deck from a structured document, validates and repairs deck files and converts decks to PDF, and none of its four PPTX operations edits slides in an existing deck.
At a glance
| Tool | License | Latest release | Creates new decks | Existing decks |
|---|---|---|---|---|
| python-pptx 1.0.2 | MIT | 2024-08-07 (PyPI) | Yes | Reads and updates them, per its documentation |
| PptxGenJS 4.0.1 | MIT | 2025-06-26 (npm) | Yes | Its README and docs introduction describe generating decks, not editing them |
| pptx-automizer 0.9.4 | MIT | 2026-09-28 (npm) | Adds new elements through PptxGenJS | README: manipulates existing .pptx files and templates |
| Runstamp SDK 3.1.0 | Apache-2.0 | 2026-09-14 (npm) | Yes, with pptx.render | No PPTX operation edits slides in an existing deck |
Checked 2026-10-20 from PyPI, npm, each project's README and documentation, and the Runstamp docs.
When to keep python-pptx
Keep python-pptx if your code is Python: it is a Python library and requires Python 3.8 or later. Its PyPI summary reads "Create, read, and update PowerPoint 2007+ (.pptx) files.", and its documentation lists "Round-trip any Open XML presentation (.pptx file) including all its elements" under Feature Support. Its Getting Started page shows opening a .pptx file by passing a path to Presentation(), then adding slides, filling placeholders and saving. That makes it the fit when the job is changing a deck you did not generate yourself.
It can also read decks without writing them: the documentation says it can analyze PowerPoint files, for example to extract text and images for search indexing. It runs on macOS and Linux and needs no installed or licensed PowerPoint. The license is MIT. Two cautions from its own pages: the documentation says "there are still features python-pptx does not support", and the latest PyPI release is dated 2024-08-07.
When to keep PptxGenJS
Keep PptxGenJS if you generate decks in JavaScript. Its README says it lets you generate PowerPoint presentations "directly from Node, React, Vite, Electron, or even the browser". It can create text, tables, shapes, images and charts, define custom Slide Masters, convert an HTML table into slides, and export as base64, Blob, Buffer or a Node stream. The README says the OOXML output is compatible with Microsoft PowerPoint, Apple Keynote, LibreOffice Impress and Google Slides (via import), with no PowerPoint install or license required. It is MIT licensed, and the latest npm release is 4.0.1, published 2025-06-26.
If you need to change an existing deck from Node, note that the PptxGenJS README and docs introduction describe generating decks and do not describe opening or editing one. The pptx-automizer README describes a Node.js tool that "automates the manipulation of existing .pptx files": you import .pptx templates, merge them and customize slide content, and it wraps PptxGenJS for elements created from scratch. It is MIT licensed, and its latest npm release is 0.9.4, published 2026-09-28.
What Runstamp does with a deck
Runstamp has four PPTX operations.
pptx.render: "Render a structured document to a native PowerPoint (.pptx) deck."pptx.validate: "Check PowerPoint bytes for structural defects without modifying them."pptx.repair: "Repair structural defects in PowerPoint bytes, reporting every change as a loss."pptx.convert.pdf: "Convert a deck to PDF, reporting every approximation as a loss."
You install it with npm install @runstamp/sdk, which needs Node.js 18.14.1 or later.
The SDK is Apache-2.0 and includes the PPTX, PDF, DOCX and XLSX engines.
The docs' quick start renders a deck with pptx.render and writes result.value.bytes to deck.pptx.
The docs say the same input gives byte-identical PPTX output on hosted renders, and that local operations are deterministic by default.
Runstamp reports losses explicitly.
Its loss ledger records each known deviation from faithful output as substituted, degraded or dropped.
result.ok === true does not mean the result can be released, and with the default policy a successful result can carry a non-empty ledger.
You can set lossPolicy to failOnDropped or failOnAny to turn losses into failures.
The same operations are also available through the CLI, MCP and a managed API, which needs a free-trial, Platform or Enterprise workspace and an API key.
The conformance page lists @runstamp/pptx as passing all 18 contract gates, which it defines as the implementation matching its declared contract.
Where Runstamp stops
None of the four PPTX operations edits slides in an existing deck.
pptx.repair repairs structural defects in PowerPoint bytes and reports every change as a loss, so it is not a way to change slide content.
If you need to change text or shapes on a deck you did not generate, use python-pptx from Python, or look at pptx-automizer from Node.
A structural check is not PowerPoint. A structural validator answers whether the package passes its implemented rules, and PowerPoint answers how one application build behaves when it opens, exports or saves the exact file. The Runstamp docs say to refuse delivery when a target application or renderer was required but not run. Our post on the PowerPoint repair error covers the difference between the two in more detail.
How we checked
On 2026-10-20 we read the PyPI and npm registry entries, the READMEs, the LICENSE files and the documentation pages for python-pptx, PptxGenJS and pptx-automizer, and saved each raw capture. We did not run any of those libraries, and we did not open a generated deck in PowerPoint. Runstamp facts come from the npm registry (version, license, release date) and from the Runstamp docs repository read on the same day, at commit 3cb9413. We did not run the Runstamp operations for this page.
Sources, all fetched 2026-10-20: