Casual Slides

PowerPoint, but a web page.

Open a .pptx, edit it like the web, save it back. Office ribbon — Home, Insert, Design, Transitions, Animations, Slide Show, View, Review — and a slide-panel thumbnail strip on the left. No Office binary installed. Active early-stage development; deep pptx fidelity is where we've been investing.

Honest status: the single-user editor at slide.schnsrw.live works end-to-end with pptx round-trip. Co-edit is a Phase-2 spike — naive WebSocket broadcast, not Yjs yet. No tagged release; no Docker image. The production-grade work that Casual Sheets just shipped in v0.2.x is the next milestone here.

Version
v0.0.0 · pre-tag
Fidelity probes
68 / 87 ✓
Latest wave
7o · tables + charts
Layouts
6
License
Apache-2.0
What works today

The Office surface — most of it, rendered honestly.

📂

.pptx open + save

Worker-side parser written in TypeScript on top of JSZip + fast-xml-parser. Export via PptxGenJS. Deep OOXML PresentationML coverage — slides, layouts, masters, themes, theme color resolution, placeholder inheritance, gradients, text outline + arrowheads + effects, hyperlinks via custom ranges, tables + charts as IPageElement.

68 of 87 fidelity probes passing

Tracked in docs/FIDELITY_TRACKER.md as the source of truth. Snapshot post wave 7o (2026-05-26): 68 ✅, 6 ⚠️. Recent waves added theme color resolution (J2), placeholder default text style (I4), multi-run rich text + paragraph alignment (B16 + C2), color modifiers + rotation + flips (5b), bullets + indent + line spacing (C3/C4/C6-8), text outline + arrowheads + effects (B15 + D17 + D18 + D19), tables + charts as IPageElement (Gap 3).

🎨

Office-style ribbon shell

TitleBar, Toolbar with Layout dropdown (6 templates), StatusBar with slide count + zoom, slide-panel thumbnails, Slide Show mode, NotesPanel, ThemePicker, BackgroundPicker, RecentFilesDialog, SlideContextMenu (right-click → duplicate / hide / delete / new), PropertiesDialog, About. The Fluent-UI-flavoured look is loud on purpose — readers familiar with Office should land immediately.

🔌

Fork-and-patch on Univer OSS

Univer Slides doesn't ship collab rev tracking on SlideDataModel or treat element ops as CommandType.MUTATION — both required for the bridge. Patches live in patches/ (via pnpm patch) so production builds get the fix today; same changes land in the univer-revamp fork and head upstream as PRs to dream-num/univer. Same fork-management pattern Casual Sheets uses.

Collab — naive spike, Yjs is next

v0.0.x collab is a Phase-2 spike: 104-line raw ws server, command broadcast, single-active-editor sufficient. Yjs + Hocuspocus migration is queued as the v0.1.0 blocker — same shape Casual Sheets uses today. Until then, this works for one editor at a time per room.

🗂

Layouts · backgrounds · themes

6 layout templates — title slide, title + content, two content, comparison, blank, section header — each materialised as concrete IPageElement placeholders (not OOXML inheritance chains; layout inheritance is import-side only today). Theme picker swaps the slide-master colour palette. Background picker paints solid fills + gradient backgrounds.

What's deliberately deferred

Honest about the gap to v0.1.0.

  • Yjs / Hocuspocus collab. Today's bridge is a 173-line spike that broadcasts commands. Production-grade replay + retry + dead-letter lands with the Phase-2.1 migration; same shape as Casual Sheets v0.2.x.
  • Self-host story. No Docker image; no persistence (no Redis backing); no admin panel; no JWT-secured access. The platform layer Casual Sheets calls "M1" doesn't exist here yet.
  • Mobile lane. Same approach as Sheets — back-port a viewer + light editor at v0.1.0. Today the layout assumes a desktop ribbon viewport.
  • ODP + PDF export. Deferred to a wave 8+. Today it's .pptx only.
  • The remaining 19 fidelity probes. Gap 4 (transitions + animations) and tail-end visual effects (e.g. complex pattern fills, certain gradient stops, chart-XML graphicFrame re-emit for wave 8). Tracked individually in docs/FIDELITY_TRACKER.md.
Stack

Univer OSS + a fork that fills the gaps.

Same architecture as Casual Sheets: Univer OSS supplies the slide canvas + command bus, everything above (the ribbon, the pptx I/O workers, the layout/theme/background pickers, the slide-panel, the eventual collab driver) is in this repo. When OSS Slides falls short, we land the fix in a fork branch + a pnpm patch artifact so production builds get it today; the same diff goes upstream as a PR.

Univer OSS 0.24.x · forked React 18 + Vite + TypeScript strict PptxGenJS · MIT JSZip + fast-xml-parser Tailwind + Fluent UI icons Web Workers for pptx I/O
The roadmap, in one sentence. Fidelity work continues in waves; the next milestone is the Yjs / Hocuspocus migration that unblocks the production-grade hardening Casual Sheets v0.2.x already shipped (per-IP rate limit, room cap, replay retry + dead-letter, load harness). When that's done, slides cuts v0.1.0 alongside the first Docker image and a live demo.