Word fidelity

Word feature support matrix for the DOCX editor: rendering, round-trip behavior, security, and API stability.

Overview

  • Browser editor use is client-side. Parsing, rendering, editing, and serialization run in the browser for normal <DocxEditor> usage. Headless core, DocxReviewer, and MCP run wherever you host them.
  • .docx in, .docx out. The editor reads OOXML and writes OOXML. Parts of the file it does not edit are carried over from the original archive unchanged.
  • Apache 2.0, all published packages. SemVer, with the public API tracked by generated snapshots in CI. React and Vue parity is a machine-checked contract.
  • Commercial support: docx-editor@eigenpal.com.

Feature matrix

Every feature is tracked on three axes:

  • Editing: can a user (or an AI agent) change it in the editor?
  • Rendering: does it display the way Microsoft Word renders it?
  • Round-trip: does it survive open, then save, unchanged?

A construct the editor doesn't model is preserved byte-for-byte and written back on save; that's the "Preserved" status below.

55 features trackedFull43 editingPartial5 editingNo7 editing

Legend: Full = works like Word · Partial = works with noted limits · Render only = displays correctly, not editable · Preserved = round-trips losslessly without rendering · Planned = on the roadmap · No = not supported.

Text & formatting

FeatureEditingRenderingRound-tripNotes
Bold, italic, underline, strikethroughFullFullFull
Subscript & superscriptFullFullFull
Font family & sizeFullFullFullCustom fonts registered via the fonts prop; theme fonts resolved from the OOXML theme.
Embedded fontsPartialFullPreservedFonts embedded in the file (word/fonts) are de-obfuscated and rendered, and become selectable in the toolbar under a Document fonts group. The embedded binaries are preserved on save; the editor does not add new embedded fonts.
Text color (RGB + theme colors)FullFullFullTheme color references (accent1...) are kept as references, not flattened to hex.
Highlight & shadingFullFullFullWord highlight palette plus arbitrary w:shd fills.
Right-to-left & bidirectional textFullFullFullBidi layout with mirrored alignment; Hebrew locale ships in @eigenpal/docx-editor-i18n.

Paragraphs & styles

FeatureEditingRenderingRound-tripNotes
Alignment & justificationFullFullFull
Line & paragraph spacingFullFullFull
Indentation (incl. hanging indents)FullFullFull
Paragraph styles (Heading 1, Quote, custom styles)FullFullFullStyle picker applies document styles, including custom styles with their numbering and indents. Defining new styles in the UI is not supported yet.
Paragraph borders & fillsFullFullFull
Tab stops & leadersPartialFullFullExisting tab stops render (incl. right-tabs and dotted leaders in TOCs); a tab-stop editing UI is not built yet.

Lists & numbering

FeatureEditingRenderingRound-tripNotes
Bullet lists (multi-level)FullFullFull
Numbered lists (decimal, roman, letters)FullFullFull
Custom numbering definitions & style-linked numberingFullFullFullNumbering attached to custom paragraph styles resolves with Word’s precedence rules.
List continuation & restartFullFullFull

Tables

FeatureEditingRenderingRound-tripNotes
Table insertion & cell editingFullFullFull
Row/column insert, delete, resizeFullFullFullResize commits Word-compatible twip widths. Agent-API table mutation is read-only for now.
Cell borders & shadingFullFullFull
Merged cells (horizontal & vertical)FullFullFull
Tables split across pagesFullFullFullRows split mid-content with correct cut borders; vertically merged cells repaint on continuation pages like Word.
Nested tablesFullFullFull
Table styles & conditional formatting (header row, banding)PartialFullFullcnfStyle conditional formatting renders and round-trips; switching table styles from the UI is not built yet.

Images & drawings

FeatureEditingRenderingRound-tripNotes
Inline images (paste, drag-drop, resize)FullFullFull
Floating images & wrap modes (square, topAndBottom...)FullFullFullDrag-to-reposition and edge resize with Word-style handles; text reflows around float zones.
WMF / EMF legacy vector imagesNoPlannedFullThe original WMF/EMF bytes are parsed and preserved losslessly on save, but browsers cannot decode these legacy metafiles, so the image does not yet display. On-the-fly conversion (vector where possible, raster fallback) is planned.
Tracked image insert/deleteFullFullFull
Text boxes & shapesPartialPartialPartialAnchored text boxes render (incl. page-anchored letterhead shapes in headers) and round-trip. Standalone drawn shapes (rect, oval, line) parse and serialize but do not yet render; custom-geometry shapes degrade to a rectangle on save.

Page layout, headers & footers

FeatureEditingRenderingRound-tripNotes
True pagination (Word-metric pages)FullFullFullThe layout engine paginates like Word: page breaks, keep rules, split paragraphs marked across pages.
Sections (margins, size, orientation, per-section headers)PartialFullFullMargins editable; mid-body sectPr (section breaks) render and round-trip, inserting new sections from the UI is not built yet.
Headers & footers (edit in place)FullFullFullSame editing model as the body: tracked changes, fields, images and tables work inside headers/footers.
Watermarks (text & image)FullFullFull
Footnotes & endnotesFullFullFullEditable note bodies with auto-numbering; tracked changes work inside notes; note references inside tables paginate correctly.
Multi-column layoutNoPartialPreservedColumn definitions are preserved on round-trip; rendering flows single-column today.

Review: tracked changes, comments, notes

