# What changed in @tiptap/core

> 77 changes in @tiptap/core 2 to 3 from its official release notes, upgrade guides and advisories: 5 breaking, 1 security, 28 new APIs and options. Each one cited. Sources checked 2026-10-19. HTML: https://unstale.sh/npm/@tiptap/core/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## @tiptap/core 3

### Breaking changes

- Node view `getPos()` returns `undefined` when its position cannot yet be resolved, rather than throwing. (3.29.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3290)
- When attributes are omitted, extendMarkRange uses the first mark's attributes; passing an empty object restores the previous behavior. (3.22.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3220)

### Security

- Adds a chainable extension API to transform pasted HTML before it is parsed, enabling cleanup, removal of dangerous content, and other modifications. (3.20.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3200)

### New APIs and options

- New helpers check whether a value is a specific ProseMirror type. (3.30.1) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3301)
- Extensions can declare decorations directly through a hook, avoiding a hand-written ProseMirror plugin and plugin-state mapping. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- With update set to 'changedRanges', rescans only blocks that actually changed instead of rebuilding decorations across the whole document. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Adds inline decorations for styling a range of text. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Adds node decorations for putting attributes on a block’s DOM element. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Adds widget decorations that render a custom element at a single position. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- 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.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Widgets accept the ProseMirror ignoreSelection option. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Adds a renderer for React components in widget decorations that keeps them inside the existing app context. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Widgets accept the ProseMirror relaxedSide option. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Lets decoration implementations skip transactions that do not affect the data they depend on. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Widgets accept the ProseMirror side option. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Widgets accept the ProseMirror stopEvent option. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- With update set to 'manual', decorations driven by external data can be refreshed through an editor command. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Adds a renderer for Vue components in widget decorations that keeps them inside the existing app context. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Adds a command to insert the default textblock allowed at a position, with optional position, attributes, content, and selection-update options. (3.29.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3290)
- 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.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3270)
- Adds a utility that compares two attribute objects for equality regardless of key ordering. (3.25.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3250)
- Adds the `clearable` mark option, defaulting to `true`; `unsetAllMarks` skips marks set to `false`. (3.25.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3250)
- Adds a utility that compares arrays of mark objects by type and attributes using `attrsEqual`. (3.25.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3250)
- This opt-in option makes the component re-render on every position shift so calls to getPos() stay current in render output. (3.23.5) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3235)
- Adds a utility for handling style properties, used by several extensions. (3.23.2) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3232)
- 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.5) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3225)
- 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.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3200)

### Performance

- NodeViews no longer re-render when decorations or position change without content changes. (3.23.5) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3235)

### Behavior and default changes

- Reusing a widget key keeps the component instance mounted while the document changes around it, preserving local state. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- 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.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- 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.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3220)

### Fixes and other changes

