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.
260 matching builds · Page 6
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
An instance can keep an override for a component layer that has since
been deleted. Checking that override asked the store for the missing
layer, which ties the artboard to every record added or removed in the
file, so it was worked out again for edits anywhere. The layer tree is
now asked first, and it follows just that one layer until it comes back.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Publish desktop releases to the update feed (DRA-508)
The packaged app now knows where to look for updates, and the macOS
build produces the signed zip that updates install from alongside the
dmg. Each run numbers its build after the run, so there is always a
higher version to update to.
Running the Desktop builds workflow from main with Publish ticked
uploads the signed zip, the Linux package and their manifests to the
release bucket with Wrangler and the existing Cloudflare token,
manifests last so the feed never names a file that isn't there. Without
that, builds are made and signed as before and nothing is published.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Publish desktop releases to the update feed (DRA-508)
The packaged app now knows where to look for updates, and the macOS
build produces the signed zip that updates install from alongside the
dmg. Each run numbers its build after the run, so there is always a
higher version to update to.
Running the Desktop builds workflow from main with Publish ticked
uploads the signed zip, the Linux package and their manifests to the
release bucket with Wrangler and the existing Cloudflare token,
manifests last so the feed never names a file that isn't there. Without
that, builds are made and signed as before and nothing is published.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Invite people to try Whisk rather than follow it (DRA-509)
The homepage buttons now talk about what the visitor gets to do: "Try
Whisk" in the header and closing, and "Start prototyping with your
agents" in the hero. The closing heading becomes "Start your next
prototype in Whisk". Also restores a missing word in the HTML section:
"That means agents already know how to use it".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Use the writing mode to decide whether logical and physical styles clash (DRA-500)
`padding-top` with `padding-inline` was refused because the two meet in some writing mode, though
they never meet in the horizontal one most designs are in. Which edge a logical style means is now
worked out from the writing mode and direction written on the element and the elements around it
(their inline styles and dir attribute, and for write_html the layers above where the HTML goes),
horizontal and left to right when nothing says otherwise. Two styles are refused for their order
only if they meet in that flow, and a pair that can never meet, such as `padding-bottom` and
`padding-block-start`, is never refused. A writing mode that can't be read, such as one from a
variable, counts as every mode.
Styles are stored without an order and drawn in a fixed one, so they can't keep the order they were
written in when the writing mode changes later. A logical style is now drawn before a physical one
of the same breadth, so the edge named outright keeps its value in any writing mode the element is
put in afterwards, and the logical style sets the rest. This reorders a few existing pairs that
were drawn the other way round: `bottom` against `inset-block-end`, and the bottom corners against
their logical names.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Say why a joining window can take the room's copy of a file unchecked
An artboard that hugs its content only had its stored height updated when a window drew it, or
when an agent took a screenshot or measured it. So an agent building on a page nobody had open
left the height stale for the web viewer, listings and exports.
After the reply to an agent's call is on its way, the agent window now works out which hugging
artboards the call changed, including through undo and redo, draws each once and writes the
height back. Calls that come close together share the work, and artboards the call didn't touch
are not drawn.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Trim AGENTS.md down to the product rules that still guide work
A font's category was stored in the file when the font was added, so
fonts added before serif detection improved, like Kleisch LL Preview, kept
reading as sans-serif. The font catalog now looks at the kept font file
when it describes an uploaded font, using the same judging as when a font
is added, and only falls back to the stored category when no copy of the
file is kept on this computer. Nothing is rewritten in the file, so there
is no stale value to clean up later. add_font also writes the fallback
for the category it just read, not the one stored for the family.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>