unstale

npm / @tiptap/core

@tiptap/core

What changed in @tiptap/core 2 to 3, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-19.

5 breaking1 security28 new APIs and options2 performance4 behavior and defaults37 fixes and other

See which of these apply to your code, ranked, in your agent:

npx @unstale/cli init

@unstale/cli 0.2.0 on npm

@tiptap/core 368 changes

Breaking changes 2

  • Node view getPos() returns undefined when its position cannot yet be resolved, rather than throwing.

    3.29.0release notes

  • When attributes are omitted, extendMarkRange uses the first mark's attributes; passing an empty object restores the previous behavior.

    3.22.0release notes

Security 1

  • Adds a chainable extension API to transform pasted HTML before it is parsed, enabling cleanup, removal of dangerous content, and other modifications.

    3.20.0release notes

New APIs and options 24

  • New helpers check whether a value is a specific ProseMirror type.

    3.30.1release notes

  • Extensions can declare decorations directly through a hook, avoiding a hand-written ProseMirror plugin and plugin-state mapping.

    3.30.0release notes

  • With update set to 'changedRanges', rescans only blocks that actually changed instead of rebuilding decorations across the whole document.

    3.30.0release notes

  • Adds inline decorations for styling a range of text.

    3.30.0release notes

  • Adds node decorations for putting attributes on a block’s DOM element.

    3.30.0release notes

  • Adds widget decorations that render a custom element at a single position.

    3.30.0release notes

  • Adds a helper that returns the block-level sibling before the cursor’s textblock, or null at the first child of the block parent.

    3.30.0release notes

  • Widgets accept the ProseMirror ignoreSelection option.

    3.30.0release notes

  • Adds a renderer for React components in widget decorations that keeps them inside the existing app context.

    3.30.0release notes

  • Widgets accept the ProseMirror relaxedSide option.

    3.30.0release notes

  • Lets decoration implementations skip transactions that do not affect the data they depend on.

    3.30.0release notes

  • Widgets accept the ProseMirror side option.

    3.30.0release notes

  • Widgets accept the ProseMirror stopEvent option.

    3.30.0release notes

  • With update set to 'manual', decorations driven by external data can be refreshed through an editor command.

    3.30.0release notes

  • Adds a renderer for Vue components in widget decorations that keeps them inside the existing app context.

    3.30.0release notes

  • Adds a command to insert the default textblock allowed at a position, with optional position, attributes, content, and selection-update options.

    3.29.0release notes

  • Ordered lists preserve their HTML type through round-trips; paste and Markdown recognize typed markers, and adjacent lists with different types are not merged.

    3.27.0release notes

  • Adds a utility that compares two attribute objects for equality regardless of key ordering.

    3.25.0release notes

  • Adds the clearable mark option, defaulting to true; unsetAllMarks skips marks set to false.

    3.25.0release notes

  • Adds a utility that compares arrays of mark objects by type and attributes using attrsEqual.

    3.25.0release notes

  • This opt-in option makes the component re-render on every position shift so calls to getPos() stay current in render output.

    3.23.5release notes

  • Adds a utility for handling style properties, used by several extensions.

    3.23.2release notes

  • Adds an option to node view renderers that makes the selected prop true when a TextSelection is fully inside the node's range, as well as on NodeSelection.

    3.22.5release notes

  • Global attributes accept shorthand string values for types: '*' applies to all nodes and marks, 'nodes' to all nodes excluding text, and 'marks' to all marks.

    3.20.0release notes

Performance 1

  • NodeViews no longer re-render when decorations or position change without content changes.

    3.23.5release notes

Behavior and default changes 3

  • Reusing a widget key keeps the component instance mounted while the document changes around it, preserving local state.

    3.30.0release notes

  • ListKeymap registers a Tab shortcut that moves a top-level textblock at the start of the paragraph into the previous list’s last item.

    3.30.0release notes

  • Markdown encoding detection now checks the extension spec's code flag rather than hardcoded type names, affecting which content is skipped during encoding.

    3.22.0release notes

