Status and roadmap
What is built, what is carried through untouched, and what comes next - straight from the plan file.
The plan is thirteen phases. This page is generated from the same file as the repository's plan table, and a sub-phase only turns green here once its architecture decision record exists. There are no dates: the plan names phases, not quarters.
What is drawn today
Shapes, groups, pictures, fills, gradients, patterns, strokes, effects, and text with bullets, fields, autofit and vertical runs. A hundred-slide deck at any zoom, entirely in the tab.
Preserved, not drawn
Tables, charts, SmartArt, OLE objects, ink, 3-D models, video, audio, animations and macros are carried through an export byte for byte and shown as frames. Tables and SmartArt are phase 4; charts are phases 9 and 10.
How to read this
This site is rebuilt after a release and installs the packages from npm, so it can sit one release behind the repository. The version pill in the footer says which versions it was built against.
43 of 111 sub-phases recorded, 4 of 13 gates closed. A sub-phase is done when it has an architecture decision record, because that is when the working agreement says the record gets written.
Phase 0 - Foundation and ground truth8/8
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 0.1 | Repo skeleton | done | ADR 0001 |
| 0.2 | `opc`: ZIP reader and safety | done | ADR 0002 |
| 0.3 | `opc`: parts, content types, relationships, writer | done | ADR 0003 |
| 0.4 | `xml`: tokenizer and XNode | done | ADR 0004 |
| 0.5 | `xml`: serializer and the round-trip gate | done | ADR 0005 |
| 0.6 | `xml`: order, MCE, invertible edits | done | ADR 0006 |
| 0.7 | Ground-truth experiments A, B and C | done | ADR 0007 |
| 0.8 | `cli inspect`, Worker shell, benchmark | done | ADR 0008 |
| Gate | Drop a deck, get a live explorer of its internals | done | ADR 0008 |
Phase 1 - Byte-perfect round trip6/6
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 1.1 | Corpus, with a CI-enforced licence field | done | ADR 0009 |
| 1.2 | `validate`: the 29-rule repair firewall | done | ADR 0010 |
| 1.3 | `writer`: dirty-part export and media GC | done | ADR 0011 |
| 1.4 | `cli roundtrip` | done | ADR 0012 |
| 1.5 | `cli bisect` and the PowerPoint loop | done | ADR 0013 |
| 1.6 | CI gate and badge | done | ADR 0014 |
| Gate | A deck out of a browser and into PowerPoint with no repair prompt | done | ADR 0015 |
Phase 2 - Geometry and paint14/14
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 2.1 | Preset codegen, all 187 shapes | done | ADR 0016 |
| 2.2 | Formula evaluator | done | ADR 0017 |
| 2.3 | Arc math | done | ADR 0018 |
| 2.4 | Path emit and `custGeom` unification | done | ADR 0019 |
| 2.5 | Adjust handles | done | ADR 0020 |
| 2.6 | Colour | done | ADR 0021 |
| 2.7 | Gradients and patterns | done | ADR 0022 |
| 2.8 | Lines and effects | done | ADR 0023 |
| 2.9 | Model: parse and resolve | done | ADR 0024 |
| 2.10 | Renderers, geometry only | done | ADR 0025 |
| 2.11 | Debug overlay and 187-preset gallery | done | ADR 0026 |
| 2.12 | Image fills (`a:blipFill`) | done | ADR 0036 |
| 2.13 | Picture shapes (`p:pic`) | done | ADR 0037 |
| 2.14 | Gate 2's side-by-side, and the corpus gaps it found | done | ADR 0038 |
| Gate | A real deck rendered silent: fills, strokes, effects, nested rotated groups | done | ADR 0038 |
Phase 3 - Text engine, viewer, fidelity scoreboard12/12
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 3.1 | Text parse and the 10-source cascade | done | ADR 0027 |
| 3.2 | Measurement and the line model | done | ADR 0028 |
| 3.3 | Line breaking | done | ADR 0029 |
| 3.4 | Autofit, view and edit modes | done | ADR 0030 |
| 3.5 | Bullets, fields, script runs | done | ADR 0031 |
| 3.6 | Anchors, insets, vertical text | done | ADR 0040 |
| 3.7 | Font substitution and the guard | done | ADR 0033 |
| 3.8 | Text in both renderers | done | ADR 0034 |
| 3.9 | Fidelity harness | done | ADR 0041 |
| 3.10 | First npm release: `render-svg` and `cli render` | done | ADR 0053 |
| 3.11 | Gate 3's hundred slides, and what zoom does to them | done | ADR 0054 |
| 3.12 | The public website, from npm, on GitHub Pages | done | ADR 0055 |
| Gate | A 100-slide deck rendered faithfully at any zoom, entirely client-side | done | ADR 0054 |
Phase 4 - Tables and SmartArt3/6
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 4.1 | Table parse: grid, spans, merges | done | ADR 0056 |
| 4.2 | The 74 built-in table styles, re-derived from PowerPoint | done | ADR 0063 |
| 4.3 | The 13-layer table cascade | done | ADR 0064 |
| 4.4 | Table render and cell editing | not started | From 4.3 (ADR 0064): the corpus is at 16.0 of its 16 MiB cap, so 4.4's rendering fixtures need a decision on the cap; and a vertical 4-pt double line covers its sixth pixel 0.375 where a horizontal one covers 0.5, which the rasteriser has to answer. |
| 4.5 | SmartArt fallback resolution | not started | |
| 4.6 | SmartArt render, read-only | not started | |
| Gate | Banded tables with merges edit cell by cell; SmartArt renders with real content | not started |
Phase 5 - Select and move0/8
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 5.1 | Command bus and history | not started | |
| 5.2 | Selection and hit-test | not started | |
| 5.3 | Resize and rotate | not started | |
| 5.4 | Snapping and the overlay canvas | not started | |
| 5.5 | Preview/Commit gesture | not started | |
| 5.6 | Slide operations | not started | |
| 5.7 | React shell and inspector v1 | not started | |
| 5.8 | Export verification after every gesture class | not started | |
| Gate | Drag, resize, rotate, recolour, reorder - and export still opens clean | not started |
Phase 6 - Type0/5
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 6.1 | ProseMirror schema and lossless converters | not started | |
| 6.2 | A single lazy EditorView | not started | |
| 6.3 | IME | not started | |
| 6.4 | Live autofit | not started | |
| 6.5 | Inspector provenance | not started | |
| Gate | Click a placeholder once and type; one undo for the whole burst | not started |
Phase 7 - Layout-aware0/11
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 7.1 | Matcher hardening, the 121-case matrix | not started | |
| 7.2 | Change-layout plan, pure | not started | |
| 7.3 | Preview UI | not started | |
| 7.4 | Change-layout apply | not started | |
| 7.5 | Reset | not started | |
| 7.6 | Theme verb: Colors | not started | |
| 7.7 | Theme verb: Fonts | not started | |
| 7.8 | Theme verb: Design, the master swap | not started | |
| 7.9 | Backgrounds | not started | |
| 7.10 | Theme-ification | not started | |
| 7.11 | Adapt layouts | not started | |
| Gate | Switch layout from a picker that said in advance what would happen | not started |
Phase 8 - Fonts, end to end0/9
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 8.1 | SFNT reader | not started | |
| 8.2 | EOT reader | not started | |
| 8.3 | EOT writer | not started | |
| 8.4 | Rights gate on `fsType` | not started | |
| 8.5 | WOFF and WOFF2 decode | not started | |
| 8.6 | FontFace registry | not started | |
| 8.7 | The six-artifact export | not started | |
| 8.8 | `fonts-metric-compat` and the font panel | not started | |
| 8.9 | Clean-machine verification | not started | |
| Gate | Custom fonts survive into exported PowerPoint on a machine that never had them | not started |
Phase 9 - Charts, core0/8
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 9.1 | Chart parse and colour resolution | not started | |
| 9.2 | Axes and scales | not started | |
| 9.3 | Bar and column | not started | |
| 9.4 | Line and area | not started | |
| 9.5 | Pie and doughnut | not started | |
| 9.6 | Scatter, bubble, radar | not started | |
| 9.7 | Legends, labels, titles | not started | |
| 9.8 | Combo charts | not started | |
| Gate | Charts render recognizably; export leaves every chart part byte-identical | not started |
Phase 10 - ChartEx, 3-D, and the remaining content types0/11
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 10.1 | ChartEx data model | not started | |
| 10.2 | Waterfall, funnel, Pareto | not started | |
| 10.3 | Treemap, sunburst | not started | |
| 10.4 | Histogram, box-whisker, region map | not started | |
| 10.5 | 3-D chart variants | not started | |
| 10.6 | EMF and WMF | not started | |
| 10.7 | SVG, TIFF, animated GIF | not started | |
| 10.8 | Media | not started | |
| 10.9 | OLE | not started | |
| 10.10 | Ink and 3-D models | not started | |
| 10.11 | Kitchen-sink verification | not started | |
| Gate | Nothing on a real slide is a blank rectangle | not started |
Phase 11 - Theme and template assets0/6
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 11.1 | Palette generator in OKLCH | not started | |
| 11.2 | Contrast validation, WCAG and APCA | not started | |
| 11.3 | Font pairing sets | not started | |
| 11.4 | Master authoring pipeline | not started | |
| 11.5 | Three to five original CC0 masters | not started | |
| 11.6 | Design gallery UI | not started | |
| Gate | Pick a palette and watch a real deck restyle live | not started |
Phase 12 - 1.00/7
| # | Sub-phase | Status | Record |
|---|---|---|---|
| 12.1 | Slide virtualization | not started | |
| 12.2 | Image cache | not started | |
| 12.3 | Accessibility | not started | |
| 12.4 | Accessibility check panel | not started | |
| 12.5 | Fuzzing | not started | |
| 12.6 | Docs site | not started | 3.12 built the site - docs, a demo of every package, the playground, the deploy from npm; what is still owed here is the pages for phases 4 to 11 as each lands, and Gate 12's numbers: 200 slides, first paint under 3 s, a published fidelity score |
| 12.7 | Release | not started | |
| Gate | A public demo: 200 slides, first paint under 3s, published fidelity score | not started |
Carried debt
Open across sub-phases, and owned by none of them.
`packages/validate` carries none of the rules the text phase identified
Four text sub-phases each identified rules that belong in the repair firewall and none were added: `p:kinsoku/@lang`, three `bodyPr` rules, `@panose` shape, and `@u`/`@strike` simple types. 4.1 added the two table rules; these are still owed.
Raised in ADR 0029, ADR 0032, ADR 0033, ADR 0034.
vite is held at 8.2.2
With vite 8.3.1, vitest 5.0.2's own `vitest:mocks:interceptor` plugin warns that its `configureServer` hook will be ignored. The catalog holds vite at 8.2.2 until a vitest release is clean on 8.3; Dependabot proposes each newer vite, and #62 was declined on this ground.
Raised in ADR 0060.