Search page titles, headings and text across the docs.

Extensions

On this page

Parity with TipTap and Remirror

This page compares canvist’s extensions with every extension in TipTap v3 (the open-source packages and the Pro ones) and Remirror. Use it to check whether an editor you’re moving from has something canvist doesn’t, and what canvist calls it.

The comparison was made against TipTap @tiptap/core 3.30.3 and Remirror 3.0.3 (October 2026). Names in the JSON column are the ProseMirror node and mark names. canvist uses TipTap’s names, so TipTap documents load as they are.

How to read the status

StatusMeaning
YesAn extension with the same JSON names, commands, keys, and typing rules, in Rust, TypeScript, and Dart. Differences are listed in the notes.
Built incanvist does it without an extension, usually because the core already works that way.
HostIt belongs to the app around the editor: a toolbar, a popup, or a drag-and-drop handler. canvist gives the host the queries and geometry it needs.
PlannedNot shipped yet. The notes say what it will look like.
Not plannedcanvist won’t ship it. The notes say why and what to use instead.

Text formatting

FeatureTipTapRemirrorJSONcanvistNotes
BoldBoldBoldExtensionboldYesStarterKit.
ItalicItalicItalicExtensionitalicYesStarterKit.
UnderlineUnderlineUnderlineExtensionunderlineYesStarterKit.
StrikeStrikeStrikeExtensionstrikeYesStarterKit. TipTap’s Mod-Shift-s and ~~text~~; Remirror uses Mod-d and a single ~.
Inline codeCodeCodeExtensioncodeYesStarterKit. Excludes the marks it’s registered with, where TipTap excludes every mark.
LinkLinkLinkExtensionlinkYesStarterKit. Only href; TipTap’s target, rel, class, and title attributes are planned.
SubscriptSubscriptSubExtensionsubscriptYesMod-,. Excludes superscript.
SuperscriptSuperscriptSupExtensionsuperscriptYesMod-.. Excludes subscript.
HighlightHighlightTextHighlightExtensionhighlightYes==text==, Mod-Shift-h. Multicolour by default, where TipTap defaults to one colour. Remirror calls it textHighlight with a highlight attribute.
Text styleTextStyle—textStyleYesThe <span style> mark the next five extensions add attributes to.
Text colourColorTextColorExtensiontextStyle.colorYesRemirror uses its own textColor mark.
Background colourBackgroundColor—textStyle.backgroundColorYes
Font familyFontFamilyFontFamilyExtensiontextStyle.fontFamilyYesRemirror uses its own fontFamily mark.
Font sizeFontSizeFontSizeExtensiontextStyle.fontSizeYesRemirror’s increase and decrease commands are planned.
Line heightLineHeightNodeFormattingExtensiontextStyle.lineHeightYesTipTap puts it on the text; Remirror puts it on the block.
Text alignmentTextAlignNodeFormattingExtensiontextAlign on blocksYessetTextAlign, toggleTextAlign, unsetTextAlign, Mod-Shift-l/e/r/j. Layout aligns and justifies lines; HTML writes text-align.
Indentation—NodeFormattingExtensionnodeIndentPlannedWith text alignment.
Text case—TextCaseExtensiontextCasePlannedNeeds text-transform in layout.
Ruby annotationsRubyText—rubyTextNot plannedRuby needs a second line of text above the base; layout doesn’t stack text yet.
Clear formattingcore unsetAllMarksClearFormatting key—YesunsetAllMarks, clearNodes, and clearFormatting on Mod-\.

Blocks

