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 6
Add a one-off workflow to move files to the slimmer records from a fast connection (DRA-520)
Older saved versions name a local image source and how its bytes were converted, which the
current format no longer has, so the rewrite turned them away. They are uploads, so they now
come through as uploads and can be restored again.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let the slim-records rewrite read versions saved before images were kept as added (DRA-520)
Older saved versions name a local image source and how its bytes were converted, which the
current format no longer has, so the rewrite turned them away. They are uploads, so they now
come through as uploads and can be restored again.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let the slim-records rewrite read versions saved before images were kept as added (DRA-520)
Older saved versions name a local image source and how its bytes were converted, which the
current format no longer has, so the rewrite turned them away. They are uploads, so they now
come through as uploads and can be restored again.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Read a layer's classes through classNameOf in the batch set_classes test (DRA-520)
The test came from main after layers stopped spelling out an empty class
list, so a layer with no classes holds none rather than "".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Don't hold an agent's join for the safety version or a slow access check (DRA-524)
When an agent joins, the room saves a version of what people did before it. That
save goes through the same queue as manual saves, restores, autosaves and
uploads, so a slow or backed-up queue left the agent's join unanswered for as
long as it took. The join now waits at most four seconds for it, then carries
on while the save finishes in the background. The version may then include the
agent's first changes, which is a better trade than an agent waiting minutes.
A join that waited a second or more for it is logged with how long.
The check of the session's access against D1 is the only other thing that can
hold up a join, and it is now limited to six seconds too. If it runs out the
app gets an HTTP error and joins again, the same as for a dropped connection.
The test backend can now hold up version writes, to show a join isn't delayed by
them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Don't hold an agent's join for the safety version or a slow access check (DRA-524)
When an agent joins, the room saves a version of what people did before it. That
save goes through the same queue as manual saves, restores, autosaves and
uploads, so a slow or backed-up queue left the agent's join unanswered for as
long as it took. The join now waits at most four seconds for it, then carries
on while the save finishes in the background. The version may then include the
agent's first changes, which is a better trade than an agent waiting minutes.
A join that waited a second or more for it is logged with how long.
The check of the session's access against D1 is the only other thing that can
hold up a join, and it is now limited to six seconds too. If it runs out the
app gets an HTTP error and joins again, the same as for a dropped connection.
The test backend can now hold up version writes, to show a join isn't delayed by
them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let add_font take several font files in one call (DRA-526)
add_font takes paths for a family's weights or several families at once.
Main reads the files together, so files of one family come back as one
font with a face for each. As with the other batches, it is all or
nothing: a file that isn't a font, a path that isn't absolute, or a
family the file already holds from Google refuses the whole call with
every such file or family named, and nothing is added. A call that works
is one undo step.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let agents read a layer back as HTML with read_html (DRA-527)
Re-reading edited copy took an agent dozens of outline, search and text calls, and clipped rows still hid the end of long text. read_html returns a layer, or what an artboard or content root holds, as the HTML write_html accepts, with all of its text. It goes through the same writer as the HTML export, so classes, inline styles and token references come out as the layer holds them.
Each element is marked with its layer id (data-layer-id) and, when it holds one text layer, that layer's id (data-text-id), so edits can aim at it. write_html now ignores both marks, which keeps a read and write round trip from storing ids as attributes. Bold, italic, underline, strike, code, small and links come out as the tags write_html turns back into styled words, line breaks as br, images by id, and component instances as data-component elements with their props and slot fills. Hidden layers, instance overrides and slots can't be written as HTML, so the reply says when they were left out.
Past maxChars (40,000 unless set) the markup stops between elements and the reply names the layers it didn't show, to read next. A block of text is never split, so one longer than the limit is written whole. The tool listing gets a little bigger, so the size ceiling on it moves up to match.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Magnify small screenshots, clarify find_nodes counts, and tell agents to ask for a finished review (DRA-528)
get_screenshot now draws a region smaller than the maxSide an agent asks for
larger, up to 8 times, and says "magnified N×". It is drawn at the larger size
rather than enlarged afterwards, so text and shapes stay sharp. Leaving maxSide
out keeps a region at its own size, and the line says how to magnify it.
find_nodes now says how many of the filtered layers it looked at and that the
kinds or blankText filter left the rest out, so the count isn't read as an
incomplete scan. When the result limit was the reason it stopped, it says so and
points to a higher limit instead of scanAfter.
present_for_review and get_review now tell the agent that Draftly can't wake it
when the review is submitted, so it should ask its person to message it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Answer list_files from the saved list and refresh behind it (DRA-525)
list_files waited for a network refresh on every call, which took 3 to 4 seconds. An agent polling
for a new file lost most of that time just waiting.
It now answers from the list this computer keeps and starts a refresh in the background when the
last one is more than a few seconds old. It only waits for that refresh when the list hasn't been
refreshed since the app started or is over a minute old, and then for at most half a second.
Files made or renamed here, by a person or an agent, already go into the list as they happen, so a
new file still shows up straight away.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Redraw hugging artboards after a token, theme or font change (DRA-516)
The follow-up after an agent call only looked at layer changes, so a
hugging artboard on a page nobody had open kept its old height when a
token, theme or font changed. Those changes now count against every
artboard, since working out which ones use a given token or font would
mean following every variable and font family in the file. The follow-up
already draws each artboard once however many calls touched it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Make image display copies lossy, and keep a WebP original as it is when it's smaller (DRA-519)
Display copies were lossless WebP for everything except photographic
formats, so on one account's cache 86 of 371 copies were larger than the
original they came from, and a 2752x1536 image took 5.2 MB. Every window,
agent view and shared page downloads these.
Pictures are now made as lossy WebP at quality 85. Re-encoding that
account's 325 cached pictures this way took them from 267 MB to 52 MB, and
the worst image still scored 0.91 SSIM at 1x and 0.92 at 2x zoom. Small
pictures (up to 256x256) that didn't come from a photographic format stay
lossless, where it costs a few kilobytes and keeps hard edges crisp.
When the original is a WebP that is still, carries no camera metadata and
fits a display copy, and is no larger than the copy we would make, its own
bytes are shown instead. Animated WebPs and ones with EXIF or XMP are
re-encoded, so a copy is still one frame and a shared page still never
carries what a camera recorded. AVIF originals are re-encoded for now:
older desktop apps only accept WebP or SVG display copies.
Copies are kept under display-v2, so existing ones are left alone and
remade the first time they're asked for.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Save automatic versions only when enough has changed (DRA-521)
Every automatic version is a whole compressed copy of the file, and the
room wrote one after any change at all. One large file had 13 of them,
about 90 MB, and two of those, 78 minutes apart, differed by 8 removed
records out of 84,855. Agents joining a file wrote one too, whenever the
latest was over two minutes old.
Now the room first measures how much changed since the latest version,
from the stored rows and the removals, which SQLite answers from its
indexes. It saves when that is at least 64 KB of record JSON, or when the
latest version is over an hour old and anything changed. Otherwise the
alarm is set again for ten minutes later, so a larger burst is still
saved soon and a small change is saved once it has waited long enough.
A file with no version yet still gets its first one as before. Manual,
named, publish and restore versions are unchanged.
The in-memory SQLite the room tests use now lives in a shared helper.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Send other windows only a large change, without making them join again (DRA-518)
When someone pasted, imported or restored more than 4 MB of changes, the
room ended every other window's session. Each one joined again and
downloaded a compressed copy of the whole file, and everyone's cursors
blinked.
Now the room writes what changed since the clock it last sent those
windows, straight from its stored rows and compressed, once for all of
them, and sends it over their open connections. Anything tldraw was still
holding for a window goes first. The window hands the change to tldraw as
an ordinary patch, and its socket keeps later messages behind it while it
unpacks. If the change doesn't start where the window is, the window joins
again instead.
A window coming back from offline is caught up the same way: when the room
still knows what was removed since the window's clock, it sends only what
changed rather than the whole file, and the window merges that into the
connect reply tldraw gives it.
Windows say they can read these messages when they connect, so an older
app is still sent snapshots and asked to join again. That also stays the
fallback when a change is too large for one message.
With a 10 MB paste into a 30 MB file, each other window now downloads
1.4 MB instead of 4.3 MB and stays connected. The room's peak heap is
unchanged at 20 MB with one or three other windows, set by taking in the
upload itself.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Send other windows only a large change, without making them join again (DRA-518)
When someone pasted, imported or restored more than 4 MB of changes, the
room ended every other window's session. Each one joined again and
downloaded a compressed copy of the whole file, and everyone's cursors
blinked.
Now the room writes what changed since the clock it last sent those
windows, straight from its stored rows and compressed, once for all of
them, and sends it over their open connections. Anything tldraw was still
holding for a window goes first. The window hands the change to tldraw as
an ordinary patch, and its socket keeps later messages behind it while it
unpacks. If the change doesn't start where the window is, the window joins
again instead.
A window coming back from offline is caught up the same way: when the room
still knows what was removed since the window's clock, it sends only what
changed rather than the whole file, and the window merges that into the
connect reply tldraw gives it.
Windows say they can read these messages when they connect, so an older
app is still sent snapshots and asked to join again. That also stays the
fallback when a change is too large for one message.
With a 10 MB paste into a 30 MB file, each other window now downloads
1.4 MB instead of 4.3 MB and stays connected. The room's peak heap is
unchanged at 20 MB with one or three other windows, set by taking in the
upload itself.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Run the Checks workflow on our Spark machines when they're online (DRA-517)
Checks now runs on self-hosted runners in Docker on spark-1 and spark-2, and on
GitHub's runners when neither is online. The runners share the machines with a
vLLM model that holds most of their memory, so each gets at most 4 GB and no
swap, is pinned to four cores with a low CPU weight, and is the first thing the
kernel kills if memory runs out.
tooling/github-runner/deploy.sh builds, registers and starts them from a Mac.
Seeing whether a runner is online needs a RUNNER_STATUS_TOKEN secret; until it's
set, every job stays on GitHub.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Retry the notarization ticket lookup when Apple drops the connection
A release build failed twice in a row because Apple's ticket lookup lost its
connection on the CI runner, after notarization itself had succeeded.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Retry the notarization ticket lookup when Apple drops the connection
A release build failed twice in a row because Apple's ticket lookup lost its
connection on the CI runner, after notarization itself had succeeded.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Say in AGENTS.md that pre-release frees us from the past, not from building for the future