| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-09-30 | 24.7 kB | |
| v5.5.0 source code.tar.gz | 2026-09-30 | 40.9 MB | |
| v5.5.0 source code.zip | 2026-09-30 | 43.3 MB | |
| Totals: 3 Items | 84.2 MB | 2 | |
This release is a broad reliability pass over the SDK. Shapes keep changes made by other commands while they are being dragged, resized, rotated, or cropped; touch gestures no longer stick when the browser cancels a pointer; selection, draw, line, note, frame, and arrow interactions survive shapes being deleted or locked mid-interaction; SVG exports embed every resource they reference; and there are fixes across the store, signals, sync, and local persistence. Rich text gets smart typography and wraps a selection in the bracket or quote you type, pasting a link onto a selected shape sets its link, and the note shape's attribution badge can be hidden or replaced. tldraw now re-exports TipTap's extension API, so custom rich text extensions no longer need their own @tiptap/* install, and Editor.setCamera rejects non-finite values instead of quietly coercing them.
What's new
Smart typography in rich text (#10767)
Text typed on the canvas now reads like typeset text. Straight quotes curl, -- becomes an em dash, ... an ellipsis, and -> an arrow. Pressing Backspace straight after a rewrite restores what you typed. The rules are TipTap's Typography extension, added as a standalone entry in getTipTapDefaultExtensions(), so filter it out to keep literal punctuation.
With text selected, typing an opening bracket or quote wraps the selection instead of replacing it: select a word and press ( to get (word). Pressing ` over a selection toggles inline code. Quotes stay straight inside code and in the mono font. The new WrapSelectionExtension does the wrapping, and defaultWrappingPairs lists the pairs it uses.
API changes
- 💥
Editor.setCameranow throws on a non-finitex,y, orzinstead of silently coercing it to0or the current zoom level, and no longer mutates the point object passed to it. (#9903) - 💥
store.query.filterHistory()now returns its own change counter rather than a value that always matchesstore.history.get(). After a rolled-back transaction it can be ahead of the store's counter, and it reports a change even for record types the transaction didn't touch. (#10200) - Re-export TipTap's extension surface from
tldraw:Node,Mark,Extension,mergeAttributes, andgetSchema, theExtensionsandJSONContenttypes, and theTaskListandTaskItemextensions. Custom rich text extensions no longer need their own@tiptap/*dependency, which also rules out loading two copies of TipTap. (#10691)
tsx
import { Mark, mergeAttributes } from 'tldraw'
- Add
MESSAGE_TOO_LARGEtoTLSyncErrorCloseEventReason. Clients that switch on the reason to pick an error message will want a case for it. (#10810) - Add
LruCache.delete(key)to@tldraw/utils. (#10338) - Add an
AttributionComponentoption toNoteShapeUtilto hide or replace the note's "last edited by" badge, on the canvas and in exports. Passnullto hide it, or a component that receivesTLNoteShapeAttributionProps. The default is exported asDefaultNoteShapeAttribution. (#9407)
tsx
<Tldraw shapeUtils={[NoteShapeUtil.configure({ AttributionComponent: null })]} />
- Add
shapeIdtoTLUrlExternalContent.defaultHandleExternalUrlContentsets the url as that shape's link instead of creating a bookmark or embed. (#10765) EditorManager.addEditorEvent()now returns an unsubscribe function, and managers can call the new protectedunregister()to tear down a resource before the editor is disposed. (#10732)
Improvements
npm create tldraw .now scaffolds into the current directory, prompting first when the directory isn't empty. (#10657)- Update the AI starter kit templates to current Claude, Gemini, and GPT model ids. (#10058) (#10869)
- Paste a link with a single shape selected to set that shape's link, instead of creating a bookmark. (#10765)
- The keyboard shortcuts dialog now says when keyboard shortcuts are turned off in accessibility preferences. (#10532)
Bug fixes
Crashes
- Fix a crash that could replace the editor with the host app's error screen when a group's child record was removed during a transaction. Children that no longer resolve are skipped, and a group where none resolve falls back to a unit box. (#10668)
- Fix a crash when a shape is deleted between pointing at it and starting to drag it or one of its handles. (#10179)
- Fix a crash when a shape being translated, or the frame it is being dragged over, is deleted mid-drag. (#10171)
- Fix draw and highlight shapes created with no segments throwing in geometry and rendering. (#10224)
- Fix duplicating a zero-length line throwing.
LineShapeUtil.onBeforeCreateno longer mutates the caller's points. (#10248) - Fix a line shape with fewer than two points breaking hit testing for the whole page. (#10222)
- Fix large rooms failing to load in
InMemorySyncStoragewith a stack overflow. (#10110) - Fix a crash in the sync client's reconnect handling when the global
WebSocketconstructor is undefined during a network or visibility event. (#10783)
Selection and tools
- Fix shapes losing changes made by other commands while they are being translated, resized, rotated, or cropped. Pressing the rotate shortcut mid-drag, or a remote update arriving during a gesture, is no longer overwritten by the next pointer move. (#9215)
- Fix tapping a toolbar tool with a stylus, finger, or trackpad sometimes creating a shape instead of selecting the tool. Dragging a tool out of the toolbar now requires the pointer to leave the toolbar, and sliding along the toolbar no longer starts a drag. (#10651)
- Fix touch gestures staying stuck when the browser cancels the pointer, as it does for an edge swipe, an incoming call, or palm rejection. (#10464)
- Fix Tab, Shift+Tab, and Ctrl/Cmd+arrow keyboard traversal selecting locked shapes, which clicking and select all never do. (#10482)
- Fix the right Shift key not giving the large nudge step when moving shapes with the arrow keys. (#10477)
- Fix keyboard shape navigation, and
Editor.selectAdjacentShape('prev'), selecting the second-to-last shape instead of the last one when nothing is selected. (#10601) - Fix Ctrl/Cmd+arrow shape navigation preferring a nearer diagonal shape over an aligned one. (#10339)
- Fix pointer downs inside a rotated multi-selection dragging the wrong shapes, and clicking a selected locked shape with
selectLockedShapesselecting the shape behind it. (#10166) - Fix the select tool bailing to an old history mark, or crashing, when a resize starts with nothing selected. (#10165)
- Fix the select tool getting stuck after pressing an arrow label in a read-only editor or on a deleted arrow. (#10183)
- Use Cmd (Mac) or Ctrl to toggle snapping while dragging handles and wrap mode while brush selecting, matching translate, resize, and crop. (#10172)
- Fix cancelling a note clone-handle drag leaving the new note behind and switching to the note tool. (#10187)
- Fix the toolbar losing the originating tool's highlight while zooming with Z, and the zoom tool staying on when Z was pressed straight after clicking a toolbar button. (#10185)
- Fix the Frame selection action and shortcut doing nothing when a single shape is selected. Locked shapes, and arrows bound to shapes outside the new frame, are now left out of it. (#10627)
- Fix the enlarge and shrink shortcuts moving shapes away from the original selection's center when several shapes are selected. (#10070)
- Fix selecting arrows and hollow shapes larger than the viewport by clicking their edges. (#10333)
- Fix
Editor.animateShapesmoving locked shapes, and apply ancestor-lock semantics to delete, duplicate, group, and ungroup. (#10334) - Fix the select tool getting stuck in translating when a creating tool hands off without an
onCreatecallback. (#10190) - Fix a second quick press on a resize, rotate, or crop handle, or on an image being cropped, being consumed as a double click instead of starting a drag. (#10176)
- Fix the cursor and state chart after finishing a text edit with the text tool locked. (#10174)
- Fix crop handles and crop nudges acting on the wrong axis for images inside rotated frames or groups. (#10170)
- Fix arrow handle drags inheriting the previous drag's precise-binding timer. (#10164)
- Fix palm touches disturbing pen-mode drags, double clicks with desktop tablet styluses, and a crash when a stylus eraser is used without an eraser tool. (#10346)
- Stop snapping to hidden shapes and label geometry, and make gap snapping behave the same on both axes. (#10331)
- Fix
groupShapesthrowing for locked selections or orphaning shapes at the page limit,ungroupShapesdeleting nested children, and both commands ignoring calls made outside the select tool. (#10330)
Camera and viewport
- Fix the camera not panning to a note created with Tab, Ctrl/Cmd+Enter, or a note's clone handle when the new note landed outside the viewport. (#10486)
- Fix camera coasting after a fling, and edge scrolling, running roughly twice as fast on a 120 Hz display as on a 60 Hz one. Both now scale by the elapsed tick time, so motion per second is the same at any refresh rate. (#10501)
- Fix a click landing during a camera animation or a fling being treated as a drag. (#10714)
- Fix space and the arrow keys panning a locked camera, a pinch on a locked camera acting on the current tool, and the input device preference re-enabling the wheel when
wheelBehavioris'none'. (#10348) - Fix
setCameraresetting the zoom to 100% when called with a plain{ x, y }point. (#10385) - Fix forced animated camera moves snapping back inside the camera constraints on their last frame. (#10386)
- Fix a viewport deep link with a zero-size viewport moving the camera to the page origin instead of falling back to fitting the page content. (#10628)
Arrows and shapes
- Fix arrow clusters in the stack, pack, and distribute commands depending on selection order, so an arrow selected before the shapes it binds no longer moves separately from them. (#10382)
- Fix arrow bindings flip-flopping while resizing a bound shape together with its arrow. (#10197)
- Fix rotated images jumping on the canvas when their aspect ratio or crop zoom changed, or when the image was replaced. (#10233)
- Fix image and video shapes keeping a removed asset on screen. (#10250)
- Fix bound arrow terminals moving by the wrong delta when translating a rotated arrow or nudging an arrow. (#10198)
- Fix short draw strokes with straight segments closing as if they were long. (#10241)
- Fix the opposite edge of a scaled geo shape drifting when resized past its label's minimum size. (#10217)
- Fix line animations dropping points when the target line has more points than the starting one. (#10247)
- Fix highlight shape animations switching to the end shape's props immediately instead of interpolating from the nearer shape. (#10246)
- Fix draw shapes closing one update late when drawn with straight segments. (#10242)
- Fix the draw tool freezing the stroke after a quick Shift release during a straight segment. (#10239)
- Fix notes created inside a rotated frame appearing off-centre from the click. (#10235)
- Fix a bookmark keeping its old preview after its url changes. (#10208)
- Fix a frame's contents jumping when double-clicking a frame edge to fit it to its children. (#10206)
- Fix pasting Excalidraw drawings that use a custom stroke width. (#10779)
Editor
- Fix keyboard shortcuts being unable to bind the
+key (cmd++was silently dropped and rendered as a bare modifier) andshift+<glyph>shortcuts such asshift+:never firing when the browser reports:with shift held. (#10512) - Fix undo after switching pages from the page menu or with Alt+arrow also reverting the edit made before the switch. Switching pages is now its own undo step, matching the "Go back" button on the move-to-page toast. (#10472)
- Fix
TldrawEditorrecreating the editor when it re-renders with inline nestedcamera,deepLinks,text, orgridStepsoptions. (#10373) - Fix preserve-focus mode blurring the editor on canvas clicks. (#10374)
- Fix double-clicking a custom shape that allows read-only editing doing nothing in a read-only editor. The gate now consults
ShapeUtil.canEditInReadonlyinstead of a hard-coded list of shape types. (#10173) - Fix binding and document-settings mutations going through in readonly mode, and index self-referential bindings once. (#10340)
- Fix selected text disappearing when a whole list is selected, such as by triple-clicking its bullet. (#10808)
- Fix text measurement for elements containing more than one text node. (#10357)
- Fix a license key that arrives after the first render being ignored, and stop watermark tracking failures surfacing as unhandled rejections. (#10327)
- Fix copied content dropping assets the asset store can't resolve. (#10366)
- Fix asset store removal errors in
deleteAssetsbecoming unhandled rejections. They are now logged. (#10368) - Fix geometry hit tests, nearest-point, and length calculations losing precision after a shape's SVG path data was generated.
getSvgPathDatarounded the geometry's stored points to two decimals in place, and geometries are cached per shape, so every later calculation used the rounded points. (#10600) - Fix
Editor.getCurrentTheme()returningundefinedaftersetCurrentTheme()was called with an unregistered theme id. The call is now rejected and the current theme is kept. (#10602) - Fix
Group2d.transformdropping its ignored children, resetting theisInternal,excludeFromShapeBounds, andisEmptyLabelflags, and discarding itsoptsargument. It now matches the baseGeometry2d.transformsignature. (#10603) - Fix
editor.timerskeeping every fired or cancelled timer id for the editor's lifetime. (#10782) - Fix the debug menu's hard reset running without confirmation and stalling when another tldraw tab is open. (#10529)
- Fix
hideShapeshiding the canvas after debug mode is turned off, and limit edit-on-type to printable keys. The unusedreconnectOnPinganddebugCursorsdebug flags are removed. (#10536) - Fix embed hostname matching trusting lookalike hosts such as
tldraw.com.evil.io, which were rendered with the matched definition's relaxed iframe permissions. A host must now be the pattern itself or a subdomain of it. (#10196)
Exports
- Fix exports resolving with a partial image when a shape's
toSvgthrows. Exports now fail fast, custom frame-like shapes export without the default frame util, and trimming an SVG export no longer allocates an oversized measurement canvas. (#10342) - Fix exports missing resources and fonts: styles with several urls, font lists, and bare
@importrules are now all embedded, failed fetches are retried, and stylesheets that import each other no longer hang the export. (#10338) - Fix a failed animated-image or video export hanging every later export of the same asset, because the rejected promise was memoized. (#10226)
Store and signals
- Fix effects losing a dependency when a set during their first run re-triggered them. (#10146)
- Fix a side-effect handler being skipped when the previous handler for the same event removes itself while running. (#10231)
- Fix store changes made in the same frame as
dispose()never reaching listeners. (#10223) - Fix a throwing store listener stopping the other listeners from receiving the same change-set. (#10216)
- Fix
store.query.ids()andstore.query.index()staying stale after a query was read inside a transaction that then rolled back. (#10200)
Persistence and sync
- Fix local persistence silently dropping edits: changes another tab made while this one was still loading, edits queued in the last few hundred milliseconds before unmount, and writes still in flight when the database closed. (#10332)
- Fix sync stalling permanently when
getUrirejected, which in the documenteduseSyncpattern is an auth-token fetch. A rejectedgetUriis now retried on the normal backoff, and a closedClientWebSocketAdapterno longer notifies listeners or reconnects after disposal. (#10107) - Fix IndexedDB session state rows accumulating forever. Stale rows are now pruned on load. (#10533)
- Fix a session removed during its own connect handshake coming back and later emitting a second
session_removed. (#10121) - Fix
useSyncstill reporting a previous room's error after theurichanged to a new, healthy room. (#10108) - Fix oversized chunked sync messages being buffered indefinitely. Assembly is now bounded by a size and chunk-count limit, and a message that exceeds it fails with a
MESSAGE_TOO_LARGEsync error instead of disconnecting the client in a loop. (#10810) - Fix
TLSocketRoom.closeSessionleaving the socket open when the close reason is over 123 bytes. The reason is now truncated and ends with... (+N bytes). (#10116) - Fix
TLSocketRoom.updateStorenot seeing or deleting object-lane records. (#10114) - Fix authorizer errors and vetoes being swallowed when
TLSocketRoomwas created without alogoption. (#10117) - Fix text arriving corrupted when a message chunk boundary split a surrogate pair, such as an emoji. (#10119)
- Fix
TLSyncRoom.close()leaving per-session timers that could send into closed sockets or emitsession_removedandroom_became_emptyon a closed room. A socket that throws on close no longer leaves the rest open. (#10120) - Fix
SQLiteSyncStoragetombstone pruning throwing from a timer after the host closed the database, and make the prune transactional so a failure part-way cannot leave the history start ahead of the surviving tombstones. (#10112)
Mermaid conversion
- Fix converted sequence diagrams crowding tall notes, fragment titles, and participants that are created and destroyed close together. Rows are now placed where mermaid drew them rather than on an even grid. (#10817)
- Fix sequence diagrams with a created or destroyed participant being drawn much taller than they should be. (#10822)
- Fix long participant names and notes in sequence diagrams wrapping or breaking mid-word. (#10806)
- Fix edges between the same two nodes swapping each other's curves. (#10826)
- Fix flowchart and state diagram edge labels rendering a size smaller than node labels. (#10804)
- Fix sequence diagram participant boxes being dropped, along with their labels and colors, on conversion. (#10813)
- Fix sequence diagrams dropping a participant's bottom box, and tilting their arrows, when the source uses
destroy. (#10750) - Fix self-loops in flowcharts and state diagrams drawing their label on top of the node. (#10773)
- Fix multi-line notes in sequence diagrams rendering far wider than their text needs, and labels breaking mid-word in diagrams that set their own font size. (#10753)
- Fix the
autonumberoptions (start,step,off) being ignored in sequence diagrams. (#10079)