Plugins
The first-party content plugins that extend paged beyond native IDML — vectors, web content, raster images, spreadsheets, data, Word, presentations, IDML and PDF — all built on the Plugin SDK.
In short Plugins add new kinds of content to a paged document. The
first-party plugins are built on the same Plugin SDK
contract any third party uses, so they are its worked examples. Each renders into
the document through the engine's scene-layer surfaces and persists into the
.paged container. The engine is MPL-2.0 or PMEL; the plugins are
AGPL-3.0 or PMEL.
- paged.drawIntermediateII· explanationvector drawing (pen, paths, pathfinder, SVG in and out).
- paged.webIntermediateII· explanationHTML and CSS as a content type.
- paged.imageIntermediateII· explanationraster processing and PSD round-trip (Rust/WASM, GPU kernels).
- paged.sheetIntermediateII· explanationa spreadsheet engine with print-grade layout (Rust/WASM, XLSX round-trip).
- paged.dataIntermediateII· explanationdatabase publishing and automation (Rust/WASM, DuckDB).
- paged.docIntermediateII· explanationWord documents in and out.
- paged.slideIntermediateII· explanationPowerPoint decks as native pages.
- paged.publishIntermediateII· explanationIDML import and export, and PDF as an editable document.
Plus plugin-template — the fork-and-go starter.
Plugin capability state
The live status of each plugin's capabilities, from the capability record:
● shipped & verified · ○ shipped, re-test pending · ◍ shipped, untested · ◐ partial · ✗ failing · · planned
Plugin platform 50 features · 78% green
| Feature | Parser | Renderer | Mutation | Canvas | Canvas | Shell | Panel | API | Draw | Web | Image | Sheet |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
Object-model parity matrix (every property x every surface, shrink-only gate)platform.object-model.parity | ◐ | |||||||||||
bindCreated — naming a to-be-minted id so a two-batch flow collapses to one undo (C-15)plugin-platform.bind-created | ● | |||||||||||
Binding providers — a plugin serves the values a HOST panel binds to (ADR 023, B-26)plugin-platform.binding-providers | ◐ | ◍ | ◍ | ◍ | ||||||||
Persistent blob store (host.blob, OPFS-backed, per-plugin quota)plugin-platform.blob-store | ● | |||||||||||
Bundle lifecycle — activate(host) → BundleHandle.dispose()plugin-platform.bundle-lifecycle | ◐ | ● | ||||||||||
C-34 — the parts and scene-layer doors name their CALLER (the adapter, never the bundle)plugin-platform.caller-gated-doors | ◍ | ◍ | ||||||||||
Capability declaration — document read/write, rendering surfaces, editContext, network, clipboardplugin-platform.capability-scopes | ◐ | |||||||||||
Capability-catalog vendoring + the single-source vocabulary gate (ADR 019)plugin-platform.catalog-vendoring | ◍ | |||||||||||
System-clipboard door (host.clipboard — K-6 / S-14, text + tabular)plugin-platform.clipboard-door | ◐ | ◍ | ||||||||||
Command + keybinding contribution registrationplugin-platform.command-registration | ● | ● | ||||||||||
Host credential store (host.secrets — D-11, reference-only, DELIBERATELY no get)plugin-platform.credential-store | ● | |||||||||||
Data-provider registry (host.dataProviders — publish/consume RecordSet across plugins)plugin-platform.data-providers | ● | |||||||||||
Plugin document metadata — x-paged Label carrier + get/setMetadata doorsplugin-platform.document-metadata | ● | ● | ● | ● | ● | |||||||
Document-opened event for pluginsplugin-platform.document-opened | ● | |||||||||||
Edit-context registry (enter/exit, write-scope narrowing, breadcrumb)plugin-platform.edit-context | ● | |||||||||||
Host file picker (host.shell.pickFile)plugin-platform.file-picker | ● | ● | ||||||||||
Plugin font registration + asset serving (@font-face parity)plugin-platform.font-asset-serving | ◐ | ◐ | ◐ | |||||||||
Frame-chain read + reflow events (host.document.frameChain, DocumentChangeEvent.reflow)plugin-platform.frame-chain-read | ● | ● | ||||||||||
plugin-template — the living proof a fresh clone builds on published canaries aloneplugin-platform.fresh-checkout-proof | ◐ | |||||||||||
Headless host conformance harness (createHeadlessHost)plugin-platform.headless-host-conformance | ● | |||||||||||
Host-owned eyedropper — sample composited pixels into the document defaults (C-32)plugin-platform.host-eyedropper | ● | |||||||||||
Host widgets + diagnostics sink (CodeEditor widget, problems lane)plugin-platform.host-widgets | ● | |||||||||||
Placed-image resource provider door (host.images.claimImageResource — C-6 / I-06, v44 tile lane)plugin-platform.image-resource | ● | ◐ | ||||||||||
Importer/exporter registration (contribute.importer/exporter + Export Center)plugin-platform.importer-exporter | ● | ● | ● | |||||||||
Namespaced key-value store (host.storage — ungated, JSON values)plugin-platform.kv-storage | ◍ | |||||||||||
Plugin manifest schema + CLI validator (paged-plugin validate)plugin-platform.manifest-schema | ● | |||||||||||
Menu contribution — a plugin placing its own verbs in the menu barplugin-platform.menu-contribution | ◐ | ● | ||||||||||
Modal edit session (K-1) — entry gesture, content pointer, in-frame editing loopplugin-platform.modal-edit-session | ◐ | ◐ | ◐ | |||||||||
Native-document read/open door (host.nativeDocument — document.readNative / document.openNative)plugin-platform.native-document | ● | ● | ||||||||||
Network capability + consent door (host.network, default-deny)plugin-platform.network-consent | ● | ● | ||||||||||
Object-type bake contract (live metadata -> derived IDML children)plugin-platform.object-type-baking | ◐ | |||||||||||
K-13 — one entry gesture for canvas content (entry narrowed to a one-member union)plugin-platform.one-entry-gesture | ● | |||||||||||
Overlay TEXT primitive on the tool-preview channelplugin-platform.overlay-channel | ◐ | ● | ● | |||||||||
Overlay contribution into the camera-space SVG surfaceplugin-platform.overlay-registration | ● | |||||||||||
Panel-rail + icon contribution door (K-8 — rail launcher + sanitized SVG glyph)plugin-platform.panel-rail-door | ● | ● | ||||||||||
Panel contribution registration (expert-leaf React in v0)plugin-platform.panel-registration | ● | ◐ | ||||||||||
Per-element parentage read (host.document.parentOf)plugin-platform.parent-of | · | ◍ | · | |||||||||
Part types — a plugin declaring the container parts it ownsplugin-platform.part-types | · | |||||||||||
Placed-asset bytes read door (host.assets.getPlacedImage — C-5 / I-04)plugin-platform.placed-asset-bytes | ◐ | · | ◐ | |||||||||
Planar-region read door for bundles (host.document.planarRegions — K-11)plugin-platform.planar-regions-door | ● | |||||||||||
Host save-file door (host.shell.saveFile)plugin-platform.save-file | ◍ | ◍ | · | |||||||||
In-frame plugin scene layers (contribute.sceneLayer — vector/text/image/gradient/blend/shadow)plugin-platform.scene-layer | ● | ● | ● | |||||||||
The published plugin-sdk stays a SYNCHRONOUS module (no top-level await)plugin-platform.sdk-bundle-shape | ◍ | |||||||||||
C-9 — caret/selection-offset read door for bundlesplugin-platform.text-caret-door | ● | ● | ||||||||||
Text measurement door (host.text.measureString + editor metrics RPC)plugin-platform.text-measurement | ● | ● | ||||||||||
Tool contribution + gesture-handler registration surfaceplugin-platform.tool-registration | ● | ● | ||||||||||
Bundle wasm packaging + loader contract (bundle-realm glue path)plugin-platform.wasm-packaging | ◐ | |||||||||||
Wire-compatibility type assertions (machine output ⊆ engine wire types)plugin-platform.wire-compat-assertions | ● | ● | ||||||||||
Wire-vendoring drift gate (sync-wire --check, hard in publish CI)plugin-platform.wire-drift-gate | ◍ | |||||||||||
Worker spawn + SharedArrayBuffer (host.workers — K-3, off-main-thread compute)plugin-platform.worker-pool | ● | ● | ● |
Plugin · draw 55 features · 98% green
| Feature | Renderer | Mutation | Canvas | Gesture | API | Draw |
|---|---|---|---|---|---|---|
Add-anchor plan (split segment at on-curve click)plugin-draw.anchor-add | ● | ● | ||||
Convert-anchor plan (corner ↔ smooth)plugin-draw.anchor-convert | ● | ● | ||||
Delete-anchor plan (nearest within tolerance, contour floor)plugin-draw.anchor-delete | ● | ● | ||||
Appearance model — multi fill/stroke metadata stack + baked top layer (Tier B)plugin-draw.appearance | ● | ● | ||||
Appearance panel v0 — the metadata stack, with the bake limit stated in the UIplugin-draw.appearance-panel | ● | ● | ||||
Blends v1 — three spacing modes over a real spine (grew the tool-wave-2 blend v0)plugin-draw.blends | ● | ◐ | ||||
Brush tools v0 — paintbrush, blob brush, eraser (calligraphic nib sweep)plugin-draw.brush-tools | ● | ● | ||||
paged.draw bundle manifest (media.paged.draw) + activate skeletonplugin-draw.bundle-manifest | ● | |||||
Compound paths — make / release, with real non-zero holesplugin-draw.compound-paths | ● | |||||
On-canvas corner-radius tool — the live-corners row's predicted handleplugin-draw.corner-radius-tool | ● | |||||
Create Outlines — a text frame's glyphs as pathsplugin-draw.create-outlines | ◍ | ◍ | ||||
Direct Selection machine — drag anchors, handles and segments; multi-anchor select, marquee, nudgeplugin-draw.direct-selection | ● | ● | ||||
vectorGraphic edit context — live enter/exit via contribute.editContextplugin-draw.edit-context-live | ● | |||||
Eyedropper — sample element properties and apply to the selectionplugin-draw.eyedropper | ● | ● | ||||
Fill panel as a declarative schema panel — the second W3.1 consumer, with a published bindingplugin-draw.fill-schema-panel | ● | ● | ||||
Cubic bezier kernel — de Casteljau split, eval, closest-t, flattenplugin-draw.geometry-bezier | ● | |||||
Anchor/handle math — corner, mirror, smooth-from-drag, angle constrain, affineplugin-draw.geometry-handles | ● | |||||
Property tests for the draw-geometry kernelplugin-draw.geometry-properties | ● | |||||
RDP polyline simplification + perpendicular segment distanceplugin-draw.geometry-rdp | ● | |||||
On-canvas gradient stops on the annotator lineplugin-draw.gradient-stops | ● | |||||
Graphic styles — a named, LINKED complete appearance with override DETECTIONplugin-draw.graphic-styles | ● | ● | ||||
Headless conformance corpus over published canvas-wasmplugin-draw.headless-conformance | ● | |||||
Illustrator oracle lane — path ops recorded in Illustrator 30.1.0, replayed against the engineplugin-draw.illustrator-oracle | ● | |||||
Image Trace v0 — raster to editable vector over visioncortexplugin-draw.image-trace | ◐ | |||||
InDesign round-trip lane — 27 IDML cases read by InDesign 20.0.1plugin-draw.indesign-roundtrip | ◐ | |||||
Layers BINDING PROVIDER — paged.draw serves the HOST Layers panel (ADR 023 phase D)plugin-draw.layers-binding-provider | ● | ● | ||||
Layers panel — the panels/layers.panel.json prototype made real (expert-leaf React)plugin-draw.layers-panel | ◍ | |||||
Live Corners — Rounded/Inverse/Bevel/Fancy/None presets via frameCornerOption*/Radius* + live marker (Tier B)plugin-draw.live-corners | ● | ● | ||||
Live Paint v0 — regenerable face paint over the planar arrangement (NOT live)plugin-draw.live-paint | ◐ | ◐ | ||||
Measure readout drawn on-canvas via the overlay text primitiveplugin-draw.measure-overlay-text | ● | ◐ | ||||
Object model — paths, appearance stacks, graphic styles, symbols and recipes addressable through host.objectsplugin-draw.objects | ● | |||||
Objects on a Path — distribute / align / pivot / reorder by TRANSFORM; it moves your objects and creates noneplugin-draw.objects-on-path | ● | ◐ | ||||
Opacity-mask commands — the paged.draw consumer of the C-28 protocol-58 doorplugin-draw.opacity-mask-commands | ● | |||||
Knife and Scissors at any point on a pathplugin-draw.path-cutting | ● | |||||
True Join — closePath / joinPaths over the v56 engine opsplugin-draw.path-weld | ● | ● | ||||
Pattern editing v1 — a re-editable tile field (step-and-repeat artwork, NOT a pattern swatch)plugin-draw.pattern-bake | · | ◐ | ||||
Pen v2 — continue, close and join existing paths; add / delete on the selected pathplugin-draw.pen-existing-paths | ● | ● | ||||
Pen tool state machine (click/drag anchors, modifier matrix, close, commit)plugin-draw.pen-machine | ● | |||||
Pressure-aware pencil — variable-width strokes via outlineStrokeVariableplugin-draw.pencil-pressure | ● | |||||
Work budgets for every suspected hot pathplugin-draw.perf-budgets | ● | |||||
Phase 4c pro path toolset — curvature/pencil/measure machines + simplify/join/average/offset/outline/pathfinder/gradient/arrowheads commandsplugin-draw.pro-path-toolset | ◐ | ● | ||||
Reflect (horizontal, vertical, a typed axis, a copy) and Transform Againplugin-draw.reflect-transform | ● | |||||
Repeats v1 — radial / grid / mirror, and the repo's first ONE-undo buildplugin-draw.repeats | ● | ◐ | ||||
Reverse Path Directionplugin-draw.reverse-path | ● | |||||
Select-same by fill / stroke / stroke-weight (Tier A — pure selection, no mutation)plugin-draw.select-same | ● | |||||
Shape Builder gesture tool — drag merges the faces it crosses, Alt-drag deletes themplugin-draw.shape-builder | ● | ● | ||||
Point snapping — page edges, centre lines, corners, own anchorsplugin-draw.snapping | ● | ● | ● | |||
Stroke dash-pattern command presets (Solid/Dashed/Dotted/DashDot)plugin-draw.stroke-dash-commands | ● | ● | ||||
Stroke panel as a declarative schema panel (W3.1 adoption)plugin-draw.stroke-schema-panel | ● | |||||
SVG import + export — the K-2 interchange round-trip (Phase 8)plugin-draw.svg-io | ● | ● | ||||
Symbols v0 — a named artwork DEFINITION and instances that follow itplugin-draw.symbols | ◐ | |||||
Tool options and the Path Options panelplugin-draw.tool-options | ● | ● | ||||
Width, blend, lasso-select, parent-group cycling, parametric generatorsplugin-draw.tool-wave-2 | ● | ● | ||||
Type on a path — attach an existing story to a path, detach itplugin-draw.type-on-path | ● | |||||
One batch per flow — created ids off the reply, one shared link indexplugin-draw.write-batching | ● |
Plugin · web 22 features · 100% green
| Feature | Renderer | Canvas | Panel | Web |
|---|---|---|---|---|
Canvas follows the documentplugin-web.auto-render | ● | |||
Bake to native content — flatten a rendered web frame/flow to Paged page items (IDML/PDF export path)plugin-web.bake-to-native | ◐ | |||
Layout parity with Chrome (recorded oracle)plugin-web.chrome-parity | ● | |||
Bound data in templatesplugin-web.data-binding | ● | |||
On-canvas vector rendering of web frames (Blitz/WASM → C-1 sceneLayer lane)plugin-web.engine-rendering | ● | ● | ● | |
Flow fragmentation — re-line-break one flow across N frames (ADR-020 ladder)plugin-web.flow-fragmentation | ● | |||
Flow threading — one web source across a chain of publication framesplugin-web.flow-threading | ● | |||
.html file importer — File/Open + drag-drop an HTML file into a web frameplugin-web.html-importer | ● | |||
In-frame text editingplugin-web.in-frame-edit | ● | |||
Insert web frame (one undo step, frame + source metadata)plugin-web.insert-command | ● | ● | ||
Source persistence in the document (IDML round-trip, foreign-open safe)plugin-web.metadata-persistence | ● | ● | ||
Object model — web frames, their HTML and CSS properties addressable through host.objectsplugin-web.object-model | ● | |||
Outline and canvas highlightplugin-web.outline-canvas | ● | |||
Overflow policiesplugin-web.overflow-policies | ● | |||
Break rules and @page in flowsplugin-web.page-breaks | ● | |||
Host undo reaches panel editsplugin-web.panel-undo | ● | |||
Work counters and count budgetsplugin-web.perf-budgets | ● | |||
Flow/render readout — the last render/flow/bake outcome in the source panelplugin-web.render-readout | ● | ● | ||
Sub-resources from the document onlyplugin-web.resources | ● | |||
WebFrameSource model + metadata envelope + diagnostics linterplugin-web.source-model | ● | |||
Source panel — HTML/CSS editors, sandboxed preview, options, diagnosticsplugin-web.source-panel | ● | ● | ||
Web fonts and faces on the canvasplugin-web.web-fonts | ● |
Plugin · doc 17 features · 71% green
| Feature | Shell | Panel | Doc |
|---|---|---|---|
Atomic pour — the place path adopts Mutation::Batch for text steps (C-14)plugin-doc.atomic-pour | ● | ||
The wordDocument surface — objectType + editContext declaration (ADR-024)plugin-doc.edit-context | · | ● | |
Embedded placement — a .docx poured into a host frame via host mutationsplugin-doc.embedded-placement | ◐ | ● | |
File entry — the .docx/.dotx importer and the "Place Word document…" commandplugin-doc.file-entry | ◐ | ◐ | |
Identity-based LCS alignment — the preservation invariant under every derived editplugin-doc.identity-alignment | ◍ | ||
Depth-aware table locator — a nested table cannot misdirect an outer editplugin-doc.nested-table-locator | ◍ | ||
Object model — Word document, blocks, runs and merge fields addressable through host.objectsplugin-doc.object-model | ● | ||
OPC container + verbatim carry-through preservation (paged-ooxml)plugin-doc.opc-foundation | ● | ||
Outline/styles panel — the retained LoweredDoc surfaced in the editorplugin-doc.outline-panel | · | ● | |
DOCX read path — body, styles, lists, tables, images, hyperlinks, notesplugin-doc.read-path | ● | ||
Edited save-back — targeted byte-level patch of word/document.xmlplugin-doc.save-back | · | ● | |
Save-back refusal ledger — the patcher's skips reach the Problems panelplugin-doc.save-back-feedback | ● | ||
Paragraph-property save-back — a targeted `<w:pPr>` rewriteplugin-doc.save-back-paragraph-props | ◍ | ||
Table-structure save-back — rows and columns inserted/deleted in the source bytesplugin-doc.save-back-table-structure | ◍ | ||
Standalone open — a Word document becomes the whole document, a page per section that growsplugin-doc.standalone-open | ◐ | ||
Verbatim export — the zero-edit .docx exporter and its degrade pathplugin-doc.verbatim-export | ◐ | ● | |
Word pagination — line spacing, breaks and keeps as Word lays them outplugin-doc.word-pagination | ◐ |
Plugin · image 86 features · 76% green
| Feature | API | Image |
|---|---|---|
A sampled .abr tip paints through the existing stroke accumulatorimage.abr.engine-bridge | ◐ | |
.abr brush-preset reader over a new PSD descriptor readerimage.abr.reader | ◐ | |
The .abr regression gate, split into the two lanes its roles can runimage.abr.regression-gate | ◐ | |
Per-channel statistics, from the same buffer as the histogramimage.channels.readout | ◐ | |
Load a channel as the selection (luminosity masking)image.channels.to-selection | ● | |
CMS display lane — qcms RGB↔RGB (the exact build core ships, page/editor agree)image.cms.display | ◐ | |
CMS behind the swappable CmsEngine seam (D-11: hybrid)image.cms.engine | ◐ | |
CMS rung 1 — the RGB display transform at decodeimage.cms.ingest-transform | ◐ | |
CMS print lane — moxcms per-intent RGB↔RGB + CMYK8→RGBA8 ingestimage.cms.print | ◐ | |
AVIF / JXL / camera-RAW / HEIC — codec verdicts (deferred + explicit non-goals)image.codec.avif | · | |
EXIF/TIFF read — orientation + DPI + color-space tag, auto-orient at ingestimage.codec.exif | ● | |
Codec adapter contract (ImageSource/ImageTarget over sans-IO ByteSource) + PNG + rawimage.codec.traits | ● | |
GPU tests that cannot pass silentlyimage.conformance.gpu-lanes | ◐ | |
Conformance harness — scalar references, gpu↔ref parity, fixture corpusimage.conformance.harness | ◐ | |
Panel + chain integration of the new adjustments and generatorsimage.editor.adjust-breadth | ● | |
Auto-enhance — gray-world WB + percentile auto-levels params from the panel histogramimage.editor.auto-enhance | ● | |
Blur and sharpen brushesimage.editor.blur-sharpen-brush | ● | |
Photoshop .abr brush libraries load and set the brushimage.editor.brush-presets | ◐ | |
Rotate, flip and Canvas Size over all layersimage.editor.canvas-ops | ● | |
Clone stamp — the brush with a sampled paint layerimage.editor.clone-stamp | ● | |
Foreground/background colour, picker and eyedropperimage.editor.color-fg-bg | ◐ | |
Content-aware fill — coarse-to-fine exemplar inpaintingimage.editor.content-aware-fill | ◍ | |
Editor crop + straighten tool — host-agnostic crop machine over the geom.crop windowimage.editor.crop | ● | |
Crop straighten commits (arbitrary-angle rotation resample)image.editor.crop-straighten | ◍ | |
Editor levels/curves/white-balance panel — histogram view + adjust kernelsimage.editor.curves | ◐ | |
K-3 decode worker pool — off-main-thread ingest decode (host.workers consumer)image.editor.decode-pool | ◐ | |
Dodge, burn and spongeimage.editor.dodge-burn | ● | |
Filters — blur / unsharp / hue-rotate / invert in the adjustments panelimage.editor.filters | ● | |
Gradient tool (drag the line)image.editor.gradient-tool | ● | |
Healing brush — a clone tone-matched in the gradient domainimage.editor.healing-brush | ● | |
History panel over the tile journalimage.editor.history-panel | ◍ | |
Host Cmd+Z inside an imageimage.editor.host-undo | ● | |
Hue/Saturation — master, six colour ranges, colorizeimage.editor.hue-saturation | ◐ | |
M4 editor enablement — C-5 placed bytes → decode → adjust → C-1 Stage-A in-frame compositeimage.editor.ingest | ◐ | |
Pixel-layer stack with a compose.* foldimage.editor.layers | ◐ | |
Live adjustment preview on a resampled proxyimage.editor.live-preview | ● | |
Paint on layer masks (Pixels/Mask edit target)image.editor.mask-painting | ● | |
Move tool for pixels and layersimage.editor.move-tool | ● | |
Brush / Pencil / Eraser — the raster paint laneimage.editor.paint | ● | ◐ |
Paint bucketimage.editor.paint-bucket | ◍ | |
Patch toolimage.editor.patch | ● | |
Define pattern, pattern fill and shape blurimage.editor.pattern-fill | ● | |
Median, Maximum, Minimum and Color Lookupimage.editor.rank-filters | ◐ | |
Raster type — shaped glyphs painted into a layerimage.editor.raster-type | ◐ | |
Red eyeimage.editor.red-eye | ● | |
Resample — resize the working image through the registered kernelsimage.editor.resample | ● | |
Spot healing brushimage.editor.spot-heal | ● | |
C-6 tile provider for placed images (host.images.claimImageResource, v44; honest level-0 subset)image.editor.tile-provider | ◐ | |
Raster tool options in the host's tool-options barimage.editor.tool-options | ◐ | |
Bounded COW tile journal — undo/redo for pixel editsimage.editor.undo-journal | ◐ | |
Engine B — persistent buffer graph (invalidation, mip-aware eval, Gestures/Operations)image.graph.engine-b | ◐ | |
16-bit PSD sources open, reduced to 8 and reportedimage.io.depth-16bit-ingest | ◐ | |
Layered PSD exportimage.io.layered-psd | ◐ | |
Commit image edits to the document and reopen themimage.io.persistence | ◐ | |
Save-back — adjusted composite to PSD / PNG / JPEGimage.io.save-back | ● | ◐ |
Kernel breadth — 24 new point/compose/gen kernels (73 → 97)image.kernel.breadth-2026-08 | ◍ | |
T0 generated kernel families (arith/relational/boolean/cast/band/minmax/linear)image.kernel.family-t0 | ◐ | |
T1 crown-jewel kernels (conv/resample/compose — handwritten WGSL modules, ABI v1.1)image.kernel.family-t1 | ◐ | |
T2 editor-bearing kernels (adjust/geom/generators)image.kernel.family-t2 | ◐ | |
T3 breadth kernels (morphology, rank/median, distance transform)image.kernel.family-t3 | ◐ | |
1D and 3D LUT sampler classesimage.kernel.lut-samplers | ◐ | |
General backward-map warpimage.kernel.warp-backward | ◐ | |
Frozen WGSL kernel ABI v1 (4 bind groups, 16×16, mask-mixed pointwise)image.kernel.wgsl-abi | ● | |
Clipping layers — an adjustment confined to the layer beneathimage.layers.clipping | ● | |
Editable adjustment layersimage.layers.editable-adjustments | ◐ | |
The layer fold keeps adjustment layers in f16image.layers.f16-fold | ◍ | |
Layer groups — pass-through and isolated, nesting up to eightimage.layers.groups | ◍ | |
Smart objectsimage.layers.smart-objects | ● | |
Object model — layers, masks, adjustments and smart objects addressable through host.objectsimage.object-model | ● | |
A host path becomes the selectionimage.paths.path-to-selection | ● | |
A raster selection becomes a real vector pathimage.paths.selection-to-path | ◐ | |
Work counters and count budgetsimage.perf.budgets | ● | |
Engine A async sinks — to_buffer_async/to_encoder_async (the wasm32/WebGPU readback lane)image.pipeline.async-sink | ● | |
Engine A — demand-driven streaming pipeline skeletonimage.pipeline.engine-a-skeleton | ● | |
paged.image bundle (media.paged.image) — manifest + activate + panelimage.plugin.bundle-manifest | ◐ | |
PSD structural session — layer list/edit/save reach the editorimage.psd.editor-doors | ◍ | |
PSD import populates the layer stack (declines rather than approximates)image.psd.layer-import | ◐ | |
PSD mutatable — edits re-encode through the preservation writerimage.psd.mutatable | ◐ | |
PSD rendered tier — channel decode + flatten render oracleimage.psd.rendered | ◐ | |
PSD/PSB structural parse + preservation-invariant writerimage.psd.roundtrip | ◐ | |
Reductions — histogram + min/max/mean statisticsimage.reduce.statistics | ◐ | |
Residency Tier 0/1 hardening under working-set pressureimage.residency.tier01 | ● | |
Selection-mask plumbing — the §6.1 mask surfaced end-to-endimage.selection.mask | ● | |
Selection system — marquee/ellipse/lasso/wand over the mask ABIimage.selection.mask-tools | ● | ● |
Selection coverage threaded through the GPU adjust chainimage.selection.masked-pipeline | ● | |
Select ▸ Modify and wand optionsimage.selection.modify | ● |
Plugin · slide 15 features · 100% green
| Feature | Slide |
|---|---|
PowerPoint charts drawn as native shapes from their cached valuesplugin-slide.charts | ◐ |
A deck's embedded fonts reach the document, within their licencesplugin-slide.embedded-fonts | ◐ |
A PPTX opens as native slides (generated IDML, inheritance resolved)plugin-slide.import-native | ◐ |
New slide from layout; layout editingplugin-slide.layouts | ◐ |
Object model — slides, layouts and placeholders addressable through host.objectsplugin-slide.object-model | ● |
Engine and host features for slides — page order, page metadata, masters, page images, go to pageplugin-slide.page-doors | ◐ |
PowerPoint as the oracle — authored fixtures and recorded answersplugin-slide.powerpoint-oracle | ● |
Export a .pptx (original bytes if unedited, else regenerated)plugin-slide.pptx-export | ◐ |
Read a .pptx into the slide IRplugin-slide.pptx-read | ● |
DrawingML preset geometries become native pathsplugin-slide.preset-geometry | ● |
Slide sorter — thumbnails, reorder, duplicate, delete, hideplugin-slide.slide-sorter | ◐ |
Slideshow with transitions and builds, presenter viewplugin-slide.slideshow | · |
SmartArt drawn as native shapes from PowerPoint's laid-out drawingplugin-slide.smartart | ◐ |
Speaker notes per slideplugin-slide.speaker-notes | ◐ |
PowerPoint table styles resolved as PowerPoint draws them, kept as native table stylesplugin-slide.table-styles | ◐ |
Plugin · data 39 features · 100% green
| Feature | Shell | Data |
|---|---|---|
Print automation / batch generation (per-record / per-group / one catalog)data.automation.batch | · | ● |
Barcode / QR symbologies — clean-room EAN-13/UPC-A, Code-128, QR encoders + binding + VECTOR lowering (§9.7)data.barcode.symbology | ● | |
Bindings authoring — first-class add-binding flow in the bindings paneldata.bind.authoring | ● | |
Change-highlighting on refresh — per-binding "what changed since last sync" report (§8)data.bind.change-report | ● | |
Binding + synchronization engine — resolution graph, sync states, identity diffdata.bind.engine | ● | |
Field-mapping wizard — map source columns → variable bindings one-click (§9)data.bind.field-mapping | ● | |
Record-preview stepper — resolve a binding against a chosen record index N (§9)data.bind.preview-step | ● | |
Universal property binding — any host.objects property bound to data, one undo step per apply (ADR 558)data.bind.property | ● | |
Row diff since the document was last written — added, removed and changed rows, and the bindings they reachdata.bind.row-diff | ● | |
Sync states per binding, with pin, unpin and accept-sourcedata.bind.sync-review | ● | |
Variable bindings are custom InDesign text variables; one Set re-bakes every instance (ADR 559, protocol 71)data.bind.text-variables | ● | |
Illustrator-compatible variable-library XML — import + export (§16.4)data.dataset.library-xml | ● | |
Data sets — capture / switch / delete, applied as ONE undo step (§16.4)data.dataset.palette | ● | |
Export as InDesign Data Merge template (native placeholders + UTF-16 data source)data.export.datamerge | ● | |
Binding-expression DSL — lexer, parser, evaluator and function library, registry-driven dispatchdata.expr.engine | ● | |
Governed-extract source (governed tables + optional metadata sidecar -> catalog)data.governed.extract | ◐ | |
Locale-aware display formatting (en/de v1)data.i18n.display | ● | |
Locales as a data table (CLDR values), per-field locale and display patternsdata.i18n.locale-table | ● | |
Placeholder lowering — variable replacement + single-region dynamic tabledata.lower.content | ◐ | |
Data Merge planner — Single and Multiple Records laid out by InDesign's ruledata.lower.merge-plan | ● | |
Data Merge writer — merge the records into the document, matching InDesigndata.lower.merge-writer | ◐ | |
Record flow lowers into text frames on pages added as the flow needs themdata.lower.recordflow-writer | ◐ | |
Re-lowering a table, barcode, record flow or merge updates its content in placedata.lower.relower-in-place | ◐ | |
v43 lowering consumers — in-text variables (D-01), image place (D-14), live record-flow (D-12), rules (D-13)data.lower.v43-consumers | ◐ | |
paged.data's own objects in host.objects — sources, queries, bindings, data sets, variables and typed commandsdata.object-model | ● | |
Performance gates (§12.5) — engine-tier perf assertionsdata.perf.gates | ◐ | |
Bindings live in the document's labels; the session part is a cache; restore from an InDesign re-save (ADR 559)data.persist.labels | ● | |
paged.data bundle (media.paged.data) — manifest + activate + 3 panels + DuckDB query gluedata.plugin.bundle | ◐ | |
The data session is saved with the document and restored on opendata.plugin.persistence | ● | |
Register as an SDK data provider (publish RecordSet to other consumers, e.g. sheets)data.provider.contract | ● | |
Data query panel — SQL with DuckDB diagnostics, filter/sort/group builders, preview griddata.query.panel | ◐ | |
Query engine (DuckDB-WASM) + RecordSet shape/order/hash — the Arrow seamdata.query.seam | ◐ | |
Rule editor — checked condition, firing preview, document style, per-record paragraphsdata.rule.authoring | ● | |
Capability-gated data access + threat model (the suite's largest surface)data.security.gates | ◐ | |
Source adapters (inline + file at M0) + capability/consent gate + visible manifestdata.source.adapters | ◐ | |
D-11 DB attach (SQLite/Postgres/MySQL) + DuckDB-WASM first-class engine + refresh-policy + remotedata.source.db-attach | ◐ | |
Local import of JSON, NDJSON, Parquet and XLSX into DuckDB (data-xlsx for workbooks)data.source.local-formats | ◐ | |
Refresh policies per source — manual, on open, interval (remote, consented), neverdata.source.refresh-policy | ◐ | |
Illustrator "Variables" — the four traits, mapped onto the shipped binding model (§16.4)data.variable.traits | ◐ |
Plugin · sheet 47 features · 100% green
| Feature | API | Sheet |
|---|---|---|
paged.sheet serves the HOST Swatches and Character/Paragraph panels (ADR 023 phase D)sheet.binding-providers | ● | ◐ |
Exact-decimal numeric mode (D-6 spike) — seam proven, deferred to v2 opt-insheet.calc.decimal | ◐ | |
Calculation engine — dependency graph, dirty recalc, f64 numeric core (D-6), coercion, error valuessheet.calc.engine | ● | |
Iterative (circular) calculation — OFF by default (D-7), converges to a fixed point when enabledsheet.calc.iterative | ● | |
Row/col insert-delete wasm door — structural re-emission, refused over preserved cell addressessheet.calc.rewrite.structural-door | ◐ | |
Dynamic-array spill (anchor + spill range,sheet.calc.spill | ● | |
Chart authoring — create a chart from the editor (page-side lowering)sheet.chart.authoring | ● | |
Charts — plotters-backed custom DrawingBackend → frozen ChartGeometry IR → grid view + paged.draw page loweringsheet.chart.engine | ● | |
Graph types — stacked column/bar + radar, axis titles, transpose rows/columns, c:grouping importsheet.chart.graphs | ● | |
Data-provider CONSUMER — source a sheet from a governed dataset (host.dataProviders)sheet.data.consumer | ● | |
Multi-cell copy/paste — formulas re-addressed on paste, tabular payload, TSV interop, tilingsheet.edit.clipboard | ● | |
Fill handle and fill down/right — number, date, weekday/month and numbered-text series; formulas re-addressedsheet.edit.fill | ● | |
Session edit ops — stable range sort (values lane), find over values/formulas, replace with skip reportingsheet.edit.ops | ● | |
Host Cmd-Z reaches sheet edits outside the modal session (ADR-012 Tier 2)sheet.edit.undo | ● | |
Function library — registered functions by family, registry-driven dispatchsheet.fn.library | ● | |
Cell formatting — number format, font, fill, borders, alignment, wrap (setStyle) persisted to styles.xmlsheet.format.cell-style | ◐ | |
Number-format engine + en/de locale (D-8)sheet.format.engine | ● | |
Western-European Latin locale tier (fr/es/it) — display formatting data rowssheet.format.locale.latin-tier | ● | |
Find in sheet — a find field in the grid panel; next/previous select and reveal the match in-framesheet.grid.find | ● | |
Frozen panes — parse sheetViews/pane + render frozen rows/columns in-gridsheet.grid.freeze.render | ● | |
In-frame grid — sceneLayer render + K-1 modal select/edit (sheets-mode lite)sheet.grid.inframe | ◐ | |
Grid keys — arrows, Tab/Enter, F2, Delete, Esc, PageUp/Down and Cmd shortcuts in-frame and in the panelsheet.grid.keyboard | ● | |
Grid panel edit and commit contractsheet.grid.panel-edit-contract | ● | |
Range selection — drag, shift-click and shift-arrows in the grid panel and in-framesheet.grid.selection | ● | |
CSV / TSV import as a one-sheet workbook, typed by localesheet.import.csv | ● | |
Freeze panes — set / clear (sheetView pane) from the panelsheet.layout.freeze | ● | |
Merge / unmerge cells (model, xlsx mergeCells, page spans)sheet.layout.merge | ● | |
Column width / row height — set and reset, persisted, used by the page geometrysheet.layout.sizes | ◐ | |
Cell fill / text colours are MINTED swatches — a raw hex in a colorRef paints nothingsheet.lower.cell-colour-swatches | ◐ | |
Page-surface lowering — native <Table> + IR-v2 style map + measured column widthssheet.lower.page | ● | |
Live multi-frame pagination across the host frame chainsheet.lower.paginate | ◐ | |
Defined names — resolve on load, define / redefine / delete, place a name or tablesheet.names.define | ● | |
Object model — workbook, sheets, cells, ranges, names, tables and charts addressable through host.objectssheet.objects | ● | |
Formula dialect parser — literals, A1 refs, operator precedence, functions, union/intersection, array literals, defined names, canonical print fixpointsheet.parser.dialect | ● | |
paged.sheet bundle (media.paged.sheet) — manifest + activate + 3 panels + 7 commands + importer/exporter + engine bootsheet.plugin.bundle | ● | |
Formula bar bound to the selected cell, with function autocompletion from the enginesheet.plugin.formula-bar | ● | |
Function browser + workbook inventory + the styleFromCell command (workbook panel)sheet.plugin.function-browser | ● | |
Workbook persistence — host.blob (OPFS) + the metadata binding envelopesheet.plugin.persistence | ◐ | |
Workbook visual styles — xlsx parse -> deduped IR-v2 style table -> both surfaces (one resolver, cross-surface parity)sheet.style.mapping | ◐ | |
Excel structured tables / ListObjects — model + structured references + tableN.xml partsheet.table.structured | ● | |
get_range_styled — the workbook's REAL per-cell visual styles, as a door of its ownsheet.wasm.range-styled-door | ◐ | |
Workbook structure — new blank workbook, add / rename / delete sheetsheet.workbook.sheets | ◐ | |
Cell comments — preserve opaquely + display (grid indicator + panel list), preserve-firstsheet.xlsx.comments | ● | |
Conditional formatting — xlsx part fidelity + lowering to style overridessheet.xlsx.condfmt | ◐ | |
XLSX data validation — preserve byte-faithfully + read-only inventory (NEVER enforced)sheet.xlsx.data-validation | ● | |
Pivot tables — preserve-only, NEVER interpreted (publishing-first non-goal)sheet.xlsx.pivot | ● | |
XLSX I/O on the fidelity ladder — preservation invariant + import/export through the platformsheet.xlsx.roundtrip | ● |
Plugin · publish (IDML/PDF interchange) 6 features · 50% green
| Feature | Shell | Publish |
|---|---|---|
Corpus byte-identity sweep — 99/99 packages identical, and what it does NOT measureplugin-publish.byte-identity-sweep | ◍ | |
IDML interchange adapter (idml-import + idml-export crates, re-homed to plugin-publish)plugin-publish.idml-adapter-crates | ● | |
.idml exporter — the outbound half of the bundle (media.paged.publish.exporter.idml)plugin-publish.idml-exporter | ◍ | ◍ |
.idml importer via host.nativeDocument (@paged-media/publish bundle)plugin-publish.idml-importer | ● | |
Save-path defect class — nine defects between a parsed document and its bytesplugin-publish.save-back-defects | ◍ | |
IDML import and export as typed commandsplugin-publish.typed-commands | ● |
Plugin · pdf 7 features · 60% green
| Feature | |
|---|---|
Editable text reconstruction — positioned glyphs → paragraphs of styled runsplugin-pdf.editable-text | ◐ |
Editable vectors + PDF colours mapped to document swatchesplugin-pdf.editable-vector | ● |
Non-JPEG image import — PDFium bitmap decode for every filter chainplugin-pdf.image-filters | ◍ |
crates/pdf-import writes the native `.paged` OCF the engine load path expectsplugin-pdf.native-ocf-writer | ● |
Open/read PDF files in the editor (.pdf importer → native document)plugin-pdf.pdf-import | ◐ |
PDFium is the reader engine (pdf.js dropped)plugin-pdf.pdfium-reader | ◍ |
PDF import as a typed commandplugin-pdf.typed-commands | ● |
REST API
The editor-server REST surface — authentication, files, account, billing, fonts, and image search — generated from the server's OpenAPI specification.
paged.draw — vector
The vector drawing plugin — pen and path tools, pathfinder booleans, live corners, stroke/fill, and SVG import/export, rendered on-canvas through the engine's vector scene layer.