Skip to content

Known limitations

These are documented, accepted trade-offs — not bugs waiting to be fixed. Each stems directly from a deliberate scope decision (see Architecture).

Limitation Why
Merge is a planning tool with a scope-limited real export The beta .pptx export carries over text/tables/background/notes/transitions, but drops images/charts/SmartArt/media — only a content hash was ever kept for those. A full lossless OOXML round-trip writer is out of scope. See Three-way merge.
Transition preview is a simplified crossfade Not a literal PowerPoint transition engine — clearly labeled as such in the UI. See Rendering fidelity.
Master/layout thumbnails are schematic, not pixel-perfect The renderer library (@aiden0z/pptx-renderer) renders slides, not raw layout/master parts, so these fall back to dashed placeholder rectangles.
"Shareable link" is a data: URL, not a hosted short link There's no backend server to host a real short link on — see Architecture.
Notion and Confluence live push usually fail from a static page Neither service exposes a browser-origin-enabled write API; both are caught gracefully with a fallback pointer to the working file-based export. Slack is the one live-push integration reasonably likely to succeed client-side. See Exports & live push.
Chart/SmartArt/media parts may render as "Schematic," not "Rendered" A graceful fallback for parts the renderer library can't fully parse — expected behavior, not a parsing failure.
Review state is local to one browser localStorage-backed, not a shared/synced database. Use the JSON report export/import round-trip to hand a review session to someone else.
Diff engine coverage isn't exhaustive Theme-color (schemeClr) resolution covers only the common slots (tx1/dk1/tx2/dk2/bg1/lt1/accent1) — other scheme colors fall back to the shape's literal color instead of resolving through the theme. Table-cell-formatting diffs cap at 20 shown differences (+N more). Animation diffs compare a single effect-sequence signature — they detect that something changed, not exact timing/motion-path parameters. No diffing for OLE objects, 3D models, or ink/drawing annotations. See Diff engine.
Deck-alignment thresholds are fixed, not user-configurable The LCS match threshold (0.18) and move-detection threshold (0.55) were tuned against this project's own sample deck, not validated against a real large deck with many near-duplicate template slides. See Deck-level comparison.
Batch filename-similarity pairing uses an untuned threshold The bigram Dice-coefficient cutoff (0.3) for filename-based pairing hasn't been validated against real-world messy filename patterns, and isn't user-adjustable. See Batch mode.
On-disk sample fixtures don't cover everything the in-browser sample does docs/assets/sample_*.pptx (generated by pptxgenjs) don't exercise SmartArt/diagrams, slide transitions, embedded fonts, or real video/audio media — pptxgenjs has no API surface for any of these. The in-browser "Reset to sample" deck still covers all four, for its own narrower purpose (feeding this app's own parser/renderer, never downloaded as a real file).
English-only UI, no full accessibility audit aria-labels exist on the highest-value icon-only controls and toasts are screen-reader-friendly, but there's no localization and no full keyboard-navigation/focus-ring audit.
The npm CLI opens a browser tab, not a native app window No dock/taskbar icon, no standalone app process — bin/cli.js is a static file server, not an Electron/Tauri wrapper. See CLI reference.
Offline vendoring has two known gaps pdfjs-dist (an optional peer dependency of the rendering library, used only for embedded-PDF-object rendering) isn't vendored — this was never functional even before the app went offline-capable. The vendored Spectral font ships only its latin subset (matching the English-only UI); non-Latin text falls back to the browser's default font. See Architecture.
PPTXDIFF_LITE_MODE is all 5 dependencies at once No way to mix vendored and CDN sourcing per-dependency (e.g. vendored React with CDN pptx-renderer) without hand-editing the source. See CLI reference.
The headless CLI/API aren't published, and batch/report/merge aren't built yet pptxdiff-cli/@pptxdiff/server are source-only (file: dependencies on their monorepo siblings) — install from a checkout, not npm install. diff/checksum/git integration (textconv/difftool/install-git-integration) ship; batch/report/merge and server authentication for a non-loopback bind are designed but not built. Every invocation currently pays a real headless-browser boot cost (no native, browser-free engine yet). See Headless CLI & Web API.
textconv only extracts shape/placeholder text and speaker notes Table cell text, chart data labels, and SmartArt text aren't included — narrower than the app's own GUI diff engine, which does cover those. A git diff on a .pptx won't show a change that's only inside a table cell or chart data point.
install-git-integration only writes a repo-local .gitattributes, never a global one --global sets the git config driver definition machine-wide, but the *.pptx diff=pptxdiff association itself still needs a per-repo .gitattributes (or manually configuring core.attributesFile yourself) — there's no fully zero-per-repo-setup mode yet.
The Homebrew formula isn't in a real tap yet brew install pptxdiff doesn't work — only brew install --formula <path-or-URL> does, until a dedicated sugatoray/homebrew-pptxdiff tap repo and a cross-repo CI credential are created (both deliberate manual steps, not automated). A CI workflow already keeps the formula's version pin current and, once the tap exists, will push it there automatically. See Homebrew formula.
The Homebrew formula hasn't been verified against real brew locally brew refuses to run as root, and running it as an unprivileged user in this project's development sandbox hits a blocked host needed for Homebrew's own Ruby runtime — a genuine environment wall, not a formula defect. A CI job runs real brew audit/brew install/brew test on a macOS GitHub Actions runner instead; check its logs the first time it fires.

Headless CLI/API Notes

@pptxdiff/cli and @pptxdiff/server are source-only packages today. CLI diff/checksum, Git integration (textconv/difftool/ install-git-integration), Web API diff/checksum/health, and API discovery (/openapi.json//docs) ship; batch, non-JSON report outputs, merge, non-loopback server authentication, and browser-free @pptxdiff/core engine extraction are still future work.

@pptxdiff/server serves /openapi.json locally, but /docs loads Swagger UI assets from a CDN. The interactive docs page therefore needs network access unless those assets are vendored or replaced by a local renderer later.

Not currently accepting contributions

The project is not open to external contributions at this time. Bug reports and feature requests are still welcome via GitHub issues.