paged core — the open IDML engine

IDML in, the page InDesign would set, out

A Rust engine that reads InDesign documents and lays them out the way InDesign does — then paints them on the CPU, on WebGPU, or into print-grade PDF from one display list.

MPL-2.0 OR PMEL·released·0.71.3·github.com/paged-media/core ↗

130
editing operations, one undo channel
403
typed property schemas
30
address forms in the object model
3
backends from one display list
Fidelity, measured against InDesign

InDesign is the oracle

The Paged Annual is a 134-page document built by driving the real editor. Every page is rendered twice — once by paged, once by InDesign from the same IDML — and the two rasters are compared for colour distance (ΔE2000) and structure (SSIM). The numbers below are that comparison, including the pages that fail it.

128 / 134
pages pass the comparison
0.964
median SSIM against InDesign
0.97
median mean ΔE2000
117 of 118
engine operations exercised
p. 1SSIM 0.981 · ΔE 0.78 · passes
The Paged Annual, page 1, rendered by InDesign
InDesign
The Paged Annual, page 1, rendered by paged
paged
p. 47SSIM 0.979 · ΔE 0.53 · passes
The Paged Annual, page 47, rendered by InDesign
InDesign
The Paged Annual, page 47, rendered by paged
paged
p. 59SSIM 0.952 · ΔE 1.57 · fails
The Paged Annual, page 59, rendered by InDesign
InDesign
The Paged Annual, page 59, rendered by paged
paged
p. 77SSIM 0.948 · ΔE 1.24 · passes
The Paged Annual, page 77, rendered by InDesign
InDesign
The Paged Annual, page 77, rendered by paged
paged
p. 96SSIM 0.962 · ΔE 0.93 · passes
The Paged Annual, page 96, rendered by InDesign
InDesign
The Paged Annual, page 96, rendered by paged
paged
p. 112SSIM 0.968 · ΔE 0.92 · passes
The Paged Annual, page 112, rendered by InDesign
InDesign
The Paged Annual, page 112, rendered by paged
paged

Six pages from the Annual, left InDesign, right paged. Page 59 does not pass — it is shown because it does not. The whole document is on the showcase.


The engine repository carries its own gate as well: a licence-clear set of generated fixtures, each with a reference PDF exported by InDesign and thresholds for mean ΔE2000, p99 ΔE2000 and SSIM. Rendering changes are gated on them, and a threshold is tightened after a fix — never loosened to make a failure pass.

The per-feature truth is in the conformance slice at the end of this page and the full reference.

One display list

The screen, the test gate and the press read the same page

Composition ends in a display list — one per page, made of paths, images, gradients and interned glyph outlines. Three backends consume it unchanged: tiny-skia on the CPU, the reference for the fidelity gate; Vello on WebGPU, for every interactive frame in the editor and the viewer; and a PDF writer for print. Nothing is laid out twice, so nothing can disagree.

Fig. 04
The render path: a document is composed once into a per-page display list, which three backends consume — the CPU rasteriser tiny-skia, the WebGPU rasteriser Vello, and the PDF writer.The render pathDocument.idml · .pagedComposescene · text · layoutDisplay listone per pagepaths · images · glyphsCPU · tiny-skiaPNG · fidelity gate · separationsWebGPU · Vellocanvas · editor and viewerPDF · pdf-writerprint-grade PDF1 composition · 1 display list · 3 of 3 backends shown
Fig. 04 — One display list, three backends — the screen, the test gate and the press read the same page.click a stage to inspect it
Parse, scene, text, paint

Edit one character, reuse the rest

The pipeline runs in four tiers. Laid-out paragraphs are cached under a hash of their content, unchanged stories are cheap to rebuild, and a text edit in one story reuses the pages it did not touch. That is what keeps an InDesign-class editor responsive inside a browser tab.

Fig. 05
The four-tier incremental composition pipeline (parse, scene, text, paint); scrubbing an edit through the tiers re-lights only invalidated stages.ParseIDML package → typed modelcachedScenemodel → frames, geometry, stylescachedTextshaping · line breaking · compositioncachedPaintdisplay list → WebGPU (Vello)cachedIncremental recomposition — the salsa dependency graph beneathrest — everything cached
Fig. 05 — Drag an edit through the pipeline — cached tiers stay ink, invalidated work lights violet.
rest — everything cached
The format

What is inside an .idml

IDML is InDesign's open interchange format: a ZIP of XML parts. The designmap names every spread, master and story; the resources carry the swatches, the styles and the preferences. paged reads the parts that decide the page and says plainly which ones it leaves to the host — fonts are supplied, never guessed.

