tldraw Release Notes

Follow

49 release notes curated from 1 source by the Releasebot Team. Last updated: Oct 2, 2026

Get this feed:
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    tldraw logo

    tldraw

    v5.5.1

    tldraw fixes cursor hotspot offset so hovering and selection feel aligned with shapes.

    Generated from commits between v5.5.0 and HEAD

    Bug Fixes

    • fix(editor): move default cursor hotspot down toward the visible tip (#11033)
      Fix shape hover and selection feeling offset below shapes, caused by the default cursor's hotspot sitting above its visible tip.
    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Aug 6, 2026
    • Modified by Releasebot:
      Oct 2, 2026
    tldraw logo

    tldraw

    v5.5.2

    tldraw fixes license domain validation for pages loaded from blob URLs.

    Generated from commits between v5.5.1 and HEAD

    Bug Fixes

    fix(editor): validate license domain for pages loaded from blob URLs (#11040)

    Fix license domain validation for pages loaded from blob: URLs

    Original source
  • All of your release notes in one feed

    Join Releasebot and get updates from tldraw and hundreds of other software products.

    Create account
  • Sep 30, 2026
    • Date parsed from source:
      Sep 30, 2026
    • First seen by Releasebot:
      Oct 1, 2026
    tldraw logo

    tldraw

    v5.5.0

    tldraw ships a broad SDK reliability update with sturdier gestures, drag and resize behavior, smarter rich text typography, link pasting, note attribution controls, TipTap API re-exports, stronger exports, and fixes across store, sync, persistence, camera, and CLI tooling.

    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.setCamera now throws on a non-finite x, y, or z instead of silently coercing it to 0 or 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 matches store.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, and getSchema, the Extensions and JSONContent types, and the TaskList and TaskItem extensions. Custom rich text extensions no longer need their own @tiptap/* dependency, which also rules out loading two copies of TipTap. (#10691)
    import { Mark, mergeAttributes } from 'tldraw'
    
    • Add MESSAGE_TOO_LARGE to TLSyncErrorCloseEventReason. 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 AttributionComponent option to NoteShapeUtil to hide or replace the note's "last edited by" badge, on the canvas and in exports. Pass null to hide it, or a component that receives TLNoteShapeAttributionProps. The default is exported as DefaultNoteShapeAttribution. (#9407)
    <Tldraw shapeUtils={[NoteShapeUtil.configure({ AttributionComponent: null })]} />
    
    • Add shapeId to TLUrlExternalContent. defaultHandleExternalUrlContent sets 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 protected unregister() 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.onBeforeCreate no 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 InMemorySyncStorage with a stack overflow. (#10110)
    • Fix a crash in the sync client's reconnect handling when the global WebSocket constructor 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 selectLockedShapes selecting 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.animateShapes moving 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 onCreate callback. (#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 groupShapes throwing for locked selections or orphaning shapes at the page limit, ungroupShapes deleting 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 wheelBehavior is 'none'. (#10348)
    • Fix setCamera resetting 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) and shift+<glyph> shortcuts such as shift+: 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 TldrawEditor recreating the editor when it re-renders with inline nested camera, deepLinks, text, or gridSteps options. (#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.canEditInReadonly instead 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 deleteAssets becoming 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. getSvgPathData rounded 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() returning undefined after setCurrentTheme() was called with an unregistered theme id. The call is now rejected and the current theme is kept. (#10602)
    • Fix Group2d.transform dropping its ignored children, resetting the isInternal, excludeFromShapeBounds, and isEmptyLabel flags, and discarding its opts argument. It now matches the base Geometry2d.transform signature. (#10603)
    • Fix editor.timers keeping 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 hideShapes hiding the canvas after debug mode is turned off, and limit edit-on-type to printable keys. The unused reconnectOnPing and debugCursors debug 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 toSvg throws. 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 @import rules 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() and store.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 getUri rejected, which in the documented useSync pattern is an auth-token fetch. A rejected getUri is now retried on the normal backoff, and a closed ClientWebSocketAdapter no 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 useSync still reporting a previous room's error after the uri changed 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_LARGE sync error instead of disconnecting the client in a loop. (#10810)
    • Fix TLSocketRoom.closeSession leaving the socket open when the close reason is over 123 bytes. The reason is now truncated and ends with ... (+N bytes). (#10116)
    • Fix TLSocketRoom.updateStore not seeing or deleting object-lane records. (#10114)
    • Fix authorizer errors and vetoes being swallowed when TLSocketRoom was created without a log option. (#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 emit session_removed and room_became_empty on a closed room. A socket that throws on close no longer leaves the rest open. (#10120)
    • Fix SQLiteSyncStorage tombstone 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 autonumber options (start, step, off) being ignored in sequence diagrams. (#10079)

    CLI

    • Fix create-tldraw --no-telemetry being ignored. (#10789)
    • Fix create-tldraw -t <template> crashing on startup. (#10657)
    Original source
  • Sep 10, 2026
    • Date parsed from source:
      Sep 10, 2026
    • First seen by Releasebot:
      Sep 10, 2026
    tldraw logo

    tldraw

    v5.4.2

    tldraw fixes package metadata for @tldraw/utils and @tldraw/validate by declaring their MIT licenses.

    Generated from commits between v5.4.1 and HEAD

    Bug Fixes

    fix(packages): declare MIT license for utils and validate (#10738)

    Fix package metadata to explicitly identify the MIT licenses of @tldraw/utils and @tldraw/validate.

    Original source
  • Sep 8, 2026
    • Date parsed from source:
      Sep 8, 2026
    • First seen by Releasebot:
      Sep 8, 2026
    tldraw logo

    tldraw

    v5.4.1

    tldraw fixes a context menu reopening bug with radix-ui 1.5+ after left-click dismissal.

    Generated from commits between v5.4.0 and HEAD

    Bug Fixes

    • fix(tldraw): control context menu open state so radix-ui 1.5+ can reopen it (#10567)
    • Fix the context menu not reopening after a left-click dismissal when radix-ui 1.5+ is installed
    Original source
  • Similar to tldraw with recent updates:

  • Sep 2, 2026
    • Date parsed from source:
      Sep 2, 2026
    • First seen by Releasebot:
      Sep 2, 2026
    tldraw logo

    tldraw

    v5.4.0

    tldraw adds new editor and utility APIs, speeds up signals and store performance, and ships a broad reliability pass across undo, selection, tools, cropping, arrows, sync, persistence, and collaboration, with better browser support and many bug fixes.

    API changes

    šŸ”œ useViewportHeight() is deprecated. Read window.visualViewport directly instead. The hook returns only the visible viewport's bottom edge, and keeping a panel clear of the software keyboard generally needs the whole visible rectangle. (#9826)

    Add 'center' as an Editor.alignShapes operation. It applies the existing 'center-horizontal' and 'center-vertical' operations together, so shapes center on both axes in one command. (#9074)

    Add tleditors, a reactive global registry of currently mounted editors. Use it to reach live editors from outside the React tree, for example from sidebar chrome or a keyboard shortcut handler. (#9904)

    import { tleditors, useValue } from 'tldraw'
    const mounted = useValue('mounted editors', () => tleditors.getMounted(), [])
    

    Add getOrInsert(key, defaultValue) and getOrInsertComputed(key, callback) to AtomMap, matching the Map methods added in newer JavaScript runtimes. Both are reactive, and the callback only runs when the key is absent. (#9752)

    Add isPage(record) to @tldraw/tlschema, a type guard that narrows an unknown record to TLPage, matching the guards already exported for the other record types. (#9774)

    Add iterateGraphemes(str) to @tldraw/utils. It iterates a string's grapheme clusters, using Intl.Segmenter when it's available and falling back to code-point iteration when it isn't. (#9896)

    EmojiPickerProps.onSelect now receives the originating event as an optional second argument. Custom reaction palettes can forward it to opt into shift multi-select. (#9999)

    Improvements

    Shift-click an emoji in a comment's reaction palette to add several reactions without the palette closing. A plain click still applies the reaction and closes the palette. (#9999)

    Keyboard input now counts as collaborator presence activity, so peers no longer fade out and disappear while someone is typing. (#9929)

    Reduce per-pointer-event allocations in Group2d and Editor hit-testing. (#8600)

    Speed up editor hot paths: set lookups replace array scans in the selection side effect and the erasing check, getCollaborators makes a single pass over the presence records, and getShapeUtil only builds its assert message when the lookup fails. (#10358)

    Speed up signal reads in @tldraw/state. Capturing a parent used to scan the capturing signal's parent set twice, once to check for the parent and again to add it. (#9690)

    Reduce per-signal memory use and per-flush allocations in @tldraw/state. (#10155)

    Reduce the work and allocations in @tldraw/store history bookkeeping, so squashing record diffs and filtering query history no longer build intermediate copies on every tick. (#9689, #9869)

    Move the exportBackground default (true) into the TLInstance record type in @tldraw/tlschema, so every code path that creates the instance record gets the same value. (#10534)

    Bug fixes

    Crashes

    Fix the editor failing to load on older browsers that lack Intl.Segmenter, such as Firefox before 125. (#9896)

    Fix the frame loop stopping permanently when a tick or frame listener threw, which silently disabled camera animations, edge scrolling, and other frame-driven behavior for the rest of the session. (#9946)

    Fix a crash when computing a frame's geometry if its heading text couldn't be measured yet. (#9496)

    Fix a crash in hit testing when a custom frame-like shape uses a plain, non-group geometry. (#10328)

    Fix a crash when pressing Enter with a frame, video, or embed selected while the geo, arrow, or text tool is active. (#10195)

    Undo and history

    Fix undo after a cut also reverting the change made before it. (#9920)

    Fix several actions merging into the previous undo step instead of creating their own: Unlock all, changing an arrowhead, keyboard changes to the opacity and image zoom sliders, alt+double-clicking a rectangle into a check-box, saving alt text, and dropping a file or url onto the canvas. (#10468, #10469, #10470, #10473, #10474, #10478)

    Fix exiting an empty text shape leaving a phantom undo entry: document changes made by onEditEnd are now recorded in history. (#10369)

    Fix undo after bailToMark removing records that were not part of the undone change. (#10207)

    Fix undo/redo not removing an optional record property that the change had deleted. (#10215)

    Fix collaboration-mode readonly syncs ending up in the user's undo history. (#10372)

    Fix changes made by operationComplete handlers after a remote merge being attributed to the remote source. (#10229)

    Selection and tools

    Fix Escape being ignored while pressing on the canvas with the select tool. (#10175)

    Fix Escape during a scribble selection dropping the prior selection. (#10489)

    Fix Space+arrow and Alt+arrow also nudging the selected shapes. (#10453)

    Fix Alt not suppressing Shift/Ctrl additive selection when releasing the pointer over a selected shape. (#10510)

    Fix bookmarks and other non-resizable shapes being left behind when resizing a multi-selection. (#10491)

    Fix alt-cloning mid-drag reparenting the original shape instead of the clone when dropping into a frame. (#10186)

    Fix the cursor staying as a resize or rotate arrow when Ctrl/Cmd+dragging a selection handle to brush-select. (#10487)

    Fix handle snapping on rotated shapes landing off the snap target. (#10168)

    Fix an interrupted press with the geo, frame, or note tool (undo, opening a menu, or changing page before releasing) creating a default-size shape. (#10506)

    Fix an invisible empty text shape being left behind when switching tools while dragging out a text box. (#10457)

    Fix the text tool undoing earlier work when cancelling a pointer-down after a drag-created text shape. (#10194)

    Fix shift-click with the draw, highlight, and line tools editing a shape on the previous page after a page change. (#10455)

    Fix the draw tool's shift segment threshold depending on the zoom level. (#10240)

    Fix the first point of a pen stroke losing its pressure value. (#10243)

    Fix small, slowly drawn loops sometimes failing to close, because dense input sampling made the stroke measure shorter than it was. (#9930)

    Fix the eraser dropping a frame it was pressed on once the drag begins. (#10507)

    Fix a camera jump when a second finger touches down during a one-finger zoom with the hand tool. (#10178)

    Fix Escape ending a spacebar pan while Space is still held. (#10504)

    Fix tools whose onEnter transitions to a child state ending up with two active children. (#10354)

    Fix double clicks being cancelled by small pointer movements when the editor container is offset from the page origin. (#10349)

    Fix modifier keys (Shift, Alt, Ctrl, Cmd) briefly being treated as held at the start of a new click or drag right after being released, which could momentarily affect snapping and other modifier-dependent behavior. (#9523)

    Fix held keys, including Space panning, staying active after the window loses focus. (#10500)

    Cropping

    Fix stale crop state after leaving crop mode by switching tools. (#10167)

    Fix Escape during a crop drag reverting the whole crop session instead of only the drag in progress. (#10462)

    Fix Escape in image crop mode clearing the selection. (#10463)

    Fix crop mode staying active when the cropping shape is deleted. (#10370)

    Fix pressing Enter on a selected image entering crop mode in a readonly editor. (#10492)

    Arrows and shapes

    Fix arrows bound to custom shapes with non-standard size values rendering as NaN. (#10214)

    Fix elbow arrows with a free terminal sometimes routing through the bound shape. (#10219)

    Fix arrow geometry ignoring a custom stroke width from getCustomDisplayValues. (#10230)

    Fix the arrow binding target highlight staying visible after clicking an arrow handle without dragging. (#10191)

    Fix a stub arrow being left on the canvas when switching tools during an arrow press. (#10461)

    Fix arrow label drag reverting when a menu opens or undo is pressed mid-drag. (#10493)

    Fix Cmd+Enter / Tab on a note creating a duplicate on top of an existing neighbour. (#10199)

    Fix adjacent-note snapping under a scaled, grown note. (#10204)

    Fix the note tool not snapping a new note beside the note it just created when tool lock is on. (#10484)

    Fix attributed notes losing their font in exports. (#10249)

    Fix shift-extending a line inside a rotated frame placing the point incorrectly. (#10238)

    Fix the second diagonal of an x-box shape being treated as an outer edge. (#10245)

    Fix a replaced image being zoomed when the original had an explicit default crop. (#10234)

    Fix video shapes showing a floating spinner with no bounding box while their asset uploads or loads. They now show the same loading plate as image shapes. (#9994)

    Fix Flatten to image producing different groupings depending on selection order, and not merging clusters that were only connected through a bridging shape. (#8661)

    Editor

    Fix dragging a frame out of its parent when grabbed over a nested child, and restore a child's original z-order when dragged back into a frame. (#10329)

    Fix camera constraints for bounds away from the page origin, and clamp padding against the correct viewport axis. (#10337)

    Fix setCameraOptions({ zoomSteps: undefined }) breaking every later camera move. (#10387)

    Fix slideCamera zoom momentum driving the zoom to zero on a long frame. (#10388)

    Fix malformed viewport deep links moving the camera to the origin instead of falling back to fitting the page content. (#10508)

    Fix following a user whose own leader has left or has no presence yet. (#10389)

    Fix getSelectionRotatedScreenBounds going stale when the editor container moves. (#10390)

    Fix duplicateShapes throwing on unknown ids and offsetting nested duplicates twice. (#10355)

    Fix packShapes packing shapes of different heights into a single column. (#10381)

    Fix stackShapes reordering shapes when a gap is given. (#10383)

    Fix nested 270° shapes being dropped from axis-aligned shape clustering. (#10384)

    Fix putContentOntoCurrentPage mutating the content passed to it. (#10367)

    Fix setErasingShapes mutating its input array, so it accepts store-owned (frozen) arrays. (#10371)

    Fix the teardown returned by the createTLStore onMount option never running when the editor unmounts. (#10375)

    Fix drop events inside the canvas never reaching React drop handlers, and keep Safari gesture suppression working with multiple editors on a page. (#10360)

    Fix object URLs for locally persisted assets leaking across remounts. (#10361)

    Fix the click-capture overlay staying over the canvas after right-click panning with a menu open. (#10359)

    Fix hiding and showing menus by context id, and tolerate corrupt user-preference data in localStorage. (#10344)

    Fix Vec.Slope, Vec.cross, and areAnglesCompatible for negative angles, rotateSelectionHandle for negative rotations, and dotted dash arrays for very short paths. (#10352)

    Fix laser trails staying visible after changing page. (#10509)

    Fix locking a mixed selection of locked and unlocked shapes leaving the shapes selected. (#10480)

    Fix wheel event normalization passing through non-finite delta values. (#9586)

    UI

    Fix the Frame selection shortcut (Ctrl+Alt+G) not working on Windows and Linux. (#10481)

    Fix pasted text shapes and bookmarks not being selected after paste. (#10485)

    Fix context-menu paste landing under the pointer instead of at the right-click point. (#10488)

    Fix file drops and pastes silently doing nothing when one of the files is an image that can't be decoded. The bad file is now skipped with an error toast and the other files are placed. (#10495)

    Fix the Edit link dialog staying open as an empty panel when its shape is deleted or deselected. (#10496)

    Fix wheel and trackpad scrolling over the minimap moving the camera at double rate. (#10499)

    Fix the actions menu button appearing, and opening empty, in readonly mode with the hand and zoom tools. (#10503)

    Fix closing a stacked dialog by touch also closing the dialog beneath it. (#10002)

    Fix the loading screen not honoring the system theme on a dark OS, and the reduce motion preference not following the OS setting until a reload. (#10528)

    Fix the storage read-failure alert promising a reload that never happened. (#10530)

    Fix the casing of the error fallback's refresh button. (#10362)

    Fix pasted links showing a broken preview image when the linked page has no Open Graph image. (#9909)

    Fix the counterclockwise rotation tooltip not showing its comma key. (#9772)

    Fix the spacing around the cursor chat item in the context menu. (#9921)

    Fix the people menu's collaborator rows not lining up with your own row above them: the follow icon sat too close to the right edge, and collaborator names sat slightly left of your own. (#9900)

    Fix the comment thread popover briefly rendering with a doubled shadow the first time a thread is opened. (#9886)

    Persistence and sync

    Fix edits made in the last 350 ms before closing or reloading a tab being lost from local persistence. (#10526)

    Fix background tabs repeatedly dropping and re-establishing their sync connection when the browser throttles timers. (#9964)

    Fix useSyncDemo creating assets for uploads the server rejected. (#10109)

    Fix loadSnapshot failing on better-sqlite3, and NodeSqliteWrapper getting stuck in a transaction when COMMIT fails. (#10111, #10113)

    Signals and store

    Fix computeds returning stale values when read inside a transaction during an effect, from a deferred effect, or after a reactor restarts. (#10145)

    Fix effects with no signal dependencies re-running on every start(). (#10148)

    Fix nested transactions inside effects not rolling back with their parent. (#10149)

    Fix effects observing half-restored state when a deferAsyncEffects call throws. (#10150)

    Fix @computed on a subclass override that calls super, and @computed() with no arguments. (#10151)

    Fix computeds re-running their compute function on every read after their first derive throws. (#10152)

    Fix computeds read inside an atom's computeDiff never seeing that change, and an explicit null diff passed to atom.set() or returned from withDiff() clearing history. (#10153)

    Fix localStorageAtom throwing outside the browser. (#10154)

    Fix a stack overflow in ImmutableMap and AtomMap for keys named after Object.prototype members, and make NaN and -0 key equality match native Map. (#10202)

    Fix AtomMap throwing when an entry is deleted mid-iteration. (#10209)

    Fix StoreSchema.create reporting a redundant migration dependency as circular. (#10213)

    Fix the store.query.ids() query creator being called with a computed's (previousValue, epoch) arguments. (#10218)

    Fix CollectionDiffs from store.query.ids() and index() containing an empty added or removed set after an add/remove round trip. (#10221)

    Original source
  • Aug 18, 2026
    • Date parsed from source:
      Aug 18, 2026
    • First seen by Releasebot:
      Aug 18, 2026
    tldraw logo

    tldraw

    v5.3.2

    tldraw fixes license handling and metadata across packages, improves default UI stability outside the Tldraw component, and tightens license validation for custom protocols and wildcard hosts.

    Generated from commits between v5.3.1 and HEAD

    Bug Fixes

    License fixes and product metadata (#10062)

    Added product metadata to all our package.json files to make licensing clearer between packages.

    Fixed default UI components (such as DefaultToolbar and
    DefaultQuickActionsContent) crashing when mounted outside the Tldraw
    component.

    Fixed license validation treating native apps served from custom
    protocols as development environments.

    Fixed wildcard license host matching so *.example.com matches only
    that domain's subdomains.

    Added internal useMaybeLicenseManager(): the license manager from
    context, falling back to the nearest editor's, or null.

    Added internal Editor.licenseManager, assigned by <TldrawEditor />
    when it creates the editor.

    Changed internal useLicenseFeatureFlag to accept LicenseManager | null and return false for null.

    Original source
  • Aug 14, 2026
    • Date parsed from source:
      Aug 14, 2026
    • First seen by Releasebot:
      Aug 15, 2026
    tldraw logo

    tldraw

    v5.3.1

    tldraw fixes an iOS touch bug when the editor sits inset from the page edge.

    Generated from commits between v5.3.0 and HEAD

    Bug Fixes

    • fix(editor): don't swallow touches when the editor is inset from the page edge (#9989)
    • Fixed a bug where touches in part of the canvas were ignored on iOS when the editor was inset from the edge of the page, such as beside a sidebar.
    Original source
  • Aug 5, 2026
    • Date parsed from source:
      Aug 5, 2026
    • First seen by Releasebot:
      Aug 6, 2026
    tldraw logo

    tldraw

    v5.3.0

    tldraw adds first-class canvas commenting and collaboration tools, plus geo shape flipping, smarter image cropping, better embed sizing, faster large-page performance, and a long list of crash and interaction fixes across the editor.

    What's new

    Commenting (#9471, #9782, #9850)

    Comments are now a first-class primitive in the SDK. @tldraw/commenting ships a batteries-included canvas comments layer: threads anchor to a point, a shape (precisely or imprecisely), a text range, a region, or the page. You can reply, edit, react, resolve, and delete comments. The pins drag to re-anchor, and ?comment=<id> deep links open a thread and bring the camera to its pin. Comment pins cluster together as you zoom out and separate back out as you zoom in.

    Comment records live in @tldraw/tlschema as TLCommentThread, TLComment, and TLCommentReaction, and sync over a new generic object store in @tldraw/sync-core, so they ride alongside the document rather than inside it. On the server, @tldraw/sync-collaboration enforces write authorization, with a canModifyComment rule that lets a host widen the default owner-only permission. That way a workspace admin can moderate comments they don't own without granting anything beyond edit, delete, and resolve.

    One rollout note: the comment record types ship with guard migrations, so once your server registers them, clients on an older SDK are rejected as too old and prompted to refresh. Roll out the upgraded client before or alongside the server change.

    The layer is built to be taken apart. ThreadRow and ThreadActions are component slots, CommentListItem and sortSidebarRows are exported so a hand-built list can match the built-in one, and a host that supplies getThreadHref gets copy-link in the thread menu. On phones, the composer and the open thread stay above the software keyboard.

    New packages

    Package

    What it provides

    @tldraw/commenting

    Canvas comments layer, comment UI components, and the comment tool

    @tldraw/mentions

    @-mention picker and TipTap node, shared by comments and shape rich text

    @tldraw/collaboration

    Umbrella package for the collaboration pieces

    @tldraw/sync-collaboration

    Server-side write authorization for collaboration features

    See the commenting docs for setup.

    API changes

    šŸ’„ Remove usePassThroughMouseOverEvents from @tldraw/editor. It re-dispatched mouseover at .tl-canvas so shapes under a floating panel stayed hovered, but the canvas only wires onPointerEnter, so the re-dispatched event arrived at an element with no listener for it. (#9782)

    Add TLCommentThread, TLComment, and TLCommentReaction records to @tldraw/tlschema, with createCommentThread and createComment helpers, id helpers, validators, and commentSchemaRecords for registering them. (#9471, #9782)

    Add a generic object store to @tldraw/sync-core for syncing non-document records: objectTypes on the room and storage constructors, per-session TLObjectStoreAccess, getObjectsSnapshot(), onCommittedChanges, and an optional TLSyncStorage.getObjectsByIds(ids) for callers that need a few object-lane records rather than the whole lane. (#9471, #9782)

    Add objectAccess to the synced-remote member of RemoteTLStoreWithStatus, so a store from useSync reports whether the session can write object-lane records such as comments. If you construct that type yourself, in test mocks for example, you now need to supply objectAccess. (#9471)

    Add EditorPortal, EditorPortalProps, and useEditorPortalHost to @tldraw/editor, for portalling canvas-anchored content into a host the editor renders last so its DOM order doesn't depend on mount timing. (#9782)

    Add renderHtmlFromRichTextWithExtensions(richText, extensions) for rendering rich text outside a shape's editor config. renderHtmlFromRichText now fills every empty paragraph with a <br /> and keeps the paragraph's attributes, so an empty paragraph renders as <p dir="auto"><br /></p> — worth knowing if you snapshot that output. (#9782)

    Add flipX and flipY to TLGeoShapeProps, with an AddFlipProps migration defaulting both to false, and add PathBuilder.transform(mat) for producing a transformed copy of a path. (#9530)

    Add an optional sizeToContentAspectRatio to EmbedDefinition and a public EmbedShapeUtil.resolveAspectRatio(shape). When set, an embed corrects its size after creation to its content's real aspect ratio, resolved from the URL's OpenGraph metadata via the editor's url asset handler. Existing custom embed definitions are unaffected. (#9613)

    Add ExportAsMenuGroup, mirroring CopyAsMenuGroup, for the "Export as" submenu. (#9589)

    Add EditorManager, a public abstract base class for editor managers that own a subscription or resource, so they share one teardown contract. InputsManager, TickManager, FocusManager, and TextManager now extend it. (#9204)

    Populate TLBaseExternalContent.sources for file pastes, where it was previously always undefined, so custom files handlers and onBeforePasteFromClipboard can inspect the text, HTML, and url content that came alongside the files. (#9763)

    Add an assets prop to TldrawImage, so a snapshot's images render from a custom asset store the same way they do in Tldraw. Previously TldrawImage always used the inline base64 asset store, so images kept anywhere else were missing. (#9697) (based on an implementation by @jon-dez)

    <TldrawImage snapshot={snapshot} assets={assetStore} />

    Add an unmount event to TLEventMap and make Editor.getIsMounted() a reactive value that tracks whether the editor's component is currently mounted. (#9472, #9483)

    Make the shape hit-test margin pointer-aware and add a coarseHitTestMargin option: fine pointers (mouse and trackpad) use a tighter 3px default, coarse pointers (touch and pen) use 4px. (#9492)

    Add a ShapeUtil.onDuplicate(source, duplicate) callback, invoked by Editor.duplicateShapes and Editor.putContentOntoCurrentPage, so a shape can adjust its props when it is copied. Sticky notes now use it to attribute duplicated or pasted text to the current user instead of carrying over the original author. (#9566)

    Improvements

    Geo shapes now flip. Previously flipping a selection left directional shapes such as the rhombus, trapezoid, and arrow geo shapes looking exactly the same on the other side of the mirror. TLGeoShape gains flipX and flipY props, matching the image shape, and a flip mirrors the shape's generated path. Geometry, hit-testing, the selection indicator, the canvas render, and SVG export all read from that path, so they stay in agreement. (#9530)

    When cropping an image, crop edges now snap to other shapes and the grid, with the usual snapping guidelines. Holding Alt resizes the crop region symmetrically from its center. (#9424)

    Size embeds from providers that report their content's dimensions (currently Vimeo) to that content's real aspect ratio, so a video is no longer letterboxed inside a 16:9 box. The corrected embed keeps the area of the original box, so a portrait video doesn't balloon over whatever sits above and below it. (#9613, #9756)

    Hide the "Copy as", "Export as", and "Export file" submenus, and the main menu's export group, when a consumer has removed all of their actions through overrides, instead of leaving an empty submenu trigger behind. (#9589)

    Improve viewport culling performance on large pages: the spatial index now rechecks only the shapes affected by a change instead of every shape on the page. Custom shapes whose geometry depends on unrelated shapes (outside parent/child and binding relationships) are no longer automatically rechecked for culling when those shapes change; built-in shapes and standard patterns are unaffected. (#9093)

    Improve performance when deleting many shapes at once by batching page state cleanup. (#9456)

    Make long toast and dialog content wrap instead of overflowing, so long strings like URLs stay within the toast or dialog. (#9546)

    Delay the appearance of the "back to content" button by about a second so it no longer flickers during normal panning and zooming. Hiding stays immediate. (#9448)

    Remove the unnecessary ellipsis from the "Keyboard shortcuts" menu item. (#9570)

    Bug fixes

    Fix the tldraw package failing to resolve @tldraw/state and @tldraw/tlschema on package managers that enforce strict dependency isolation, such as pnpm. Both were imported without being declared as dependencies. (#9762)

    Fix the zoom keyboard shortcuts (shift+1, shift+2, and shift+0) not working on non-US keyboard layouts. They matched on the typed character, so on layouts whose shifted number row differs from US QWERTY — British PC and German, for example — zoom to selection did nothing and zoom to 100% zoomed in instead. Number-row shortcuts now resolve by physical key. (#9863)

    Fix comments folded into a cluster badge lagging behind their shape while the shape is dragged. A clustered pin now pops out of its badge on the drag's first movement and rides its anchor, instead of correcting only on pointer up. (#9878)

    Fix usePassThroughWheelEvents losing its listener when the element its ref points at unmounts and remounts while the component stays mounted. Comment pins that had scrolled off-screen and back swallowed wheel events instead of passing them through to the canvas. (#9882)

    Fix zooming and panning not working while the cursor is over a non-scrollable UI overlay. The wheel pass-through guard treated any element whose content overflowed as scrollable, and a hover transform on a small overlay was enough to trigger that. Overlays now count as scrollable only when their computed overflow says so. (#9698)

    Fix a crash when dragging content from another browser tab whose URL isn't a valid link, which happens when an ad blocker rewrites the dragged URL to something like about:blank#blocked. Dropping one now shows an error toast instead of failing validation on the bookmark shape. (#9598)

    Fix the "URL" label wrapping onto two lines in the edit link and embed dialogs. (#9663)

    Fix rich text headings (H1–H6) rendering with their line-height too tight, causing overlapping lines. (#9543)

    Fix the style panel not highlighting the active fill correctly when the current fill lives in the overflow dropdown. (#9509)

    Fix the style panel Shape, Line, and spline dropdown popovers so they open with the same gap as the other dropdowns. (#9491)

    Fix double-clicking a shape inside an unfocused group immediately editing it; a double-click now drills one level into the group. (#9488)

    Fix selected clipped arrows so they can be dragged when their geometry extends outside a clipping parent. (#9479)

    Fix arrows bound to frames so they duplicate and delete with the frame without being clipped. (#9470)

    Fix a shape dragged from the toolbar to a frame beneath the toolbar not being parented to the frame. (#9458)

    Fix a missing onChildrenChange call when creating a shape directly within a parent shape. (#9455)

    Fix the reactive Meta (Cmd) key state not clearing on keyup until a pointer event on macOS, which affected getMetaKey() and getAccelKey(). (#9404)

    Fix a crash when dragging a handle on a line whose point keys differed from their indices. (#9299)

    Fix arrow bindings floating outside a geo shape after changing its geo type; precise bindings now re-snap to the nearest point on the new shape. (#9281)

    Fix an occasional crash in text measurement by iterating over grapheme clusters instead of individual characters, keeping emoji, flags, and accented characters intact. (#9266)

    Fix a crash ("Shape not found") when dragging a tool from the toolbar in a read-only room. (#9225)

    Fix sync clients not recovering from a malformed WebSocket message; they now restart the connection so a corrupt frame can no longer silently leave the client out of sync. (#9380)

    Fix uploaded asset handling for invalid R2 object names. (#9495)

    Fix a crash when a custom font failed to load after its editor had been disposed. (#9494)

    Fix license expiry being evaluated in local time, which could deactivate a license a calendar day early for users west of UTC; the expiry date is now treated as the last fully usable day in UTC. (#9475)

    Original source
  • Jul 9, 2026
    • Date parsed from source:
      Jul 9, 2026
    • First seen by Releasebot:
      Jul 9, 2026
    tldraw logo

    tldraw

    v5.2.4

    tldraw fixes unfilled closed draw shapes to avoid a spurious closing stroke segment.

    Generated from commits between v5.2.3 and HEAD

    Bug Fixes

    • fix(tldraw): don't close the stroke on unfilled closed draw shapes (#9538)
    • Fix unfilled closed draw shapes drawing a spurious closing segment in the solid, dashed, and dotted dash styles.
    Original source
  • Jul 6, 2026
    • Date parsed from source:
      Jul 6, 2026
    • First seen by Releasebot:
      Jul 6, 2026
    tldraw logo

    tldraw

    v5.2.3

    tldraw fixes arrow endpoint double-click toggles to avoid conflicts with dragging.

    Generated from commits between v5.2.2 and HEAD

    Bug Fixes

    • fix(arrows): defer handle double click toggle (#9499)
    • Fix arrow endpoint double-click toggles firing before a second click can become a drag.
    Original source
  • Jul 2, 2026
    • Date parsed from source:
      Jul 2, 2026
    • First seen by Releasebot:
      Jul 3, 2026
    tldraw logo

    tldraw

    v5.2.2

    tldraw fixes PNG and SVG exports to stop clipping text glyph ink.

    Generated from commits between v5.2.1 and HEAD

    Bug Fixes

    • fix(tldraw): stop PNG/SVG exports clipping text glyph ink (#9463)
    • Fix exported PNG and SVG images clipping the edges of italic,
      right-to-left, and cursive text.
    Original source
  • Jul 1, 2026
    • Date parsed from source:
      Jul 1, 2026
    • First seen by Releasebot:
      Jul 3, 2026
    tldraw logo

    tldraw

    v5.2.0

    tldraw ships a major performance and polish update with much faster freehand ink, quicker resizing and editor load, simpler double-click handling for better mobile gestures, easier frame selection and shape-to-frame workflows, and dozens of bug fixes across touch, sync, text, and export experiences.

    This release brings in performance improvements across tldraw. The freehand ink algorithm now computes strokes 2–3x faster, shape resizing is quicker, and editor load time is reduced. Multi-click handling was simplified to double-click only to support improved mobile gestures. Plus it's easier to add shapes to frames, and dozens of bugs were fixed.

    What's new

    Faster freehand ink (#9154)

    We rewrote the freehand ink algorithm. Draw and highlighter strokes now compute about 2x faster (up to 3x for long strokes) and produce 57% smaller SVG path data, with no visible change to how strokes look. The rewrite removes two rarely-used stroke APIs; see the breaking changes in API changes.

    Frame selection (#8151)

    A new "Frame selection" action wraps the selected shapes in a frame with cmd+shift+f. When a frame is selected, the same shortcut removes it.

    API changes

    šŸ’„ Simplify multi-click handling to double-click only. ClickManager no longer tracks triple or quadruple clicks: the triple_click and quadruple_click events and the onTripleClick / onQuadrupleClick handlers have been removed, and TLClickEventName is now just 'double_click'. (#8897)

    šŸ’„ Move ShapeIndicatorOverlayUtil and TLShapeIndicatorOverlay from @tldraw/editor to tldraw. Both are still exported from tldraw; update any imports of these symbols that came directly from @tldraw/editor. (#9018)

    šŸ’„ Drop support for the EOL Node 20. The minimum supported Node is now >=22.12.0, the first version with native require() of ES modules, so tldraw can depend on ESM-only packages. (#9098)

    šŸ’„ Type the collaborator user-id APIs as TLUserId instead of string. TLInstancePresence.userId / followingUserId, TLInstance.followingUserId / highlightedUserIds, Editor.startFollowingUser(), Editor.zoomToUser(), usePresence(), usePeerIds(), and the people-menu prop types now use TLUserId. Runtime behavior is unchanged: TLUserId is a branded string, so cast plain strings at the call site, for example editor.startFollowingUser(userId as TLUserId). (#9002)

    šŸ’„ Remove StrokePoint.vector and setStrokePointRadii from the freehand stroke pipeline. The vector is derivable from consecutive points and radius/taper computation now happens inside getStroke and svgInk; nothing in the SDK consumed these outside the pipeline itself. (#9154)

    šŸ’„ Remove the obsolete selection-background slot from @tldraw/editor: DefaultSelectionBackground, TLSelectionBackgroundProps, TLEditorComponents.SelectionBackground, and the useTransform helper. These were unused and have no replacement; remove any references to them. (#9362)

    Add an embedConfig option to EmbedShapeUtil for passing per-embed configuration such as API keys. The default Google Maps embed no longer reads process.env.NEXT_PUBLIC_GC_API_KEY — pass the key explicitly instead. (#9068)

    EmbedShapeUtil.configure({
    embedConfig: { google_maps: { apiKey: '...' } },
    })

    Add an allowVideoAutoplay option to TldrawOptions. When set to false, no video shape autoplays regardless of its per-shape autoplay prop — including pasted and restored shapes. Defaults to true. (#8943)

    Add ShapeUtil.getContentElement and ShapeUtil.onReleaseContentElement, an app-owned content element lifecycle that lets stateful shape content (such as cross-origin iframes) survive unmounting the editor. (#9167)

    Improvements

    Open the context menu with a right-click from any tool, not just the select tool, and with a touch long-press while using the select tool. Long-pressing on a shape-creation tool no longer leaves a stray shape behind. (#8948)

    Add a shift+q shortcut that copies the styles of the hovered shape and applies them to the next shapes you create. (#9028)

    Add a double-tap-and-drag zoom gesture for touch devices. (#7858)

    As you drag out a frame, the frame tool now highlights the shapes it will enclose. (#9102)

    Pasted bookmarks now show an immediate loading placeholder with a spinner at the paste location, instead of waiting for metadata before appearing. (#8663)

    Add the missing keyboard shortcuts (copy as PNG, print, insert embed, highlight tool, frame selection, flatten, toggle locked, distribute horizontally/vertically) to the keyboard shortcuts dialog. (#9285)

    Make the selection corner rotate handles easier to grab. (#9374)

    Reduce the default indentation on rich-text lists so nested lists take up less horizontal space. (#9287)

    Hide the "back to content" button during the animation that pans back to the canvas when focusing it. (#9278)

    Remove the extraneous title tooltips on menu items. (#9315)

    @tldraw/mermaid now loads its ESM-only mermaid dependency lazily, so the package is requirable from CommonJS and mermaid only loads when a diagram is created. (#9100)

    Keep sync at full speed when the same multiplayer room is open in multiple tabs, windows, or devices — previously a room with no other users throttled network sync to once per second. (#8988)

    Include DOCS.md documentation in published npm packages, and a generated docs and release notes rollup in the tldraw package, so documentation is available when browsing package artifacts. (#8503)

    Shrink stored draw shape data for mouse, trackpad, and finger input by ~33% by omitting the redundant constant-pressure value from the encoded path. (#8963)

    Improve performance when resizing many shapes at once. (#9153)

    Improve change tracking and sync performance when many shapes change at once. (#9151, #9152)

    Improve validation performance during high-frequency updates. (#9150)

    Speed up editor load by caching generated pattern fill defs and deduplicating icon preloads, so neither is rebuilt on every editor mount. (#9345, #9351)

    Remove the jittered-fractional-indexing dependency and speed up index key generation and validation; newly generated index keys are slightly shorter. (#9352)

    Improve minimap rendering performance on large documents. (#9355)

    Bug fixes

    Fix the fill style dropdown trigger showing a misleading tooltip for the currently selected fill. (#9023)

    Fix a two-finger pinch unintentionally changing the selection on touch devices. (#9006)

    Pasting content while dragging, translating, resizing, or rotating no longer steals selection from the shape being manipulated. (#8976)

    Fix a bug where pressing Tab while editing a list inside a note shape created a new note instead of indenting the list item. (#8958)

    Fix the viewport shifting slightly when zooming past the minimum or maximum zoom level. (#8957)

    Improve the contrast of disabled buttons and menu items in dark mode. (#8931)

    Fix debounce(...).cancel() leaving an awaited call hanging forever; it now rejects the pending promise. (#8683)

    Fix arrows jumping to incorrect positions after undoing or redoing shape deletions involving bindings. (#8283)

    Fix touch long-press on shape-creation tools so the context menu opens without leaving a stray shape behind. (#8946)

    Fix text labels drifting vertically between browsers (e.g. Chrome vs Safari) in multiplayer by snapping line-height to whole pixels. (#8981)

    Fix collaborators not appearing until they interact with the board, idle following peers not being hidden, the "following you" indicator not showing in the people menu, and a phantom cursor for your own other browser sessions. (#9088, #9002)

    Fix releasing a modifier while still holding a shortcut key triggering the adjacent non-modifier shortcut. (#9099)

    Fix redo (cmd+shift+z) not firing after an undo (cmd+z) on macOS when cmd is kept held. (#9139)

    Fix releasing a fast right-click pan zooming the camera to the maximum zoom level. (#9140)

    Fix selection handles disappearing when pressing (but not yet dragging) a resize edge, resize corner, or rotate handle, and keep selection chrome consistent while pointing. (#9179, #9184)

    Fix double-clicking an arrow handle no longer toggling the arrowhead on that end. (#9180)

    Fix the camera jumping when a one-finger hand-tool pan transitions into a two-finger pinch zoom. (#9182)

    Fix arrows becoming partially un-hoverable and un-clickable when bindings were created or updated without a shape change (e.g. createBindings after createShapes). (#9183)

    Fix camera state getting stuck at moving when the editor is disposed during camera movement (e.g. React strict mode with a shared store). (#9201)

    Fix the following indicator border being hidden beneath UI panels. (#9210)

    Fix the sync version-mismatch handshake reporting CLIENT_TOO_OLD when the server is the one running an older version; it now correctly reports SERVER_TOO_OLD. (#9212)

    Fix ctrl+click on macOS not selecting locked shapes or opening the context menu; it now behaves like a right-click. (#9234)

    Fix a crash that could occur when undo or redo restored an editing state for a shape that no longer exists. (#9260)

    Fix the line tool's minimum bend distance so it's measured in screen pixels. Shift-click now behaves the same at every zoom level. (#9275)

    Fix style scrubbing selecting the wrong option when you release the pointer over a different style section. (#9280)

    Fix empty rich text (an empty array) not being treated as an empty label. (#9295)

    Fix desktop graphics tablets (e.g. Wacom) incorrectly switching the editor into pen mode. Pen mode now auto-enables only for direct-display stylus input such as Apple Pencil on iPad or Surface Pen on a touchscreen. (#9316)

    Fix inconsistent easing when clicking the minimap to move the camera. (#9355)

    Fix sync clients crashing when a malformed WebSocket message is received. (#9356)

    Fix a crash when measuring viewport bounds after the editor document body is unavailable. (#9357)

    Fix highlighted rich text showing an outline in dark mode. (#9358)

    Fix text in exported images sometimes being sized with a fallback font when the export ran before the document's fonts had finished loading. (#9372)

    Fix a crash when a shape is deleted mid-click (e.g. by a remote user or an undo) while clicking on it. (#9376)

    Fix the license manager treating loopback hosts other than localhost (such as 127.0.0.1 and ::1) as production environments. (#9384)

    Fix the crop of a grouped, cropped image shifting when the group is flipped by dragging a resize handle. (#9395)

    Original source
  • Jun 12, 2026
    • Date parsed from source:
      Jun 12, 2026
    • First seen by Releasebot:
      Jun 16, 2026
    tldraw logo

    tldraw

    v5.1.1

    tldraw fixes pen mode touch handling so lines start where the pen first touches the screen.

    Generated from commits between v5.1.0 and HEAD

    Bug Fixes

    fix(editor): forgets previous touch interactions when entering pen mode (#9162)

    Fixed a bug when user enter pen mode while a finger/hand is on the touch screen device. We cancel previous touches and the line starts where the pen first touched the screen.

    Original source
  • Jun 3, 2026
    • Date parsed from source:
      Jun 3, 2026
    • First seen by Releasebot:
      Jun 3, 2026
    tldraw logo

    tldraw

    v5.1.0

    tldraw releases a redesigned page menu with inline editing, adds style copying from hovered shapes, expands locked-shape selection, and ships new public translation and cleanup APIs. It also improves canvas performance and fixes a range of rendering, accessibility, and UI bugs.

    This release redesigns the page menu around inline interaction, adds a keyboard shortcut to copy styles from a hovered shape, and adds a selectLockedShapes option for inspecting locked shapes, along with new public translation APIs, canvas performance improvements, and various rendering and UI bug fixes.

    What's new

    Page menu redesign (#8836)

    The page menu no longer has an explicit edit mode. Reorder pages by dragging a row directly, rename inline by double-clicking the label or pressing Enter, and drag the new resize handle at the bottom of the popover to adjust the list height — the height is persisted across sessions and a double-click on the handle resets it to the default. The current page is now indicated by a subtle background pill, the row submenu trigger reveals on hover, and the "Create new page" button is pinned to the footer of the popover.

    API changes

    Add a selectLockedShapes option to TldrawOptions. When enabled, locked shapes can be selected by left click or by brush/scribble selection while remaining protected from edits, moves, and deletes. (#8860)

    Export TldrawUiTranslationProvider, AssetUrlsProvider, and useAssetUrls as public API so components like TldrawSelectionForeground can be rendered without the full TldrawUiContextProvider. (#8909)

    Add FontManager.dispose(), OverlayManager.dispose(), and OverlayUtil.dispose() for cleaning up manager state across editor lifecycles. (#8896)

    Improvements

    Add a q shortcut that copies the styles of the hovered shape and applies them to the next shape you create. (#8917) (contributed by @kaneel)

    Improve performance on busy canvases — getRenderingShapes() now skips its sort step when only shape props, not the set of shape ids, have changed. (#8784)

    Improve drawing performance on pages with many shapes by skipping spatial index and culling recomputation when only shape props change. (#8799, #8804)

    Bug fixes

    Fix a misleading "license expired" console warning for perpetual licenses on covered versions. (#8791)

    Fix inconsistent tooltip behavior on the video toolbar by using TldrawUiToolbarButton for the replace and download buttons. (#8794)

    Fix the missing open-state hint on the page menu and zoom menu triggers when rendered outside the main toolbar. (#8813)

    Mark the tldraw UI layer with role="document" so toolbars, menus, and dialogs stay reachable to mobile screen readers like VoiceOver and TalkBack, which do not announce the outer canvas role="application". (#8901)

    Fix selection edge resize handles overlapping corner handles, which made corners hard to grab on small shapes. (#8926)

    Fix a bug where deleting a shape inside a group could move the group to a different z-index. (#8925) (contributed by @kaneel)

    Avoid console errors from calling preventDefault on non-cancelable events. (#8910)

    Only log the missing-translation warning once per session instead of once per useTranslation consumer. (#8909)

    Catch image.decode() rejections from the icon preload effect so they no longer surface as uncaught promise errors in the console. (#8824)

    Original source
Releasebot

Curated by the Releasebot team

Releasebot is an aggregator of official release notes from hundreds of software vendors and thousands of sources.

Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.