A fast, mobile-first, single-file PowerPoint viewer. Drag & drop a .pptx
and read the deck slide by slide in your browser — text laid out where the
author put it, with images inline. It's a viewer, not an editor — no
accounts, no uploads. Everything runs locally in your browser.
🔗 Live: https://pptx-viewer.us/
Part of the File Viewer family — HTML, Markdown, ePUB, PDF, Data, DOCX, Sheets, EML, and PPTX each have their own dedicated viewer. Use the ☰ menu in the header to jump between them.
- 🖼️ Slide-by-slide — each slide renders at its real aspect ratio with text boxes and pictures positioned where the deck placed them (EMU coordinates mapped into the slide), so layout is preserved, not just content.
- 🔤 Formatted text — font size, bold/italic, color, and paragraph alignment from the slide are honored; text scales with the slide via container queries.
- 🏞️ Images inline — embedded pictures are decoded locally to
data:URLs. - 🧭 Legacy notice — the old binary
.ppthas no reliable in-browser renderer, so it gets a clear "Save As → .pptx" note. - ☰ Family menu · 🫥 auto-hiding header · 🎨 pick any background color.
- 🪶 One file, no build —
index.htmlis self-contained and works offline, even fromfile://. - 📊 Privacy-friendly analytics — self-hosted, cookieless Plausible; your decks never leave your device.
Rendered: .pptx .pptm .ppsx .ppsm .potx .potm
Accepted with a notice (older binary format): .ppt
Just open it. Download index.html, double-click it — no
server, no build, no internet needed.
python3 -m http.server 8080 # then open http://localhost:8080Connect the repo (Workers & Pages → Create → Pages → Connect to Git),
framework preset None, build command blank, output directory /. The
_headers file applies a strict CSP automatically. Add the custom
domain pptx-viewer.us under the project's Custom domains tab.
Everything is in index.html: a small OOXML reader (written for
this project) walks ppt/presentation.xml for slide order and size, then each
ppt/slides/slideN.xml for shapes — text runs and pictures with their
a:xfrm offset/extent — and lays them out as absolutely-positioned boxes scaled
to the slide. JSZip is inlined to unzip the
.pptx package (a .pptx is a ZIP of XML parts). Images inline as data:
URLs, so the viewer's CSP stays strict (default-src 'none', no external
assets).
Note: this is a viewer — it shows content + layout. It is not a pixel-perfect PowerPoint engine: theme fonts fall back to a system sans-serif, and advanced features (transitions, animations, SmartArt, charts, embedded media, master-slide backgrounds) are simplified or omitted.
| Component | Version | License |
|---|---|---|
| JSZip | 3.10.1 | MIT |
| pako (bundled in JSZip) | 1.0.x | MIT |
JetBrains Mono (subset, fonts/) |
— | SIL OFL-1.1 |
The OOXML slide reader is original to this project. The file-type icon is from vscode-icons (MIT). Analytics by Plausible.
MIT © 2026 Michal Ferber, aka TechGuyWithABeard. Bundled
components retain their own licenses — see LICENSE and
Credits.