Fig. 06
Anatomy of an IDML file: a ZIP package whose designmap.xml references Spreads, MasterSpreads, Stories, Resources (Graphic, Styles, Preferences, Fonts), XML and META-INF.Inside an .idmlPackage.idml = ZIPmimetype firstdesignmap.xmlthe rootSpreadsSpread_*.xmlMasterSpreadsMasterSpread_*.xmlStoriesStory_*.xmlResourcesGraphic · Styles · Preferences · FontsXMLBackingStory · TagsMETA-INFcontainer.xmlsolid = read by paged · hatched = left to the host or skipped
Fig. 06 — Anatomy of an IDML — a ZIP of XML parts, with the designmap at the root.click a part to see what paged reads
Typography

A paragraph composer, not a line breaker

Text is shaped with harfrust, a Rust port of HarfBuzz, and set by a Knuth–Plass total-fit composer that weighs the whole paragraph before it breaks a line, with its penalties calibrated against InDesign. Dictionary hyphenation, tabs, nested styles, conditional text, super- and subscript and multi-font runs are part of the same pass.

Right-to-left scripts run in the same composer as Latin. Where a writing system is only partly supported — vertical Japanese is read but not yet set vertically — the Annual's margin says exactly how, and so does the conformance reference.

The Paged Annual — Scripts of the World: Arabic and Hebrew right to left, with Latin and digits inside.
The Paged Annual — Scripts of the World: Arabic and Hebrew right to left, with Latin and digits inside.
The object model

Every object has an address; one set writes any property

The engine names everything it holds — the document, a page, a frame, a swatch, a style, a table cell, a text range — in one address grammar with 30 forms, and selectors find them the way CSS finds elements. Every property has a typed schema; 403 of them are published in the capability catalog. A single set writes any of them, through the operation that already owns it, as one undo step.

// every frame on page 3 whose name starts with "price"
const frames = JSON.parse(paged.query('page:#3 > frame[name^=price]'));

// one batch: all or nothing, one rebuild, one undo step
paged.batch(frames.flatMap((address) => [
  { op: 'set', address, path: 'frameFillColor', value: 'Color/Black' },
  { op: 'set', address, path: 'frameFillTint', value: 10 },
]));

console.log(paged.get(frames[0], 'frameFillTint'));
A paged.* script — the same JavaScript runs in the editor's script panel and on the command line (paged script).

Addresses look like doc, page:#2, swatch:Color/Red, cell:<table>/0,1; selectors like page:#3 > frame[name="price"].

One mutation channel

Undo, scripts and gestures share one path

Every change to a document is an operation: typed, serialisable and invertible. A drag in the editor, a line of a script and a command on the terminal all become the same operations, so they all undo the same way. Operations batch: a batch is atomic, costs one rebuild and lands as one undo step, however many objects it touches.

[ 130 ]operations on the wire
[ 1 ]rebuild and one undo step per batch
[ 1 ]typed door for the editor, the CLI and scripts
The command line cannot apply a change the editor cannot.

Snapping lives in the engine too: moves, resizes and path edits snap to every visible point and outline, the page, guides and the grid through one resolver in the engine, not in the user interface.

Print output

A PDF a printer will take

PDF export is the third backend over the same display list, written directly with pdf-writer. It is not a screenshot in a PDF wrapper: what was text is text, what was vector is vector, and the colour stays in the space the designer chose.

Text stays text
Subset CID fonts with ToUnicode maps — selectable, searchable, copyable.
Native colour
DeviceCMYK, ICC-based, Separation and Lab colour are kept, not flattened to RGB.
Live transparency
Blend modes and opacity stay live, PDF/X-4 style — no flattener.
Images pass through
JPEG data is written as it came, with no re-encode.
Deterministic
No clock, ids in walk order: the same input yields the same bytes.
Gated
CI rasterises the exported PDF and compares it with the engine's own render.
paged on the command line

The whole engine, one binary

pageddrives the same typed door as the editor's worker, so it opens .paged containers as well as IDML and inherits fonts, colour management, PDF export, scripting and undo from the editor's own code path. Every operation in the catalog is a verb through paged invoke; a headless JSON session speaks the protocol line by line.

paged render   annual.idml --page 3 --dpi 144 -o p3.png
paged inspect  annual.idml --json
paged query    annual.idml 'page:#3 > frame[name^=price]'
paged set      annual.idml frame:u1f2 frameFillTint 10 -o annual.paged
paged script   annual.paged build.js -o annual.pdf --render p1.png
paged export   annual.paged --format pdf -o annual.pdf
paged diff     indesign.png paged.png --heatmap heat.png
paged describe          # the capability catalog, no document needed
A few of the paged subcommands. The address frame:u1f2 is illustrative.
Spec sheet — from the registry, not from marketing

Core format features