Fixes and other changes 37

  • Nested sibling elements now render properly by spreading children arrays into DOMOutputSpec.

    3.30.3release notes

  • editor.chain and editor.can can now be accessed during editor initialization.

    3.30.2release notes

  • Mixed JSX children are kept as separate siblings in DOM output.

    3.30.2release notes

  • Fixes failures when prosemirror-model is loaded more than once.

    3.30.0release notes

  • Fixes failures when prosemirror-model is loaded more than once.

    3.30.0release notes

  • Fixes failures when prosemirror-model is loaded more than once.

    3.30.0release notes

  • Deleting an AllSelection now collapses the selection to a text cursor instead of leaving a phantom selection highlight.

    3.29.0release notes

  • editor.$pos() now returns the correct node inside container nodes, such as the list rather than the list item.

    3.29.0release notes

  • Input rules no longer crash when matched text spans an inline atom node, such as a mention.

    3.29.0release notes

  • Changed the platform comparison to use .includes(), avoiding a TypeScript build error with some lib.dom.d.ts typings; runtime behavior is unchanged.

    3.29.0release notes

  • The editor now has a usable state seeded from the stripped fallback document before onContentError fires, allowing commands to be called in the handler on initial load.

    3.29.0release notes

  • deleteSelection now deletes content across all selection ranges instead of only the first, restoring multi-cell table selections and other custom selections with multiple ranges.

    3.27.3release notes

  • Compares mark arrays as multisets, so mark order does not affect equality; its type signature also accepts ProseMirror Mark objects.

    3.27.0release notes

  • Supports word characters at the start of class and id attributes.

    3.27.0release notes

  • Handles null-ish values inside marks or nodes without failing.

    3.27.0release notes

  • Dragging an inline or resizable image within the editor moves it instead of inserting a duplicate.

    3.25.0release notes

  • Plain-text copies of table cell selections exclude unselected cells between selected ranges and preserve document order for reverse selections.

    3.25.0release notes

  • Deletion now expands the selection to include entire inline node boundaries when handling inline nodes with text* content, preventing incorrect collapse of inline text nodes.

    3.23.6release notes

  • $pos() now returns the correct node for non-text atom nodes instead of the doc node.

    3.23.5release notes

  • Fixes HTML entity encoding for inline style attributes in getHTML() output.

    3.23.2release notes

  • Fixes text selection collapsing after toggling off a list with AllSelection.

    3.22.4release notes

  • Fixed document corruption when inserting inline content with marks at the start of a paragraph; the from - 1 position adjustment now applies only to block-level content.

    3.22.3release notes

  • Fixes list toggling when the entire document is selected.

    3.22.2release notes

  • Pasting at the end of a marked text node now places the selection correctly and respects inclusive marks.

    3.22.2release notes

  • NodeViews now re-render when a node's position changes without content or decoration changes, such as when a sibling moves within the same parent.

    3.22.1release notes

  • NodeViews no longer stop dragover and dragenter events, preventing spurious drag-copy cursors.

    3.22.1release notes

  • The default attributes are now considered against the first mark of the given type.

    3.22.0release notes

  • Markdown parsing decodes common HTML entities; serialization re-encodes <, >, and &, while preserving double quotes and literal characters inside code.

    3.22.0release notes

  • ResizableNodeView now respects a node's inline setting by using inline-flex for inline nodes and flex for block nodes.

    3.22.0release notes

  • Mark delete event handling is guarded when unsetMark removes a mark from inline content starting at position 0, preventing a RangeError.

    3.22.0release notes

  • Fixed isNodeEmpty() so multiline text containing non-whitespace content is not treated as empty when ignoreWhitespace is enabled.

    3.20.3release notes

  • Fixed overlapping bold and italic markdown serialization and round-tripping.

    3.20.3release notes

  • Empty paragraphs in top-level and nested block content now serialize with natural blank-line spacing or &nbsp; markers, and parsing preserves them when converting markdown back to JSON.

    3.20.2release notes

  • Fixes inline style parsing for values containing : or ; and skips incomplete declarations.

    3.20.1release notes

  • Fixes checking whether a mark is active and toggling marks off when part of the selection does not allow the mark, such as in a code block.

    3.20.0release notes

  • Fixed the ResizableNodeView contentDOM getter to return null instead of undefined for TypeScript compatibility.

    3.17.1release notes

  • Fixed $nodes() to correctly return inline nodes such as text and mention nodes.

    3.17.1release notes

@tiptap/core 29 changes

Breaking changes 3

  • The command now emits updates by default.

    2.0.0upgrade guide

  • The command no longer splits text nodes at the beginning.

    2.0.0upgrade guide

  • The signature is now (content, options), and the command emits updates by default.

    2.0.0upgrade guide

New APIs and options 4

  • Mark.create can define a mark view to render custom views for marks within the editor.

    2.0.0upgrade guide

  • New delete event tracking is available.

    2.0.0upgrade guide

  • Setting element to null opts into creating an editor on the server without rendering.

    2.0.0upgrade guide

  • Support for validating node and mark attributes is added.

    2.0.0upgrade guide

Performance 1

  • Transaction handling has performance improvements.

    2.0.0upgrade guide

Behavior and default changes 1

  • The NodeViewRendererProps function can now return undefined, so callers should handle that case.

    2.0.0upgrade guide