Comparison

Against the alternatives.

Measured where it can be measured, and honest where it cannot. Including the column that says what the others do better.

The numbers

Four editors, one table.

MatraTiptapLexicalSlate
Bundle, gzipped, starter kit 31.1 kB 117.2 kB ~35 kB ~50 kB
Packages installed 2 50 34 12
Of those, outside the editor’s own scope 0 22 10 8
Engine underneath its own ProseMirror its own its own
Engine types in your code none ProseMirror Lexical Slate
Command types inferred augmentation manual manual
React binding first-class first-class first-class first-class
Vue binding first-class first-class community community
Svelte and Solid bindings first-class community community community
Threaded comments free subscription build it build it
Collaborative cursors free free free build it

Bundle figures from the benchmarks, gzipped. Package counts measured on 2026-09-07 by asking npm to resolve a React install of each, with React itself and @types/* left out · Tiptap 3.31.3, Lexical 0.50.0, Slate 0.126.2. Reproduce it with node scripts/rivals.mjs.

Extension by extension

What both of them have.

Tiptap 3 moved most of its old Pro extensions to MIT. This list is shorter than it was, and saying so is cheaper than being caught.

Only here

What Matra has and Tiptap does not.

Callouts
A note, warning or tip with an emoji attribute that round-trips.
Columns
Two to six, as real nodes rather than a CSS class on a paragraph.
Footnotes
Numbered by position, renumbering as you watch, with the list at the foot.
Locked blocks
Blocks that refuse every change — a contract with fixed clauses.
Fields
Named blanks a template fills in, with no editor in the loop.
Snippets
Type a trigger and a phrase expands.
Page breaks
A labelled line on screen and a real break when printed.
Line height and text direction
Both as checked attributes, not style strings.
Block indent
An attribute on the block rather than a wrapper node invented to hold it.
Text case
Upper, lower, title and sentence case, one text node at a time.
Typewriter scrolling
The caret line stays put and the page moves.
Autosave
Debounced, with a dirty flag and a flush when the page is hidden.
Ghost text
Inline completion from any source, Tab to take it.
Dictation
The browser’s own recogniser, with nothing sent anywhere new.
Hashtags
A node, so `#release` stays a reference rather than styled text.
Keyboard keys
A `kbd` mark, for documentation that names a shortcut.
Image resize
A handle on the edge; the width lands in the HTML.
Allow-listed embeds
Any approved host in a sandboxed frame, refusing the rest.
Smart paste
Tab-separated text arrives as a table.
Threaded comments
Free here. Tiptap’s Comments needs a subscription.
An MCP server
The documentation, served to Claude, Cursor and Codex as a tool.

Only there

What Tiptap has and Matra does not.

A gap cursor
A caret in a place no text can go — before a leading table, between two rules. Matra keeps a paragraph at the end of the document, which covers the common case and not the others.
An audio node
Tiptap ships one. Matra does not · it is about fifteen lines to write.
Ruby text
Furigana above CJK text.
CRDT collaboration
Tiptap’s collaboration is Yjs, so it works offline, peer to peer, and with Hocuspocus, Liveblocks or PartyKit. Matra exchanges steps against a central authority, which is simpler to host and cannot merge two clients that were both offline.
A UI component library
Tiptap ships styled React components. Matra ships none by design — the toolbars and menus on this site are examples to copy, not a package.
Track changes
Suggested edits you accept or reject, with comment threads anchored to them. Tiptap sells it; Matra does not have it.
DOCX and ODT import and export
Tiptap runs it as a cloud service. Matra reads and writes Markdown and HTML, and nothing else.
Pagination
Page boundaries in the editor, with headers and footers. Matra has a page break node and no page model.
A decade of ProseMirror behind it
Every exotic ProseMirror plugin works with Tiptap. Matra’s ecosystem is the extensions in the box.

Questions

Answered plainly.

Does Matra have collaborative cursors, like @tiptap/extension-collaboration-caret?

Yes. `@matrajs/collab` exports `remoteCursors()`, which draws everyone else’s caret and selection as decorations and maps their positions through your own edits, so a remote caret stays on the word it was on while you type in front of it. It ships with `colorFor()` for a stable per-person colour and a stylesheet you can replace. The difference from Tiptap is underneath: Tiptap’s collaboration is Yjs, a CRDT; Matra exchanges ProseMirror-style steps against a central authority you host. Matra’s is simpler to run and cannot merge two clients that were both offline for an hour.

Is Matra a drop-in replacement for Tiptap?

No. The document model is the same shape — nodes, marks, a schema, positions as integers — so a document converts, but the API does not match. Extensions are plain objects rather than classes, commands are typed from the array you passed rather than from module augmentation, and there is no ProseMirror underneath to reach into. Moving a small editor across is an afternoon; moving one with custom node views and ProseMirror plugins is not.

What does Tiptap have that Matra does not?

A gap cursor, an audio node, ruby text, CRDT collaboration through Yjs, a library of styled React components, and — behind a subscription — track changes, DOCX and ODT import and export, and pagination. Tiptap also inherits ProseMirror’s ecosystem, which is a decade deep. Everything else Tiptap publishes openly has an equivalent here.

Is Matra smaller than Tiptap?

Yes, measurably. An application importing the editor and a starter kit, bundled with esbuild and gzipped, is 31.1 kB with Matra and 117.2 kB with Tiptap 3.30. A React install resolves 2 packages for Matra and 50 for Tiptap, of which 22 are outside the @tiptap scope — mostly ProseMirror.

Does Matra use ProseMirror?

No. The document model, the transform system, position mapping and the view are its own, with no runtime dependencies at all. The ideas are ProseMirror’s and are credited as such; the code is not.

Is Matra free?

`@matrajs/core` and every framework binding are MIT and stay that way, and that includes the extensions other editors charge for — threaded comments, a table of contents, unique block ids, the drag handle. Three packages are source-available and commercial: AI streaming edits, collaboration, and version history. They are free for evaluation, personal projects, education, charities, and organisations with fewer than three developers on the software.

Matra or Lexical?

Lexical is Meta’s, has been hardened by Facebook-scale traffic, and has a first-class React story. It also has its own document model, so nothing transfers from a ProseMirror background, and a React install resolves 34 packages. Matra is smaller, has Vue, Svelte and Solid bindings that are not community projects, and reads and writes Markdown in Node with no DOM.

Matra or Slate?

Slate gives you the least and asks the most: no schema to speak of, no extension model, and the editing behaviour is yours to write. That is the right trade when your document is nothing like a document. When it is a document, a schema and seventy-nine extensions save months.