Color & swatches · 12
Character fill color
color-swatches.character-fill
stable· 3 tests
Color groups (CRUD + membership)
color-swatches.color-groups
stable· 35 tests
ColorOverride specials (paper/black/registration)
color-swatches.color-overrides
stable· untested
Document defaults for new objects (fill/stroke/weight)
color-swatches.document-defaults
stable· 19 tests
Apply fill/stroke color + tint to frames
color-swatches.fill-stroke-apply
stable· 21 tests
Gradients (linear/radial, stops + midpoints)
color-swatches.gradients
stable· 39 tests
ICC color management (lcms2 native / qcms wasm)
color-swatches.icc-cmm
stable· 19 tests
Ink management (convert-to-process, aliases, standard Lab)
color-swatches.ink-manager
stable· 6 tests
Lab / mixed-ink / spot-without-CMYK
color-swatches.lab-mixed-ink
stable· 2 tests
CMYK overprint
color-swatches.overprint
stable· 1 test
Process CMYK/RGB + spot inks + tints
color-swatches.process-spot-tint
stable· 8 tests
Swatch CRUD (create/edit/delete + .ase import/export)
color-swatches.swatch.crud
stable· 37 tests
Effects & transparency · 11
Bevel & emboss
effects-transparency.bevel-emboss
stable· 1 test
Blend modes (26 modes incl. multiply/screen/overlay)
effects-transparency.blend-modes
stable· 1 test
Drop shadow (soft blur, offset, color, opacity)
effects-transparency.drop-shadow
stable· 7 tests
Feather (basic + directional)
effects-transparency.feather
stable· 1 test
Outer / inner glow
effects-transparency.glows
stable· 2 tests
Gradient feather
effects-transparency.gradient-feather
stable· 3 tests
Inner shadow
effects-transparency.inner-shadow
stable· 2 tests
Object opacity
effects-transparency.opacity
stable· 11 tests
Opacity masks — a real per-pixel soft mask (luminosity or alpha, invertible)
effects-transparency.opacity-mask
stable· 6 tests
Satin
effects-transparency.satin
stable· 1 test
Transparency groups (nested blend group buffering)
effects-transparency.transparency-groups
stable· untested
Foundations · 3
IDML container open (ZIP + mimetype validation)
foundations.container.open
stable· 3 tests
designmap parse (spreads, stories, resources wiring)
foundations.designmap.structure
stable· untested
DOMVersion capture (version-agnostic parser)
foundations.domversion-capture
stable· untested
Frames & paths · 27
Appearance stack bakes to a group of stacked page items (B-24)
frames-paths.appearance-bake
stable· untested
GraphicLine arrowheads (triangle/circle/bar)
frames-paths.arrowheads
stable· untested
Decorative corner options (Rounded/Inverse/Bevel/Inset/Fancy)
frames-paths.corner-options
stable· 2 tests
Corner options on polygons (B-23) — apply arms, renderer, IDML write path
frames-paths.corner-options-polygon
stable· untested
Delete frame
frames-paths.frame.delete
stable· 9 tests
Insert frame (rectangle) by bounds
frames-paths.frame.insert
stable· 49 tests
moveFrame wire op
frames-paths.frame.move-op
stable· 1 test
Groups (nesting + group transparency/blending + create/dissolve ops)
frames-paths.groups
stable· 33 tests
Insert line (two-anchor open GraphicLine)
frames-paths.line.insert
stable· 29 tests
Nested page items (paste-into) — parse, render clip, pasteInto/releaseFrom
frames-paths.nested-content
stable· untested
Page-item kinds (TextFrame, Rectangle, Oval, Polygon, GraphicLine, Group)
frames-paths.page-item-kinds
stable· untested
Path clipping/masking (non-zero winding)
frames-paths.path-clipping
stable· 1 test
closePath — close an open subpath (the faithful inverse of pathOpenAt)
frames-paths.path.close
stable· untested
Insert freehand path (optional smoothing)
frames-paths.path.insert
stable· 29 tests
joinPaths — weld two open paths into one element
frames-paths.path.join
stable· untested
Pathfinder boolean (union/intersect/subtract/exclude)
frames-paths.pathfinder-boolean
stable· 21 tests
Divide / Trim / Merge / Crop / Outline / Minus Back
frames-paths.pathfinder-verbs
stable· untested
Planar arrangement — faces of overlapping paths (B-22)
frames-paths.planar-arrangement
stable· untested
Ellipse / polygon shape tools
frames-paths.shape-tools
stable· 25 tests
Stroke alignment (center/inside/outside)
frames-paths.stroke-alignment
stable· 9 tests
Dashed + dotted strokes (dash arrays, 12 dotted variants)
frames-paths.stroke-dashed
stable· 2 tests
Stroke gap color/tint
frames-paths.stroke-gap-color
stable· 4 tests
Stroke overprint
frames-paths.stroke-overprint
stable· 1 test
Striped / wavy strokes
frames-paths.stroke-striped-wavy
stable· 6 tests
Variable-width (tapered / pressure) strokes — per-anchor width outline
frames-paths.stroke-variable-width
stable· 6 tests
Stroke weight + line caps + joins
frames-paths.stroke-weight-caps-joins
stable· 12 tests
Text on a path
frames-paths.text-on-path
stable· 2 tests
Geometry & coordinates · 6
Bezier path geometry (PathPointType anchors + handles)
geometry-coordinates.bezier-path-geometry
stable· 8 tests
Compound paths (multi-contour subpath boundaries)
geometry-coordinates.compound-subpaths
stable· 1 test
GeometricBounds (y1 x1 y2 x2, pt)
geometry-coordinates.geometric-bounds
stable· 3 tests
Image content transform (inner image within frame)
geometry-coordinates.image-content-transform
stable· 12 tests
ItemTransform (2×3 affine per frame/page)
geometry-coordinates.item-transform
stable· 2 tests
Path topology ops (insert/remove anchor, open-at, curve type)
geometry-coordinates.path-topology-ops
stable· 23 tests
Package anatomy · 9
Composition part (paged/core/composition/document.pgd — arrangement)
package-anatomy.composition-part
stable· 1 test
Full package IMPORT — IDML adapter (designmap, spreads, stories, resources)
package-anatomy.core-import
stable· 7 tests
Graphic part (colors, swatches, gradients, inks, stroke styles)
package-anatomy.graphic-part
stable· untested
Inline base64 image bytes (<Image><Properties><Contents>)
package-anatomy.inline-image-contents
stable· untested
Native model part (paged/core/model/document.pgm — the self-owning document)
package-anatomy.native-model-part
stable· 1 test
The .paged container (ZIP-as-valid-IDML + plugin namespaces + manifest.json)
package-anatomy.paged-container
stable· 5 tests
host.parts plugin persistence door (namespaced container parts that travel with the file)
package-anatomy.paged-parts-door
stable· 6 tests
Story parts (ParagraphStyleRange / CharacterStyleRange trees)
package-anatomy.story-parts
stable· untested
Tagged XML backing store (XMLElement/XMLStory/Mapping)
package-anatomy.tagged-xml-backing-store
planned· untested
Stories & text · 16
Text caret + range selection (geometry, content selection)
stories-text.caret-selection
stable· 24 tests
Drag-and-drop text
stories-text.drag-drop-text
planned· untested
Endnotes
stories-text.endnotes
planned· untested
Insert field (page-number marker etc.) at offset
stories-text.fields.insert
stable· 1 test
Footnote bodies
stories-text.footnotes
stable· 1 test
Hidden text handling
stories-text.hidden-text
experimental· 1 test
Nested character styles (per-delimiter run restyling)
stories-text.nested-styles
stable· untested
Editorial notes (Note element)
stories-text.notes
experimental· 1 test
Overset handling (last-frame overflow clipped + reported)
stories-text.overset
stable· 4 tests
Auto page-number markers (current/next page)
stories-text.page-number-markers
stable· untested
Story model (paragraph/character run trees)
stories-text.story-model
stable· 6 tests
Apply style attributes to a text range (applyStyle op)
stories-text.style-apply-range
stable· 4 tests
Text wrap (bounding box / contour / jump modes + offsets)
stories-text.text-wrap
stable· 3 tests
Delete story range (Backspace/Delete + range)
stories-text.text.delete
stable· 13 tests
Insert text at story offset
stories-text.text.insert
stable· 17 tests
Tracked changes (insertions/deletions, author/date)
stories-text.tracked-changes
planned· untested
Tables · 12
Alternating row/column fills
tables.alternating-fills
stable· 2 tests
Table borders + row/column dividers
tables.borders-strokes
stable· untested
Per-cell text composition (cell as mini-frame)
tables.cell-composition
stable· untested
Cell diagonal lines
tables.cell-diagonals
stable· 2 tests
Cell rotation
tables.cell-rotation
stable· untested
Cell vertical justification
tables.cell-vertical-justification
stable· untested
Table model (rows, columns, cells)
tables.model
stable· 22 tests
Tables inside cells
tables.nested-tables
stable· untested
Row height constraints + column widths
tables.row-col-sizing
stable· untested
Row/column spans (cell merges)
tables.spans
stable· untested
Table/cell style cascade (region defaults)
tables.style-cascade
stable· untested
The renderer · 23
Typed collections read surface (21 collections)
the-renderer.collections-read
stable· 22 tests
CPU backend (tiny-skia, full feature coverage)
the-renderer.cpu-backend
stable· 50 tests
Scene-graph introspection (tree + property descriptors)
the-renderer.devtools-introspection
stable· 9 tests
Versioned display list IR (41 command kinds, path interning)
the-renderer.display-list
stable· 9 tests
Export diagnostics (preflight findings)
the-renderer.export-diagnostics
stable· 23 tests
Font registration (family/style → bytes, persists across loads)
the-renderer.font-registry
stable· 4 tests
WebGPU backend (Vello)
the-renderer.gpu-backend
stable· untested
Hit testing (oriented containment, layer-aware) + marquee
the-renderer.hit-testing
stable· 10 tests
Missing-asset degraded render (fallback font + placed-link placeholder)
the-renderer.missing-asset-fallback
experimental· 6 tests
OffscreenCanvas worker rendering (COOP/COEP + SAB)
the-renderer.offscreen-worker
stable· 10 tests
Package / collect for output (links + fonts + report) — IN SCOPE, not built
the-renderer.package-collect
planned· untested
PDF export (PDF 1.7 + PDF/X-4, deterministic)
the-renderer.pdf-export
stable· 24 tests
Export marks + bleed (crop/registration/color bars/page info)
the-renderer.pdf-export-marks
stable· 23 tests
Export font subsetting + embedding (fsType policy)
the-renderer.pdf-font-embedding
stable· 2 tests
Export image downsampling + JPEG re-encode
the-renderer.pdf-image-downsampling
stable· 1 test
Render pipeline (parse → scene → text → compose → raster)
the-renderer.pipeline
stable· 4 tests
Element properties read (authored/computed/source)
the-renderer.properties-read
stable· 24 tests
GPU scene cache (LRU, invalidation hints)
the-renderer.scene-cache
stable· 6 tests
Display-list structural digest (same-code-same-scene keystone)
the-renderer.scene-digest
stable· 1 test
Snap engine (page edges + sibling targets, 4 px tolerance)
the-renderer.snapping
stable· 16 tests
Page PNG snapshots (dpi-configurable)
the-renderer.snapshots
stable· 8 tests
Viewer session — camera present, page layout, events (the public SDK)
the-renderer.viewer-session
stable· 2 tests
@paged-media/idml-viewer — TS viewer (camera, pages, input lanes, events)
the-renderer.viewer-wrapper
stable· untested
Typography · 22
Baseline shift
typography.baseline-shift
stable· 3 tests
Bidirectional text reordering
typography.bidi
stable· untested
Capitalization (AllCaps/SmallCaps/CapToSmallCap)
typography.capitalization
stable· 3 tests
CJK vertical writing
typography.cjk-vertical-writing
stable· untested
Drop caps (characters/lines + detail scaling)
typography.drop-caps
stable· 1 test
Font selection + fallback (AppliedFont/FontStyle/PointSize)
typography.font-selection
stable· 14 tests
Hyphenation (TeX patterns; Proximity licensed)
typography.hyphenation
stable· 1 test
Hyphenation zone
typography.hyphenation-zone
stable· 2 tests
Word/letter spacing + glyph scaling (min/desired/max)
typography.justification-spacing
stable· untested
Kenten emphasis marks
typography.kenten
stable· untested
Kinsoku CJK line-break rules
typography.kinsoku
stable· untested
Knuth–Plass line breaking + justification modes
typography.knuth-plass
stable· untested
Leading (explicit pt / auto)
typography.leading
stable· 3 tests
Ligatures + OpenType feature toggles
typography.ligatures-opentype
stable· 5 tests
Mojikumi CJK spacing
typography.mojikumi
stable· untested
Position (superscript/subscript)
typography.position-super-subscript
stable· 3 tests
Ruby annotations
typography.ruby
stable· untested
HorizontalScale + Skew (false italic)
typography.scale-skew
stable· 4 tests
Tab stops (L/C/R/decimal + leaders)
typography.tab-stops
stable· 1 test
Tracking + kerning (metrics; optical falls back to metrics)
typography.tracking-kerning
stable· 4 tests
Underline / strikethrough decorations
typography.underline-strikethru
stable· 3 tests
VerticalScale
typography.vertical-scale
stable· 3 tests