FeatureTipTapRemirrorJSONcanvistNotes
Document, paragraphDocument, Paragraph, TextDoc, Paragraph, Textdoc, paragraphYesAlways registered.
HeadingHeadingHeadingExtensionheadingYesStarterKit. TipTap’s Mod-Alt-n; Remirror’s default map uses Mod-Shift-n.
BlockquoteBlockquoteBlockquoteExtensionblockquoteYesStarterKit.
Code blockCodeBlockCodeBlockExtensioncodeBlockYesStarterKit. Syntax highlighting is planned as a theme hook rather than a second extension.
Code block lowlightCodeBlockLowlightCodeMirror 5 and 6codeBlock, codeMirrorNot plannedEmbedding another editor inside a canvas editor defeats the point; highlighting will come through the theme.
Hard breakHardBreakHardBreakExtensionhardBreakYesStarterKit.
Horizontal ruleHorizontalRuleHorizontalRuleExtensionhorizontalRuleYesStarterKit.
Bullet listBulletListBulletListExtensionbulletListYesStarterKit.
Ordered listOrderedListOrderedListExtensionorderedListYesStarterKit. TipTap’s type attribute (a, i, …) is planned.
List itemListItem, ListKeymapListItemExtensionlistItemYesStarterKit, with Enter, Tab, and Shift-Tab.
Task listTaskList, TaskItemTaskListExtensiontaskList, taskItemYesStarterKit. Remirror calls the item taskListItem.
ImageImageImageExtensionimageYesBlock images with src, alt, title, width, and height, setImage, and ![alt](src "title"). The host draws into the slot layout reserves. Inline images and resizing aren’t supported yet.
AudioAudio—audioYessetAudio with TipTap’s controls, autoplay, loop, and muted, drawn by the host in a slot. Pasted audio URLs aren’t detected yet.
Video embedsYoutube, TwitchIframeExtensionyoutube, twitch, iframeYesTipTap’s youtube and twitch blocks with setYoutubeVideo and setTwitchVideo. A canvas can’t host an iframe, so the host overlays the player on the slot. Remirror’s generic iframe isn’t supported.
File attachmentFileHandlerFileExtensionfileYesRemirror’s file card with url, fileName, fileType, and fileSize, and insertFile. Reading dropped files stays with the host.
DetailsDetails—details, detailsSummary, detailsContentYessetDetails, unsetDetails, toggleDetailsOpen, detailsOpen; Enter in the summary opens it. A closed one lays out only its summary, beside a ▸.
Callout—CalloutExtensioncalloutYesRemirror’s five types, :::warning, and GitHub alerts in Markdown. No emoji attribute: the theme draws the tint.
MathMathematics—inlineMath, blockMathYes$$x$$ and $$$x$$$, drawn by the host in a slot (KaTeX on the web). Markdown $x$ and $$ blocks.
TablesTableKitTableExtensiontable, tableRow, tableCell, tableHeaderYesGrid layout from colwidth and an even share, merged cells, header rows, columns, and cells, Tab between cells, and pipe tables in Markdown. No column resizing handles yet: a host sets colwidth.
Columns—ColumnsExtensioncolumnsPlannedAfter tables, sharing the grid layout.

Inline nodes and suggestions

FeatureTipTapRemirrorJSONcanvistNotes
Suggestion engine@tiptap/suggestionprosemirror-suggest—YesShared by mentions, hashtags, and emoji: a …Suggestion query reports the trigger and query, a command inserts the pick, Escape dismisses. The host draws the popup at the caret.
MentionMentionMentionAtomExtensionmentionYesTipTap’s atom with id, label, and mentionSuggestionChar. Backspace after a mention reopens it. Remirror’s mark form isn’t planned.
Hashtag——hashtagYesNeither has one: a hashtag mark with a tag, marked as you type and paste, plus a hashtags query.
EmojiEmojiEmojiExtensionemojiYesTipTap’s name attribute and :shortcode: rule, with GitHub’s 1,870 emoji. canvist also stores the character in emoji. Emoticons and pasted shortcodes aren’t converted yet.
Variables and slotsPro—variable, blockSlot, inlineSlotNot plannedTemplate features for a later product, not the editor core.

Editing behaviour

FeatureTipTapRemirrorcanvistNotes
HistoryUndoRedoHistoryExtensionYesStarterKit.
Trailing nodeTrailingNodeTrailingNodeExtensionYesStarterKit.
TypographyTypographyShortcutsExtensionYesTipTap’s 22 rules plus Remirror’s <->. Rules ending in a digit (2x3, ^2) fire on the next space or punctuation.
Character countCharacterCountCountExtensionYescharacters, words, characterLimit, setCharacterLimit. Counts grapheme clusters, where TipTap counts UTF-16 code units.
PlaceholderPlaceholderPlaceholderExtensionYesshowOnlyCurrent and includeChildren as in TipTap. Layout draws it, so it looks the same on every platform.
FocusFocus—PlannedA query for the focused block path; the theme can style it.
Invisible charactersInvisibleCharactersWhitespaceExtensionPlannedDrawn by layout: spaces, line ends, and breaks.
Unique IDUniqueID—Built inEvery block has a stable id, exported as attrs.id in JSON and data-id in HTML.
Gap cursorGapcursorGapCursorExtensionBuilt inBlock selections cover rules, images, and other leaves, so there’s always somewhere to put the caret.
Drop cursorDropcursorDropCursorExtensionHostThe host paints the drop line; hit_test and block_rect give it the position.
SelectionSelection—Built inThe editor keeps its selection when it loses focus, and the host decides whether to paint it.
Bidirectional textcore textDirectionBidiExtensionBuilt inLayout runs the Unicode bidi algorithm per block; dir on a block forces a direction.
Node range selectionNodeRange—Built inSelection::Blocks selects whole blocks.
Epic mode—EpicModeExtensionNot plannedParticles and shaking while typing. Fun, but a host effect; see canvas-native ideas for the kind of visual canvist does in the editor itself.

Document tools

