PPTX Studio

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-phases of phase 0
#Sub-phaseStatusRecord
0.1Repo skeletondoneADR 0001
0.2`opc`: ZIP reader and safetydoneADR 0002
0.3`opc`: parts, content types, relationships, writerdoneADR 0003
0.4`xml`: tokenizer and XNodedoneADR 0004
0.5`xml`: serializer and the round-trip gatedoneADR 0005
0.6`xml`: order, MCE, invertible editsdoneADR 0006
0.7Ground-truth experiments A, B and CdoneADR 0007
0.8`cli inspect`, Worker shell, benchmarkdoneADR 0008
GateDrop a deck, get a live explorer of its internalsdoneADR 0008

Phase 1 - Byte-perfect round trip6/6

Sub-phases of phase 1
#Sub-phaseStatusRecord
1.1Corpus, with a CI-enforced licence fielddoneADR 0009
1.2`validate`: the 29-rule repair firewalldoneADR 0010
1.3`writer`: dirty-part export and media GCdoneADR 0011
1.4`cli roundtrip`doneADR 0012
1.5`cli bisect` and the PowerPoint loopdoneADR 0013
1.6CI gate and badgedoneADR 0014
GateA deck out of a browser and into PowerPoint with no repair promptdoneADR 0015

Phase 2 - Geometry and paint14/14

Sub-phases of phase 2
#Sub-phaseStatusRecord
2.1Preset codegen, all 187 shapesdoneADR 0016
2.2Formula evaluatordoneADR 0017
2.3Arc mathdoneADR 0018
2.4Path emit and `custGeom` unificationdoneADR 0019
2.5Adjust handlesdoneADR 0020
2.6ColourdoneADR 0021
2.7Gradients and patternsdoneADR 0022
2.8Lines and effectsdoneADR 0023
2.9Model: parse and resolvedoneADR 0024
2.10Renderers, geometry onlydoneADR 0025
2.11Debug overlay and 187-preset gallerydoneADR 0026
2.12Image fills (`a:blipFill`)doneADR 0036
2.13Picture shapes (`p:pic`)doneADR 0037
2.14Gate 2's side-by-side, and the corpus gaps it founddoneADR 0038
GateA real deck rendered silent: fills, strokes, effects, nested rotated groupsdoneADR 0038

Phase 3 - Text engine, viewer, fidelity scoreboard12/12

Sub-phases of phase 3
#Sub-phaseStatusRecord
3.1Text parse and the 10-source cascadedoneADR 0027
3.2Measurement and the line modeldoneADR 0028
3.3Line breakingdoneADR 0029
3.4Autofit, view and edit modesdoneADR 0030
3.5Bullets, fields, script runsdoneADR 0031
3.6Anchors, insets, vertical textdoneADR 0040
3.7Font substitution and the guarddoneADR 0033
3.8Text in both renderersdoneADR 0034
3.9Fidelity harnessdoneADR 0041
3.10First npm release: `render-svg` and `cli render`doneADR 0053
3.11Gate 3's hundred slides, and what zoom does to themdoneADR 0054
3.12The public website, from npm, on GitHub PagesdoneADR 0055
GateA 100-slide deck rendered faithfully at any zoom, entirely client-sidedoneADR 0054

Phase 4 - Tables and SmartArt3/6

Sub-phases of phase 4
#Sub-phaseStatusRecord
4.1Table parse: grid, spans, mergesdoneADR 0056
4.2The 74 built-in table styles, re-derived from PowerPointdoneADR 0063
4.3The 13-layer table cascadedoneADR 0064
4.4Table render and cell editingnot 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.5SmartArt fallback resolutionnot started
4.6SmartArt render, read-onlynot started
GateBanded tables with merges edit cell by cell; SmartArt renders with real contentnot started

Phase 5 - Select and move0/8

Sub-phases of phase 5
#Sub-phaseStatusRecord
5.1Command bus and historynot started
5.2Selection and hit-testnot started
5.3Resize and rotatenot started
5.4Snapping and the overlay canvasnot started
5.5Preview/Commit gesturenot started
5.6Slide operationsnot started
5.7React shell and inspector v1not started
5.8Export verification after every gesture classnot started
GateDrag, resize, rotate, recolour, reorder - and export still opens cleannot started

Phase 6 - Type0/5

Sub-phases of phase 6
#Sub-phaseStatusRecord
6.1ProseMirror schema and lossless convertersnot started
6.2A single lazy EditorViewnot started
6.3IMEnot started
6.4Live autofitnot started
6.5Inspector provenancenot started
GateClick a placeholder once and type; one undo for the whole burstnot started

Phase 7 - Layout-aware0/11

Sub-phases of phase 7
#Sub-phaseStatusRecord
7.1Matcher hardening, the 121-case matrixnot started
7.2Change-layout plan, purenot started
7.3Preview UInot started
7.4Change-layout applynot started
7.5Resetnot started
7.6Theme verb: Colorsnot started
7.7Theme verb: Fontsnot started
7.8Theme verb: Design, the master swapnot started
7.9Backgroundsnot started
7.10Theme-ificationnot started
7.11Adapt layoutsnot started
GateSwitch layout from a picker that said in advance what would happennot started

Phase 8 - Fonts, end to end0/9

Sub-phases of phase 8
#Sub-phaseStatusRecord
8.1SFNT readernot started
8.2EOT readernot started
8.3EOT writernot started
8.4Rights gate on `fsType`not started
8.5WOFF and WOFF2 decodenot started
8.6FontFace registrynot started
8.7The six-artifact exportnot started
8.8`fonts-metric-compat` and the font panelnot started
8.9Clean-machine verificationnot started
GateCustom fonts survive into exported PowerPoint on a machine that never had themnot started

Phase 9 - Charts, core0/8

Sub-phases of phase 9
#Sub-phaseStatusRecord
9.1Chart parse and colour resolutionnot started
9.2Axes and scalesnot started
9.3Bar and columnnot started
9.4Line and areanot started
9.5Pie and doughnutnot started
9.6Scatter, bubble, radarnot started
9.7Legends, labels, titlesnot started
9.8Combo chartsnot started
GateCharts render recognizably; export leaves every chart part byte-identicalnot started

Phase 10 - ChartEx, 3-D, and the remaining content types0/11

Sub-phases of phase 10
#Sub-phaseStatusRecord
10.1ChartEx data modelnot started
10.2Waterfall, funnel, Paretonot started
10.3Treemap, sunburstnot started
10.4Histogram, box-whisker, region mapnot started
10.53-D chart variantsnot started
10.6EMF and WMFnot started
10.7SVG, TIFF, animated GIFnot started
10.8Medianot started
10.9OLEnot started
10.10Ink and 3-D modelsnot started
10.11Kitchen-sink verificationnot started
GateNothing on a real slide is a blank rectanglenot started

Phase 11 - Theme and template assets0/6

Sub-phases of phase 11
#Sub-phaseStatusRecord
11.1Palette generator in OKLCHnot started
11.2Contrast validation, WCAG and APCAnot started
11.3Font pairing setsnot started
11.4Master authoring pipelinenot started
11.5Three to five original CC0 mastersnot started
11.6Design gallery UInot started
GatePick a palette and watch a real deck restyle livenot started

Phase 12 - 1.00/7

Sub-phases of phase 12
#Sub-phaseStatusRecord
12.1Slide virtualizationnot started
12.2Image cachenot started
12.3Accessibilitynot started
12.4Accessibility check panelnot started
12.5Fuzzingnot started
12.6Docs sitenot 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.7Releasenot started
GateA public demo: 200 slides, first paint under 3s, published fidelity scorenot 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.

On this page