FeatureEditingRenderingRound-tripNotes
Tracked changes (insert, delete, format)FullFullFullFull revision model incl. structural changes (paragraph breaks, paragraph props, table rows/cells). Opens cleanly in Word’s review pane.
Accept / reject changes (UI + API)FullFullFullPer-change and bulk accept/reject in the sidebar; headless acceptChangeById/rejectChangeById. Deliberately not exposed as agent tools: humans decide.
Comments (threads, replies, resolve)FullFullFull
AI redlining (agent-proposed tracked changes)FullFullFullAgents propose Word-native tracked changes via suggest_change; live in the editor, headless via DocxReviewer, or over MCP.
FeatureEditingRenderingRound-tripNotes
Hyperlinks (external)FullFullFull
Bookmarks & internal linksNoPartialFullParsed and preserved losslessly; bookmark editing UI is deferred.
PAGE / NUMPAGES fieldsFullFullFullInsertable in headers/footers; values recompute as the layout paginates.
Table of contentsNoFullFullExisting TOCs render with tab leaders and working links; TOC regeneration is left to Word.
Other field codes (DATE, REF, MERGEFIELD...)NoPartialPreservedLast-computed field results display; the field codes themselves round-trip untouched.

Document structure & content controls

FeatureEditingRenderingRound-tripNotes
Content controls (SDT): block, inlineFullFullFullAddressable by tag/id/alias from the headless API; works inside footnotes too.
Repeating section controlsFullFullFull
Dropdown, checkbox & date controlsFullFullFull
Custom XML parts & data bindingNoNoPreservedcustomXml parts and w:dataBinding round-trip byte-stable; no binding evaluation.
VBA macros & form fields (legacy)NoNoPreservedNever executed, by design (client-side security); the parts survive open -> save.

Collaboration, i18n & editing UX

FeatureEditingRenderingRound-tripNotes
Realtime collaboration (Yjs)FullFullFullLive cursors, presence, comment sync, per-author tracked-change attribution.
Find & replaceFullFullFull
Rich copy/paste (HTML clipboard)FullFullFull
Undo / redoFullFullFull
Editor UI in 9 languagesFullFullFullen, de, fr, he, hi, pl, pt-BR, tr, zh-CN via @eigenpal/docx-editor-i18n.
AI agent toolkit (14 tools, 3 transports)FullFullFullLive editor bridge, headless DocxReviewer, MCP server; Word-JS-API-shaped.

Rendering fidelity

The editor runs two renderers at once. A hidden ProseMirror instance owns the editing state (document, selection, undo history, keyboard and IME input) and is never shown. On every change, a layout painter rebuilds the visible pages from that state using Word's own metrics: twips, the document's fonts and themes, its section and margin geometry. The browser never decides where a line or page breaks; the painter does. The output stays plain DOM text rather than a canvas bitmap.

The full comparison with contenteditable and canvas approaches is in Architecture. To judge fidelity yourself, open one of your own documents in the live demo next to Word.

Round-trip behavior

A .docx file is a ZIP of XML parts, and Word writes a lot of XML the editor has no reason to model: bookmarks, custom XML parts, mail-merge fields, compatibility settings, VBA projects.

This editor's pipeline is parse → document model → edit → serialize. On save it rewrites only the parts it changed (the body, plus headers, footers, comments and notes when touched) and repacks every other part of the original archive as-is: styles.xml, themes, the font table, settings, media, relationships, custom XML. Concretely:

  • Unmodeled XML elements and attributes are kept and re-emitted in place. (One exception: legacy run-level VML drawn shapes other than watermarks, namely v:rect, v:line, and non-text v:shape, are not yet modeled or preserved.)
  • Whole parts the editor never touches (custom XML, VBA projects, embedded fonts, OLE objects) are copied through the ZIP untouched.
  • References stay intact: relationship IDs, bookmark names, field codes, style IDs and numbering definitions are not renamed or renumbered.
  • Output is canonical OOXML, not merely valid: tracked changes are real w:ins/w:del revisions Word's review pane understands, theme colors stay theme references, numbering keeps its definitions.

How it's tested: a parity corpus of real documents is round-tripped in CI and compared structurally; serializer unit tests assert revision markup, conditional table formatting and section properties survive; 500+ Playwright tests drive the editor against Word-derived expectations.

What this does not mean: bit-identical files. The ZIP container is rebuilt and XML is re-serialized, so whitespace and part ordering can differ. The goal is semantic preservation: content you did not edit should not be lost or reinterpreted. A document that breaks this behavior is a bug; attach it to a GitHub issue.

Security

  • Normal editor use is browser-only. The editor package does not upload documents or call a conversion API.
  • No macro execution. VBA macros and embedded code are not evaluated.
  • AI integrations are host-controlled. With the agents toolkit, the live-editor setup keeps the DOCX file client-side and sends chat/tool-call text to a route you own. Headless review and MCP setups run wherever you host them.

Bundle and performance

  • -core ships subpath exports that tree-shake independently.
  • ProseMirror packages are peers so your package manager can share one copy.
  • Lazy-load the editor (next/dynamic, React.lazy) to keep it out of the initial bundle.
  • The layout engine caches per-block measurements; an edit doesn't re-measure the document.

No published benchmarks; test with your own documents in the live demo.

Stability, license and support

  • Apache 2.0, all packages. Contributions need a one-time CLA.
  • SemVer via changesets; all packages share one version number.
  • The public API is tracked by API Extractor snapshots; CI fails on drift.
  • React/Vue parity is a checked contract; agentPanel and controlled comments are still React-only.
  • layout-engine, layout-painter, layout-bridge and plugin-api are @experimental.
  • Some advanced fidelity features may move to a commercial plan later; everything published stays Apache 2.0.

If a feature you need is Partial or missing, open an issue with a sample .docx, or email docx-editor@eigenpal.com for priority features and support contracts.

Next steps

On this page