tldraw Release Notes

Follow

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

Get this feed:
  • 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
  • All of your release notes in one feed

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

    Create account
  • 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 15, 2026
    • Date parsed from source:
      Jul 15, 2026
    • First seen by Releasebot:
      Aug 6, 2026
    tldraw logo

    tldraw

    v5.2.5

    tldraw ships updates generated from commits between v5.2.4 and HEAD.

    Generated from commits between v5.2.4 and HEAD

    Original source
  • Similar to tldraw with recent updates:

  • 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
  • May 20, 2026
    • Date parsed from source:
      May 20, 2026
    • First seen by Releasebot:
      Jun 3, 2026
    tldraw logo

    tldraw

    v5.0.2

    tldraw fixes broken pattern fill exports in dark mode and light mode.

    Generated from commits between v5.0.1 and HEAD

    Bug Fixes

    • fix(tldraw): pattern fill exports broken in dark mode (#8872)
    • Fix pattern fill exports broken in dark mode when the editor was in light mode (and vice versa).
    Original source
  • May 15, 2026
    • Date parsed from source:
      May 15, 2026
    • First seen by Releasebot:
      May 16, 2026
    tldraw logo

    tldraw

    v5.0.1

    tldraw fixes style panel dropdown sizing and offset for better popover placement and alignment.

    Generated from commits between v5.0.0 and HEAD

    Bug Fixes

    fix(tldraw): style panel dropdown sizing and offset (#8850)

    Added optional sideOffset prop to StylePanelDropdownPickerProps
    for tuning popover position when the trigger isn't at the panel's left
    edge.

    Fix sizing and offset for style panel dropdown buttons so fill pattern
    and vertical alignment popovers open left of the style panel.

    Original source
  • May 13, 2026
    • Date parsed from source:
      May 13, 2026
    • First seen by Releasebot:
      May 13, 2026
    tldraw logo

    tldraw

    v4.5.12

    tldraw fixes the iOS context menu and clears a misleading perpetual license warning.

    Generated from commits between v4.5.10 and HEAD

    Bug Fixes

    • fix(context-menu): keep menu open after long-press release on touch (#8741)

      Fix the iOS context menu closing immediately after a long-press
      release.

    • fix(license): don't show expired warning for perpetual licenses on covered versions (#8791)

      Perpetual licenses no longer show a misleading "license expired"
      console warning when the user is past their calendar expiry date but
      still on a version covered by the license.

    Original source
  • May 13, 2026
    • Date parsed from source:
      May 13, 2026
    • First seen by Releasebot:
      May 13, 2026
    tldraw logo

    tldraw

    v4.4.2

    tldraw fixes perpetual license warnings so covered versions no longer show misleading expired notices.

    Generated from commits between v4.4.1 and HEAD

    Bug Fixes

    fix(license): don't show expired warning for perpetual licenses on covered versions (#8791)

    Perpetual licenses no longer show a misleading "license expired" console warning when the user is past their calendar expiry date but still on a version covered by the license.

    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.