- Nested sibling elements now render properly by spreading children arrays into DOMOutputSpec. (3.30.3) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3303)
- editor.chain and editor.can can now be accessed during editor initialization. (3.30.2) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3302)
- Mixed JSX children are kept as separate siblings in DOM output. (3.30.2) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3302)
- Fixes failures when prosemirror-model is loaded more than once. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Fixes failures when prosemirror-model is loaded more than once. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Fixes failures when prosemirror-model is loaded more than once. (3.30.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3300)
- Deleting an `AllSelection` now collapses the selection to a text cursor instead of leaving a phantom selection highlight. (3.29.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3290)
- `editor.$pos()` now returns the correct node inside container nodes, such as the list rather than the list item. (3.29.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3290)
- Input rules no longer crash when matched text spans an inline atom node, such as a mention. (3.29.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3290)
- 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.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3290)
- 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.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3290)
- 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.3) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3273)
- Compares mark arrays as multisets, so mark order does not affect equality; its type signature also accepts ProseMirror Mark objects. (3.27.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3270)
- Supports word characters at the start of class and id attributes. (3.27.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3270)
- Handles null-ish values inside marks or nodes without failing. (3.27.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3270)
- Dragging an inline or resizable image within the editor moves it instead of inserting a duplicate. (3.25.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3250)
- Plain-text copies of table cell selections exclude unselected cells between selected ranges and preserve document order for reverse selections. (3.25.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3250)
- 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.6) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3236)
- $pos() now returns the correct node for non-text atom nodes instead of the doc node. (3.23.5) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3235)
- Fixes HTML entity encoding for inline style attributes in getHTML() output. (3.23.2) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3232)
- Fixes text selection collapsing after toggling off a list with AllSelection. (3.22.4) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3224)
- 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.3) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3223)
- Fixes list toggling when the entire document is selected. (3.22.2) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3222)
- Pasting at the end of a marked text node now places the selection correctly and respects inclusive marks. (3.22.2) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3222)
- 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.1) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3221)
- NodeViews no longer stop dragover and dragenter events, preventing spurious drag-copy cursors. (3.22.1) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3221)
- The default attributes are now considered against the first mark of the given type. (3.22.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3220)
- Markdown parsing decodes common HTML entities; serialization re-encodes <, >, and &, while preserving double quotes and literal characters inside code. (3.22.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3220)
- ResizableNodeView now respects a node's inline setting by using inline-flex for inline nodes and flex for block nodes. (3.22.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3220)
- Mark delete event handling is guarded when unsetMark removes a mark from inline content starting at position 0, preventing a RangeError. (3.22.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3220)
- Fixed isNodeEmpty() so multiline text containing non-whitespace content is not treated as empty when ignoreWhitespace is enabled. (3.20.3) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3203)
- Fixed overlapping bold and italic markdown serialization and round-tripping. (3.20.3) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3203)
- 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.2) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3202)
- Fixes inline style parsing for values containing `:` or `;` and skips incomplete declarations. (3.20.1) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3201)
- 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.0) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3200)
- Fixed the ResizableNodeView contentDOM getter to return null instead of undefined for TypeScript compatibility. (3.17.1) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3171)
- Fixed $nodes() to correctly return inline nodes such as text and mention nodes. (3.17.1) — [release notes](https://github.com/ueberdosis/tiptap/blob/db790a7c5a6009b0a94382e12e1a5e9c642e1660/packages/core/CHANGELOG.md#3171)

## @tiptap/core 2

### Breaking changes

- The command now emits updates by default. (2.0.0) — [upgrade guide](https://tiptap.dev/docs/guides/upgrade-tiptap-v2)
- The command no longer splits text nodes at the beginning. (2.0.0) — [upgrade guide](https://tiptap.dev/docs/guides/upgrade-tiptap-v2)
- The signature is now (content, options), and the command emits updates by default. (2.0.0) — [upgrade guide](https://tiptap.dev/docs/guides/upgrade-tiptap-v2)

### New APIs and options

- Mark.create can define a mark view to render custom views for marks within the editor. (2.0.0) — [upgrade guide](https://tiptap.dev/docs/guides/upgrade-tiptap-v2)
- New delete event tracking is available. (2.0.0) — [upgrade guide](https://tiptap.dev/docs/guides/upgrade-tiptap-v2)
- Setting element to null opts into creating an editor on the server without rendering. (2.0.0) — [upgrade guide](https://tiptap.dev/docs/guides/upgrade-tiptap-v2)
- Support for validating node and mark attributes is added. (2.0.0) — [upgrade guide](https://tiptap.dev/docs/guides/upgrade-tiptap-v2)

### Performance

- Transaction handling has performance improvements. (2.0.0) — [upgrade guide](https://tiptap.dev/docs/guides/upgrade-tiptap-v2)

### Behavior and default changes

- The NodeViewRendererProps function can now return undefined, so callers should handle that case. (2.0.0) — [upgrade guide](https://tiptap.dev/docs/guides/upgrade-tiptap-v2)