FeatureTipTapRemirrorcanvistNotes
Find and replaceFindAndReplaceFindExtensionYessetSearchTerm, setCaseSensitive, next/previousSearchResult, replace, replaceAll, and searchResults. The host draws matches through layout highlights.
Table of contentsTableOfContents—YestableOfContents lists headings with level, text, outline number, and the active one; goToHeading moves the caret.
CommentsComments (Pro)AnnotationExtension, EntityReferenceExtensionYesA comment mark whose threads list lets comments overlap. setComment, unsetComment, activeComments, and comments. Threads live in the host.
Drag handleDragHandle—YesmoveBlockUp/Down (Alt-↑/↓) and moveBlocksTo. The handle is host UI placed with block_rect.
Character limitCharacterCount limitCountExtension maximumYesEdits past the limit don’t apply. A paste that overflows is refused whole, where TipTap trims it.
Tracked changesTracked Changes (Pro)DiffExtensionPlannedAfter comments, on the same overlapping marks.
Version historySnapshot (Pro)—Built inDoc::snapshot captures a version and Engine::restore brings it back; named versions in canvist Cloud come next.
Version compareSnapshot Compare (Pro)DiffExtensionPlannedWith tracked changes.
PagesPages (Pro)—PlannedPagination is a natural fit for canvas layout; see canvas-native ideas.
Markdown@tiptap/markdownMarkdownExtensionBuilt inImport and export in every binding, with GitHub task lists and strikethrough.
Import and exportImport, Export (Pro)—Built inJSON, HTML, Markdown, and text. DOCX, ODT, and PDF are planned for canvist Cloud’s convert API.
Paste cleanupPaste Handler (Pro)—Built inThe HTML reader keeps structure and formatting from Word and Google Docs and drops the rest.
Content protectionContent Protection (Pro)—Not plannedA policy layer for template products, not the editor core.

Collaboration

FeatureTipTapRemirrorcanvistNotes
Yjs syncCollaborationYjsExtensionBuilt incanvist_collab is a plain Yjs peer: y-websocket, Hocuspocus, and JavaScript peers work.
Remote caretsCollaborationCaretYjsExtension cursorBuilderBuilt inAwareness presence with carets and selections.
Step sync—CollaborationExtensionNot plannedYjs covers it.
Hosted providerProvider (Pro)—Built incanvist Cloud.

Host UI

These are the app’s job in a canvas editor. canvist provides what each one needs.

FeatureTipTapRemirrorWhat canvist provides
Bubble menuBubbleMenuPositionerExtensionselection_bounds and typed queries such as isBold.
Floating menuFloatingMenuPositionerExtensioncaret_rect and block_rect.
Node viewsnode viewsReactComponentExtensionSlots in the display list for the host to draw into.
DOM eventscore eventsEventsExtensionHosts forward keys, text, and pointer input; hit_test maps points to positions.
File dropFileHandlerfile paste ruleshit_test for the drop position, and insert commands for images and files.
AI writingAI (Pro)—Headless Doc editing and typed commands for agents; see AI agents.

Canvas-native ideas

A canvas editor draws every glyph itself, so it can do things a DOM editor can’t do cheaply. None of these exist in TipTap or Remirror. They’re listed roughly from most to least useful.

IdeaWhat it doesWhy canvas
InkPen and finger strokes drawn over the text and anchored to it, so a circled word stays circled when the paragraph reflows.Strokes live in the same coordinate space as glyphs, and layout knows where every anchored character moved. A DOM editor has to overlay a second canvas and guess.
Kinetic typeA mark that animates its text: a wave, a pulse, a shiver. The document stays plain text with a mark; the painter moves the glyphs.Per-glyph transforms every frame are a few multiplications for a canvas and thousands of DOM nodes for anyone else.
RedactionA mark that paints solid bars over text and leaves it out of copy, export, and the accessibility mirror for readers without permission.The canvas never puts the text on screen, so there’s nothing to select or inspect. In a DOM editor, redacted text is still in the page.
PagesReal pagination with headers and footers, measured once and identical in the browser, on the server, and in print.Layout already measures every line deterministically, so page breaks are just another query.
Focus readingDims everything but the current sentence or paragraph, with a smooth fade as the caret moves.The painter blends colours per run; no restyling or reflow.
MinimapA zoomed-out overview of the whole document beside the editor.The display list draws at any scale, so the minimap is the same paint call with a transform.
Margin notesNotes laid out in the margin next to the text they belong to, pushed apart so they never overlap.Layout knows the exact position of every anchor, so notes can be placed in the same pass.

canvist builds Ink and Kinetic type first. They change how people use an editor (sketching by hand, text that moves to make a point), and both fall out of what layout already knows.

Both now ship:

  • Ink ships as drawing blocks in the flow of the document. Layout draws their strokes as display-list strokes, which every canvas renderer paints, and scales them with the column. Strokes anchored over the text, so a circled word stays circled through reflow, are the next step on the same strokes.
  • Kinetic type ships as the kinetic mark with wave, shake, pulse, and rainbow effects. Layout moves each glyph for the time the host passes and reports when a frame is animated. A screen of moving text builds its display list in about 23 µs.
Docs