Desktop builds from every branch. Check the branch and result, expand any commit notes, then choose a download.
Filters search the full history. Enter an exact branch name, or click a branch below.
About these downloads
Choose notarized macOS builds when available. Signed builds may still be awaiting notarization. Downloads are ZIP archives, retained for 14 days. Only installers uploaded after October 2, 2026 at 16:37 UTC are public. A failed build can still have a usable installer from a successful packaging job.
PR, commit, and log links open GitHub and may require repository access. Notes are the commit author's description.
459 matching builds · Page 3
Follow a file's status and title as signals (DRA-560)
The file session copied its tldraw signals into a hand-made listener set,
and every reader went through getState, getStatus or subscribe. The
session now hands out the signals themselves: its status, the file's
title, and whether its tab is the one on screen.
Components that show the status, such as the tabs, the document bar,
the notices and the history dialog, follow it with useValue. Handlers
read it when they run. The tabs, the workspace and the agent context
share one title instead of working it out three ways.
The workspace still follows edits as a transition, and a tab in the
background still holds what it last showed. useFileValue does that
holding, so other parts of the window can use it later.
The session counts a file as loaded one task after its records arrive,
so the window can paint between taking them in and drawing them. That
wait is now its own signal. The workspace had been reading the live
status since edits started following as a transition, so it drew in the
same task again. Now it waits too. In the large-file measurement the
worst frame while opening goes from about 450 ms to 240 ms, and from
about 540 ms to 300 ms when opening from this computer's copy. The first
picture on reopening comes about 80 ms later, because the server's
catch-up now lands before it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Note which event ends a canvas drag before it's let go (DRA-558)
A drag that the browser or the system ends early, by cancelling the
pointer, taking its capture away or the window losing focus, looks to
the person like a drop that didn't happen. Each now leaves a breadcrumb
naming the event, so the next report says which it was. Escape and
deliberate cancels don't.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Keep the window's shared lists in tldraw atoms (DRA-572)
The images and icons being made, the agent list, the account, the icon
drawings, the open text selection and the previewed artboard sizes each
carried their own value, listener set and subscribe function. They are now
atoms that components read with useValue, the way the rest of the window
follows signals, and components that only want one file's runs or one
layer's selection read just that slice.
Stores that follow something outside the window (the agent list and the
account) start and stop with the component that shows them, instead of on
their first and last listener.
The notifications that carry no state to read, such as an icon being kept
or the connection panel being asked for, share a small emitter.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Fold the one-layer commands into their many-layer forms (DRA-570)
Hiding, locking, duplicating and deleting each had a command for one layer and
another for several, and the actions chose between them. The several-layer
commands now do the job, so the actions call one thing and the one-layer
commands (setNodeVisibility, setNodeLocked, duplicateNode, deleteSubtree) are
gone. moveNode stays, because moveNodes refuses artboards and page parents.
One layer must not cost more than before: naming a single layer skips the
check that layers don't overlap, which would have walked everything inside it,
and the in-place check walks up from the layer instead of reading the whole
tree. A test shows hiding, locking, copying and deleting one layer in a file
nobody has read the layer tree of reads the whole file at most once.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Wait for a draw, a load, a resize or a presented frame the same way (DRA-569)
Four waits each kept their own timer, listener and cleanup: the next draw of
an artboard, a frame's load, the agent window growing to a picture's size,
and a frame being presented. They now share one wait that gives up after a
set time or when its signal stops it, and always stops listening.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Declare each call between a window and main once (DRA-564)
The person's window named every one of its calls in four places: the type
the page sees, the preload, main's handler and the table of fallback
messages. It also parsed each call's input twice, once in the preload and
once in the handler. The agent window already declared its calls in one
table, with its preload and handlers made from it.
Both windows now use that one table format. The type the page sees, the
preload and main's handlers are all made from the tables, and a call
without a handler no longer compiles.
- Main parses every call's input once, before the handler runs, and the
preload no longer parses it. Who may ask is still checked first. For the
person's window that check is now in one place instead of two, and a
trace from the page is only carried for the two calls that declare one.
- The calls both windows make (closing, the copies of files, drawing an
artboard, icons and fonts) are declared once and shared. Their handlers
for closing and the copies of files are shared too.
- The person's window hears main's notices through listeners named from
the notice tables, and main sends them through one function.
- Calls that take nothing send nothing, so a method used as an event
handler doesn't pass the event on.
- The agent window and the person's window now ask for icons by passing
the icon itself rather than an object holding it.
The names and signatures of window.draftly are unchanged.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Share one loop, one item-list shape and one reply file across the tools (DRA-568)
Tools that change several things at once looped, replied and counted in slightly different ways. They now share one of each.
One loop applies a change to each item and, when some are refused, names all of them in a single reply. It replaces the second loop that stopped at the first refusal, so canvas, review, plain-text and instance-value edits name every bad item the way tokens and fonts already did.
applyEach does the undo step, the loop and the "N in one step" reply for the tools that built those by hand. Renaming and updating images no longer work out item positions themselves (they add the images main stored for the file in one pass, naming any item whose image is unknown before anything is added), and canvas diagrams and updates take their positions from the same loop.
Lists of items have two shapes, one-or-many and many-only, with limits and per-item checks given as options. duplicate, set_styles_many and the canvas tools use them. Lists of plain ids, such as delete_token's ids, stay plain lists.
One plural helper replaces five and most of the inline singular-or-plural choices, one sentence sends a caller on to the next page of a long read, and the styling sentence of a new layer is shared with create_image and update_image. The reply helpers that were spread over define, replies, batch-reply and main-tool now live in tools/reply.
Reply wording that changed:
- "More from offset 2." and "Call again with cursor 7 for more." now read "Call again with offset 2 for the rest." and "Call again with cursor 7 for the rest."
- create_image and update_image say ", wrote 2 declarations on it" where they said " and wrote 2 declarations on it".
- A refused item of a canvas, review, plain-text, instance-value or diagram call, among several, is named together with every other refused item and ends with "Nothing was changed; fix these and send the whole call again."
- A diagram whose source can't be laid out is refused with the problem alone (and the usual "Fix this input and call again." for a single one), without its own "Nothing was added." or "Nothing was changed."
- A repeated layer in duplicate or set_styles_many is reported at the repeated item.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Drop the layer filter on a parent's children in Layers (DRA-561)
A page's or layer's children are typed as layers now, so the helper
Layers uses to list them no longer needs to filter out other ids.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let the frame registry find a pick's element and know the artboard order (DRA-567)
"The element a pick points at" - the one its focus names, else the
layer's first element in the first artboard that draws it - was written
out by hand in a dozen places, and every one of them was handed the
artboard order as its own argument alongside the registry, about twenty
signatures in all, only because the registry didn't know it.
The canvas now tells the registry its artboard order, and the registry
answers `elementFor(pick)` and `elementAt(focus)` itself. A lookup can be
limited to one artboard or skip elements that can't serve, which covers
the callers that wanted the first element with a box, or the first one
not overridden. The `order` arguments are gone.
The overlay used to look up the pressed element up to six times in a
paint, and measure the hovered pair twice. A paint now finds the pressed
element once, only when something needs it, and each mark carries its
element instead of finding it again from its key.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Several pieces of the document package each wrote out the same routine
for staying up to date: read what changed since last time, or start over
from the whole file when the store's history has let go. Each also had
its own loop over a diff's added, updated and removed records.
followChanges now owns that routine, along with reading the value after
each change so a long run of changes it ignores can't push the history
past it. eachChange gives the before-and-after pair for every record in a
diff. The record lists, the layer tree, token mentions, the file size,
the values rebuilt on certain changes (document revision, layer words,
blank text) and the step-to-operations conversion all use them, as does
the way a followed view finds what to draw again. keep-current.ts folds
into the new module.
This also fixes the token mention index, which never kept itself current:
after more than 1,000 changes, other people's cursor moves included, the
next read scanned every layer in the file again. The caches test now
checks that neither a long step nor a long run of cursor moves sends any
cache back to the whole file.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Use the shared record check in the Paper port script (DRA-565)
The one-off script that reads a stored file kept its own copies of the
record check and of the schema description. It uses the shared ones now.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let tools return or throw, and turn refusals into replies in one place (DRA-563)
A tool used to turn every outcome and every thrown error into a reply by hand, in four different ways, so about sixty tool bodies were mostly plumbing. A bug thrown inside one of the wrapped tools also became a polite reply and was never reported.
Now implementTool turns a refusal (an action's or a document command's, or a stopped call) into the reply, and anything else goes on to the dispatcher, which already reports it. Running an action or a step on an agent's file throws the refusal instead of handing back an outcome, so tool bodies read straight through. The two copies of guarded, confirm, replyTo, readReply and reportingThrown are gone, and the main-process answer is the same done the window tools use. Reply text is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Gather the small disk helpers into main/disk (DRA-566)
The files Draftly keeps on this computer each repeated the same few steps,
so they now share them:
- One serial queue. The catalog, workspace state, local account scope and
disk queue each wrote their own chain of promises, and the queue type was
declared five different ways. They all use createSerialQueue now, whose
method is called runExclusive to match what the callers already used.
- readJsonFile and writeJsonFile do the read, decode, size limit and schema
check, and the write with a trailing newline, for the small JSON records
(file catalog, workspace state, local scope, agent installation, access
key, image cache descriptors and last-used times, image intake records).
- ensureDirectory replaces six copies of "make the folder unless it is
already there".
The disk queue and the disk cache moved into main/disk beside them.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
List Layers rows without reading each layer from the file (DRA-559)
Working out what a row lists read its layer from the file first, only to
tell whether the list could be kept, even when one already was. Listing
then checked that every row was still in the file and in the tree, which
can't fail, since every row it lists comes from the tree. Reading the file
for each row was most of the time spent listing, so the layer is now read
only when there is no kept list, and the check is gone.
In the large-file measurement in the test container, the Layers render
after a drop went from about 36 ms to 14 to 18 ms. With the change before
it, over three runs each against the code before both:
- the first frame after a drop comes 41 to 43 ms after the pointer is let
go, rather than 73 to 75 ms;
- the measurement's drop time is 60 to 61 ms, rather than 85 to 87 ms;
- an undo shows after 36 to 69 ms, rather than 62 to 73 ms.
Typing is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let artboards skip looking for a layer they can't draw
Every artboard's overlay works out its marks whenever the hover or the
selection changes, and each looked for the hovered and selected layers
in its own frame. In a large file, a frame whose list of elements had
gone stale, as it does while artboards are still drawing after the file
opens, listed all its elements again just to find nothing. Hovering
rows in Layers spent most of its time there.
A layer of an artboard's content is only drawn by the artboards that
show that content, so the others now skip it. A component's own layers
are still looked for everywhere, since they're drawn wherever it's used.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Draw again only the layers an edit reaches (DRA-535)
An artboard's look was worked out from scratch on every edit inside it: every
layer read through the store, turned into render nodes and compared with the
last look. In the large-file measurement that was about 10 ms of every typed
key in the test container, paid twice, once as the key is typed and again when
the server confirms it, and about 20 ms of every style change.
Each layer outside a component now keeps its drawing, and notes the records and
places in the tree it read besides its own. The look follows the store's
history and the layer tree, which now remembers the entries each change
reached, so an edit marks only the layers that read what it touched, and those
above them, to be drawn again. The rest keep their drawings as the same
objects, without being compared. Layers inside an instance are drawn with it.
A view near the node or depth limit is still resolved whole.
Tokens, theme and fonts are followed apart from the layers, and the web viewer
follows looks the same way. The branch tracking and the deep comparison of
whole looks are gone.
In the container, typing shows a key at a median of 21 ms rather than 37, a
style change shows at 38 ms rather than 55, and a drop at 92 rather than 104.
Following all 30 artboards of the 80,000-layer file holds about 8 MiB more.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Tell agents where cut-outs and letters are drawn when they measure (DRA-554)
get_computed_styles now gives an image layer visibleRect: where its image's
visible pixels land in the artboard, following object-fit (fill, contain,
cover, none, scale-down) and object-position, cut to the layer's box. It is
left out when it covers the whole layer, and the reply says when it can't be
placed, such as for a layer drawn scaled or turned.
For text, lines gives each line a layer draws with its box and words, and a
layer's range {start, end} gives the boxes of those characters, measured with
DOM ranges in the same frame the other reads use. An agent can now measure a
wordmark's letters without splitting it into a span per letter.
The images, typography and reading-files guide topics mention both. The tool's
description was trimmed so the tool list is no larger than before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Return screenshots no larger than the agent's client shows (DRA-550)
Claude Code scales any image over 2000 pixels on its longer side down,
so a screenshot asked for at up to 4096 pixels reached the agent smaller
than its reply said, and a reply saying "at full size" was wrong. A
screenshot's maxSide is now limited to 2000, and a picture at that size
says only that a smaller region shows more detail, since asking for a
larger one can't help.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let update_token change many tokens in one call (DRA-551)
update_token was called eight times in a row to set a run of tokens. It
now takes items, one per token, all applied as one undo step. A token that
can't be changed changes nothing, and every bad item is named. A call of
one item gets the same reply it did before; a call of several lists each
token's before and after and the notice about renames once.
It takes only items: the one-token form beside it would have repeated the
whole token schema in the tool list that every agent reads each session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let agents add an installed font by its family name (DRA-553)
search_fonts lists fonts installed on this computer but gives no file
path, so an agent that wanted one in the file had to look through the
fonts folder in a shell and add each face by path.
add_font now takes installed, a family name. Main finds the family's
font files in the folders fonts are installed to, reading only each
file's name table so a large font folder doesn't have to be read in
full, and then adds them the same way it adds files by path. A face
installed in two places is added once, and a family with more files than
one read allows is still added as a single font. The agent never names a
folder, so the window gets no raw disk access.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>