141 features · commit-pinned snapshot · the same rows the team plans by

Conformance — claimed, and the evidence

Core format, verified

Character fill color
parsed · rendered · editable · editor panel
stable· 3 tests
Color groups (CRUD + membership)
parsed · editable · in the browser engine · editor panel · scripting
stable· 35 tests
ColorOverride specials (paper/black/registration)
parsed · rendered (planned)
stable· untested
Document defaults for new objects (fill/stroke/weight)
editable · in the browser engine
stable· 19 tests
Apply fill/stroke color + tint to frames
parsed · rendered · editable · in the browser engine · editor panel
stable· 21 tests
Gradients (linear/radial, stops + midpoints)
parsed · rendered · editable · in the browser engine · editor panel · editor gesture · scripting
stable· 39 tests
ICC color management (lcms2 native / qcms wasm)
rendered · in the browser engine · editor panel
stable· 19 tests
Ink management (convert-to-process, aliases, standard Lab)
editable · in the browser engine · editor panel
stable· 6 tests
Lab / mixed-ink / spot-without-CMYK
parsed · rendered (partial)
stable· 2 tests
CMYK overprint
parsed · rendered
stable· 1 test
Process CMYK/RGB + spot inks + tints
parsed · rendered · editor panel
stable· 8 tests
Swatch CRUD (create/edit/delete + .ase import/export)
parsed · editable · in the browser engine · editor panel · scripting
stable· 37 tests
Bevel & emboss
parsed · rendered · editable · editor panel (planned)
stable· 1 test
Blend modes (26 modes incl. multiply/screen/overlay)
parsed · rendered · editable · editor panel (planned)
stable· 1 test
Drop shadow (soft blur, offset, color, opacity)
parsed · rendered · editable · editor panel
stable· 7 tests
Feather (basic + directional)
parsed · rendered · editable · editor panel
stable· 1 test
Outer / inner glow
parsed · rendered · editable · editor panel
stable· 2 tests
Gradient feather
parsed · rendered · editable · editor gesture
stable· 3 tests
Inner shadow
parsed · rendered · editable · editor panel
stable· 2 tests
Object opacity
parsed · rendered · editable · in the browser engine · editor panel
stable· 11 tests
Opacity masks — a real per-pixel soft mask (luminosity or alpha, invertible)
rendered · editable · in the browser engine · paged.publish (partial) · paged.draw
stable· 6 tests
Satin
parsed · rendered (partial) · editable
stable· 1 test
Transparency groups (nested blend group buffering)
parsed · rendered (partial)
stable· untested
IDML container open (ZIP + mimetype validation)
parsed · in the browser engine · viewer SDK · editor canvas
stable· 3 tests
designmap parse (spreads, stories, resources wiring)
parsed
stable· untested
DOMVersion capture (version-agnostic parser)
parsed
stable· untested
Appearance stack bakes to a group of stacked page items (B-24)
paged.draw · editable · paged.publish
stable· untested
GraphicLine arrowheads (triangle/circle/bar)
parsed · rendered
stable· untested
Decorative corner options (Rounded/Inverse/Bevel/Inset/Fancy)
parsed · rendered · editable
stable· 2 tests
Corner options on polygons (B-23) — apply arms, renderer, IDML write path
editable · rendered (partial) · parsed · paged.publish
stable· untested
Delete frame
editable · in the browser engine
stable· 9 tests
Insert frame (rectangle) by bounds
editable · in the browser engine · editor gesture
stable· 49 tests
moveFrame wire op
in the browser engine
stable· 1 test
Groups (nesting + group transparency/blending + create/dissolve ops)
parsed · rendered · editable · in the browser engine · editor gesture
stable· 33 tests
Insert line (two-anchor open GraphicLine)
editable · in the browser engine · editor gesture
stable· 29 tests
Nested page items (paste-into) — parse, render clip, pasteInto/releaseFrom
parsed · rendered · editable · paged.publish
stable· untested
Page-item kinds (TextFrame, Rectangle, Oval, Polygon, GraphicLine, Group)
parsed · rendered
stable· untested
Path clipping/masking (non-zero winding)
rendered
stable· 1 test
closePath — close an open subpath (the faithful inverse of pathOpenAt)
editable · in the browser engine · paged.draw
stable· untested
Insert freehand path (optional smoothing)
editable · in the browser engine · editor gesture
stable· 29 tests
joinPaths — weld two open paths into one element
editable · in the browser engine · paged.draw
stable· untested
Pathfinder boolean (union/intersect/subtract/exclude)
editable · in the browser engine · editor panel
stable· 21 tests
Divide / Trim / Merge / Crop / Outline / Minus Back
editable · editor panel · paged.draw
stable· untested
Planar arrangement — faces of overlapping paths (B-22)
editable · in the browser engine
stable· untested
Ellipse / polygon shape tools
editable · in the browser engine · editor gesture
stable· 25 tests
Stroke alignment (center/inside/outside)
parsed · rendered (partial) · editable · editor panel (partial)
stable· 9 tests
Dashed + dotted strokes (dash arrays, 12 dotted variants)
parsed · rendered · editable · paged.draw
stable· 2 tests
Stroke gap color/tint
parsed · rendered · editable · editor panel
stable· 4 tests
Stroke overprint
parsed · rendered · editable
stable· 1 test
Striped / wavy strokes
parsed · rendered · editable
stable· 6 tests
Variable-width (tapered / pressure) strokes — per-anchor width outline
editable · editor gesture (partial)
stable· 6 tests
Stroke weight + line caps + joins
parsed · rendered · editable · editor panel
stable· 12 tests
Text on a path
parsed · rendered · editable · in the browser engine · paged.draw
stable· 2 tests
Bezier path geometry (PathPointType anchors + handles)
parsed · rendered · editable · editor gesture
stable· 8 tests
Compound paths (multi-contour subpath boundaries)
parsed · rendered
stable· 1 test
GeometricBounds (y1 x1 y2 x2, pt)
parsed · rendered · editable · in the browser engine · editor panel
stable· 3 tests
Image content transform (inner image within frame)
parsed · rendered · editable · in the browser engine · editor gesture
stable· 12 tests
ItemTransform (2×3 affine per frame/page)
parsed · rendered · editable · in the browser engine
stable· 2 tests
Path topology ops (insert/remove anchor, open-at, curve type)
editable · in the browser engine · editor gesture
stable· 23 tests
Composition part (paged/core/composition/document.pgd — arrangement)
in the browser engine · rendered (partial)
stable· 1 test
Full package IMPORT — IDML adapter (designmap, spreads, stories, resources)
parsed · rendered · in the browser engine · viewer SDK · editor canvas
stable· 7 tests
Graphic part (colors, swatches, gradients, inks, stroke styles)
parsed
stable· untested
Inline base64 image bytes (<Image><Properties><Contents>)
parsed · rendered
stable· untested
Native model part (paged/core/model/document.pgm — the self-owning document)
in the browser engine · rendered · editor canvas (planned)
stable· 1 test
The .paged container (ZIP-as-valid-IDML + plugin namespaces + manifest.json)
parsed · in the browser engine · editor canvas (planned)
stable· 5 tests
host.parts plugin persistence door (namespaced container parts that travel with the file)
in the browser engine · plugin API (partial) · editor canvas (planned)
stable· 6 tests
Story parts (ParagraphStyleRange / CharacterStyleRange trees)
parsed
stable· untested
Tagged XML backing store (XMLElement/XMLStory/Mapping)
parsed (planned)
planned· untested
Text caret + range selection (geometry, content selection)
in the browser engine · editor canvas · editor gesture (partial)
stable· 24 tests
Drag-and-drop text
editor gesture (planned)
planned· untested
Endnotes
parsed (planned)
planned· untested
Insert field (page-number marker etc.) at offset
editable · in the browser engine
stable· 1 test
Footnote bodies
parsed · rendered (partial)
stable· 1 test
Hidden text handling
parsed (partial)
experimental· 1 test
Nested character styles (per-delimiter run restyling)
parsed · rendered
stable· untested
Editorial notes (Note element)
parsed (partial)
experimental· 1 test
Overset handling (last-frame overflow clipped + reported)
parsed · rendered · in the browser engine · editor panel (partial)
stable· 4 tests
Auto page-number markers (current/next page)
parsed · rendered
stable· untested
Story model (paragraph/character run trees)
parsed · rendered
stable· 6 tests
Apply style attributes to a text range (applyStyle op)
editable · in the browser engine · editor panel
stable· 4 tests
Text wrap (bounding box / contour / jump modes + offsets)
parsed · rendered · editable · editor panel
stable· 3 tests
Delete story range (Backspace/Delete + range)
editable · in the browser engine · editor canvas
stable· 13 tests
Insert text at story offset
editable · in the browser engine · editor canvas · editor panel (partial)
stable· 17 tests
Tracked changes (insertions/deletions, author/date)
parsed (planned)
planned· untested
Alternating row/column fills
parsed · rendered
stable· 2 tests
Table borders + row/column dividers
parsed · rendered
stable· untested
Per-cell text composition (cell as mini-frame)
parsed · rendered
stable· untested
Cell diagonal lines
parsed · rendered
stable· 2 tests
Cell rotation
parsed · rendered
stable· untested
Cell vertical justification
parsed · rendered
stable· untested
Repeating header/footer rows across chain breaks
parsed · rendered · editable · in the browser engine
stable· untested
Table model (rows, columns, cells)
parsed · rendered · editable (partial) · in the browser engine (partial) · editor panel (partial)
stable· 22 tests
Tables inside cells
parsed · rendered
stable· untested
Row height constraints + column widths
parsed · rendered
stable· untested
Row/column spans (cell merges)
parsed · rendered · editable · in the browser engine
stable· untested
Table/cell style cascade (region defaults)
parsed · rendered
stable· untested
Typed collections read surface (21 collections)
in the browser engine · scripting
stable· 22 tests
CPU backend (tiny-skia, full feature coverage)
rendered
stable· 50 tests
Scene-graph introspection (tree + property descriptors)
viewer SDK
stable· 9 tests
Versioned display list IR (41 command kinds, path interning)
rendered · in the browser engine
stable· 9 tests
Export diagnostics (preflight findings)
rendered · editor panel (partial) · editor canvas (partial)
stable· 23 tests
Font registration (family/style → bytes, persists across loads)
in the browser engine · viewer SDK · editor panel (partial)
stable· 4 tests
WebGPU backend (Vello)
rendered (partial) · viewer SDK · editor canvas
stable· untested
Hit testing (oriented containment, layer-aware) + marquee
in the browser engine · editor canvas · editor gesture
stable· 10 tests
Missing-asset degraded render (fallback font + placed-link placeholder)
rendered (partial) · editor canvas (partial)
experimental· 6 tests
OffscreenCanvas worker rendering (COOP/COEP + SAB)
in the browser engine · editor canvas
stable· 10 tests
Package / collect for output (links + fonts + report) — IN SCOPE, not built
in the browser engine (planned) · editor shell (planned)
planned· untested
PDF export (PDF 1.7 + PDF/X-4, deterministic)
rendered · in the browser engine · editor shell · editor panel (partial)
stable· 24 tests
Export marks + bleed (crop/registration/color bars/page info)
rendered · editor shell · editor canvas
stable· 23 tests
Export font subsetting + embedding (fsType policy)
rendered
stable· 2 tests
Export image downsampling + JPEG re-encode
rendered
stable· 1 test
Render pipeline (parse → scene → text → compose → raster)
rendered · viewer SDK · editor canvas
stable· 4 tests
Element properties read (authored/computed/source)
in the browser engine · editor panel · scripting
stable· 24 tests
GPU scene cache (LRU, invalidation hints)
in the browser engine
stable· 6 tests
Display-list structural digest (same-code-same-scene keystone)
rendered · editor canvas
stable· 1 test
Snap engine (page edges + sibling targets, 4 px tolerance)
in the browser engine · editor canvas · editor gesture
stable· 16 tests
Page PNG snapshots (dpi-configurable)
in the browser engine · viewer SDK · editor canvas
stable· 8 tests
Viewer session — camera present, page layout, events (the public SDK)
viewer SDK
stable· 2 tests
@paged-media/idml-viewer — TS viewer (camera, pages, input lanes, events)
viewer SDK
stable· untested
Baseline shift
parsed · rendered · editable · editor panel
stable· 3 tests
Bidirectional text reordering
rendered
stable· untested
Capitalization (AllCaps/SmallCaps/CapToSmallCap)
parsed · rendered · editable · editor panel (partial)
stable· 3 tests
CJK vertical writing
parsed · rendered
stable· untested
Drop caps (characters/lines + detail scaling)
parsed · rendered · editable
stable· 1 test
Font selection + fallback (AppliedFont/FontStyle/PointSize)
parsed · rendered · editable · editor panel (partial)
stable· 14 tests
Hyphenation (TeX patterns; Proximity licensed)
parsed · rendered · editable
stable· 1 test
Hyphenation zone
parsed · rendered
stable· 2 tests
Word/letter spacing + glyph scaling (min/desired/max)
parsed · rendered
stable· untested
Kenten emphasis marks
parsed · rendered (partial)
stable· untested
Kinsoku CJK line-break rules
parsed · rendered (partial)
stable· untested
Knuth–Plass line breaking + justification modes
parsed · rendered
stable· untested
Leading (explicit pt / auto)
parsed · rendered · editable · editor panel
stable· 3 tests
Ligatures + OpenType feature toggles
parsed · rendered · editable · editor panel (partial)
stable· 5 tests
Mojikumi CJK spacing
parsed · rendered (partial)
stable· untested
Position (superscript/subscript)
parsed · rendered · editable · editor panel
stable· 3 tests
Ruby annotations
parsed · rendered (partial)
stable· untested
HorizontalScale + Skew (false italic)
parsed · rendered · editable · editor panel
stable· 4 tests
Tab stops (L/C/R/decimal + leaders)
parsed · rendered · editable · editor panel
stable· 1 test
Tracking + kerning (metrics; optical falls back to metrics)
parsed · rendered (partial) · editable · editor panel (partial)
stable· 4 tests
Underline / strikethrough decorations
parsed · rendered · editable · editor panel
stable· 3 tests
VerticalScale
parsed · rendered · editable · editor panel
stable· 3 tests

full reference: the “can it IDML?” page