Supported features
The tables below show how each document feature behaves across the three stages of the conversion pipeline:
- Import converts DOCX content into Tiptap JSON.
- Editor renders that JSON in the browser. Each node and mark type requires a matching Tiptap extension to display correctly.
- Export converts the editor's content back into a DOCX file.
A feature can be supported at one stage and unsupported at another. For example, subscript text is imported and rendered correctly, but the export extension does not yet write it back to DOCX.
Import and export each have two integration paths: an editor extension and a REST API. For most features, both paths produce identical results. Where they differ (footnotes, headers/footers, export customization), the relevant install pages document the specifics.
Editor column assumes ConvertKit
The editor column in the tables below assumes the recommended setup: ConvertKit installed as the editor's extension kit. ConvertKit is a superset of the basics (StarterKit-equivalent nodes plus DOCX-aware overrides for Paragraph, Heading, Image, and the table stack). Without ConvertKit, paragraph spacing and indentation, image cropping, and table cell formatting are extracted into the JSON but dropped by the editor's schema. Where editor support depends on something else (Pages, a custom extension), the row notes the dependency.
Other formats
These tables describe the DOCX pipeline specifically because DOCX is the reference format that all other exports build on. PDF, ODT, EPUB, and DOC each work by first generating a DOCX file and then converting it to the target format via a cloud service. Features that work in DOCX export generally carry through, though each format may introduce its own limitations. See the respective format pages for details.
Markdown follows a completely separate conversion path and supports a different set of features. It is documented on its own page.
Inline formatting
| Feature | Import | Editor | Export |
|---|---|---|---|
| Bold | ✓ | ✓ | ✓ |
| Italic | ✓ | ✓ | ✓ |
| Underline | ✓ | ✓ | ✓ |
| Strikethrough | ✓ | ✓ | ✓ |
| Subscript | ✓ | ✓ | ✕ |
| Superscript | ✓ | ✓ | ✕ |
| Inline code | ✓ | ✓ | ✓ |
| Text color | ✓ | ✓ | ✓ |
| Highlight | ✓ | ✓ | ✓ |
| Font family | ✓ | ✓ | ✓ |
| Font size | ✓ | ✓ | ✓ |
| Hyperlinks | ✓ | ✓ | ✓ |
| Tabs | ~ | ~ | ✕ |
| Internal bookmarks | ~ | ~ | ✕ |
Block elements
| Feature | Import | Editor | Export |
|---|---|---|---|
| Paragraphs | ✓ | ✓ | ✓ |
| Headings 1 to 6 | ✓ | ✓ | ✓ |
| Blockquotes | ✓ | ✓ | ✓ |
| Code blocks | ✕ | ✓ | ✕ |
| Horizontal rules | ✓ | ✓ | ✓ |
| Hard breaks | ✓ | ✓ | ✓ |
Text and paragraph styling
The import service extracts paragraph-level styling attributes like spacing, indentation, and line height from the DOCX source. ConvertKit's custom Paragraph and Heading render them automatically. For typography from the document's named-style catalog (Heading 1, Normal, Quote, etc.), use the experimental CSS injection feature, which extracts the catalog as scoped CSS rules.
| Feature | Import | Editor | Export |
|---|---|---|---|
| Text alignment | ✓ | ✓ | ✓ |
| Line spacing | ✓ | ✓ | ✕*** |
| Paragraph spacing | ✓ | ✓ | ✕ |
| Indentation | ✓ | ✓ | ✕ |
| Letter spacing | ✓ | ✕* | ✕ |
| Paragraph borders | ✕ | ✕ | ✕ |
| Word styles | ~ | ~** | ~ |
* Letter spacing is extracted as textStyle.letterSpacing but no bundled extension renders it. To render imported letter spacing, extend TextStyle.
** Word's named-style typography is not applied by default. Use CSS injection to extract it as scoped CSS.
*** Line height imports as a paragraph node attribute and renders correctly in the editor with ConvertKit. The DOCX export reads line height from a textStyle mark instead, so round-trip is broken: imported values are present in the editor but dropped on export.
Lists
| Feature | Import | Editor | Export |
|---|---|---|---|
| Bullet lists | ✓ | ✓ | ✓ |
| Ordered lists | ✓ | ✓ | ✓ |
| Ordered list numbering format | ~ | ✓ | ✕ |
| Nested lists | ✓ | ✓ | ✓ |
| Task lists | ✕ | ✓ | ✕ |
Tables
The cell- and row-level attributes (backgrounds, borders, vertical alignment, height) require ConvertKit's ConvertTableKit, which is included by default. With the standalone @tiptap/extension-table, these attributes are extracted into the JSON but dropped by the editor's schema. For paginated layout via the Pages extension, use PagesTableKit instead; its table extensions internally extend ConvertKit's, so the same DOCX cell attributes flow through. See the tables content reference for the exact composition.
| Feature | Import | Editor | Export |
|---|---|---|---|
| Basic tables | ✓ | ✓ | ✓ |
| Merged cells (colspan) | ✓ | ✓ | ✓ |
| Merged cells (rowspan) | ✓ | ✓ | ✓ |
| Table header rows | ✓ | ✓ | ✕ |
| Column widths | ✓ | ✓ | ✓ |
| Cell backgrounds | ✓ | ✓ | ✕ |
| Cell borders | ✓ | ✓ | ✕ |
| Cell vertical alignment | ✓ | ✓ | ✕ |
| Row height | ✓ | ✓ | ✕ |
Media
| Feature | Import | Editor | Export |
|---|---|---|---|
| Inline images | ✓ | ✓ | ✓ |
| Floating images | ~ | ✕ | ✕ |
| Image dimensions | ✓ | ✓ | ✓ |
| Image cropping | ✓ | ~* | ✕ |
| Math and equations | ✕ | ✓ | ✓ |
* ConvertKit's custom Image declares cropTop/cropBottom/cropLeft/cropRight and emits them as data-crop-* attributes. To produce a visual crop, add CSS that translates those data attributes into clip-path or object-position.
Page layout
| Feature | Import | Editor | Export |
|---|---|---|---|
| Page breaks | ✓ | ~ | ✓ |
| Headers and footers | ✓* | ✓ | ✓ |
| Sections | ~ | ✕ | ✕ |
| Page size and margins | ✕ | ✓ | ✓ |
| Page numbers | ✕ | ✓ | ~ |
| Footnotes | ✓* | ✕ | ✕ |
| Endnotes | ✓* | ✕ | ✕ |
* Import behavior differs between integration paths. The REST API returns footnotes, endnotes, and headers/footers as separate fields in the response. The editor extension auto-applies headers and footers via the Pages extension but does not surface footnote or endnote data. See the install pages for details.
Page layout requires the Pages extension
Headers, footers, page breaks, and paginated layout all require the Pages extension for editor rendering. Without it, these features have nowhere to render even if the conversion service produces them.
Not supported
These features are not converted or have limited conversion during import.
| Feature | Status |
|---|---|
| Comments and annotations | Not converted. The comments extension exists but is not connected to conversion. |
| Tracked changes and revisions | Not converted. The tracked changes extension exists but is not connected to conversion. |
| Table of Contents | Imported as tableOfContents node (title and heading range). A custom extension is needed to render it in the editor. The existing Table of Contents extension is a headless utility for building sidebar navigation, not a document block renderer. Not exported. |
| Text boxes | Not converted. Content inside text boxes is not extracted. |
| Shapes, SmartArt, WordArt | Not converted. These elements are not extracted during import. |
| Field codes (DATE, AUTHOR, PAGE, MERGEFIELD) | The cached display value is preserved as plain text (e.g., a DATE field showing "April 10, 2026" imports as the text "April 10, 2026"). The field code itself is not converted, so the value becomes static and will not update. |
| Document metadata (author, title, keywords) | Not converted. Metadata is not included in the JSON output. |
| Form fields and content controls | Not converted. Inline structured document tags (SDTs) have their text content preserved, but the control metadata is discarded. |
| Hidden text | Text runs marked as hidden (w:vanish) are excluded from the import output. |
| Right-to-left text direction | DOCX <w:bidi> (paragraph direction) and <w:rtl> (run direction) are not parsed on import or written on export. Documents authored in Arabic, Hebrew, Persian, Urdu, and other RTL languages render with the editor's CSS direction (LTR by default). Set dir="rtl" on the editor root or detect language at the application level to handle this today. See Text alignment for details. |