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 4
Fix three Electron specs that failed in the Linux test container (DRA-544)
The Layers panel now opens with its rows closed, so the suggested-prompt
spec opens them before looking for a layer's row.
The packaged-port spec builds an app with electron-builder, which reads
the update feed address from DRAFTLY_BACKEND_URL and failed without it.
The spec now gives the feed a dummy address, since nothing here updates.
The Artboard tool spec pressed A the moment the new artboard appeared,
while the size menu was still closing. In that moment the key goes to
the menu's item, and the app ignores it there. Under load this lost the
key about one run in four, so the spec now waits for the menu to close.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let live-link viewers in one place share the room's answer for a second
Every two-second poll from every viewer of a live link checked the link in
the database twice and then asked the file's room. A link with a crowd on it
would have kept the room busy for the people editing, and put the same load
on the one shared database.
Viewers in the same Cloudflare data centre now share what the room last said
for a second, through the Worker's cache. The first viewer in that second
checks the link and reads the room; the rest are answered from the copy. The
copy carries the room's tag, so viewers who are up to date still get a 304,
and when only the tag of an unchanged file was asked about, the tag alone is
kept so that case is shared too. A copy is found only by the link's own token
and is made only after the link has been checked, so turning a link off
reaches viewers within that second.
Published files are left as they are. Each is fetched once per visit rather
than polled, the bytes come from R2, and a copy that lasted long enough to
help would keep serving a page after it was unpublished.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Change the zoom percentage without laying out anything around it (DRA-545)
During a zoom the percentage was drawn again by React on every change,
and since its text sat directly in a flex item, each change laid the
window out again from its root. Its text is now changed in place, inside
a box as wide as the widest percentage that contains its own layout and
paint, so React draws nothing and nothing is restyled. On the benchmark
file a change now lays out 2 objects in about 0.05 ms instead of 15 in
0.27 ms, and frames where it changes spend about 0.25 ms less in script.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Change the zoom percentage without laying out anything around it (DRA-545)
During a zoom the percentage was drawn again by React on every change,
and since its text sat directly in a flex item, each change laid the
window out again from its root. Its text is now changed in place, inside
a box as wide as the widest percentage that contains its own layout and
paint, so React draws nothing and nothing is restyled. On the benchmark
file a change now lays out 2 objects in about 0.05 ms instead of 15 in
0.27 ms, and frames where it changes spend about 0.25 ms less in script.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let a Mac runner finish its build before it restarts (DRA-538)
Reinstalling checked GitHub for whether a runner was busy and then stopped it,
but a job could land on the runner in between, and stopping it failed that
build. The installer now checks this Mac directly and waits while a job is
running, and a runner asked to stop lets its job finish before it exits.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Run up to eight macOS builds at once on the Mac (DRA-538)
With one runner, builds queued behind each other during bursts of pushes, some
for a quarter of an hour. The Mac now keeps eight runners, and reinstalling
restarts each one only once it's idle, so it never cancels a build.
The runners share one user, so each job now installs pnpm into its own temp
folder instead of ~/setup-pnpm, and each runner keeps its own Electron
downloads. The signing keychain no longer goes into the user's search list,
which concurrent jobs would be rewriting at the same time; electron-builder is
handed the keychain directly and signing works without it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let generate_image make several images at once, and say what failures cost (DRA-546)
Agents asking for many images made one call each, and clients that run
tool calls one at a time made them wait in turn. generate_image now takes
items, each the same as a single call, and starts them all together, up
to what the account may make at once. Every item is checked before any
starts, so one bad item refuses the call with each bad item named and
nothing paid for. The reply gives each item's image, or its job id while
it is still going, or why it failed.
A generation that is declined or fails now says whether it used one of
today's generations and how many are left, and get_generations marks the
same on failed jobs. A prompt over the limit says how long it was and by
how much, and the limit is in the tool's description, where the schema
leaves it out.
start_agent lists the generations that ended after the last call of an
earlier agent with the same name, as facts. They are kept in memory, as
get_generations already keeps them, so a restart of Draftly clears them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds OpenAI's gpt-image-2.5-sunburst beside GPT Image, which stays the
first choice when a picture is given to work from. Precise has the same
settings (quality, transparent) and takes pictures as references, and it
is reached through OpenAI directly like GPT Image, so its drafts stream.
The agent notes for GPT Image said it draws up to 2560 pixels a side,
but its long side is held to 2048, so that is corrected.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds OpenAI's gpt-image-2.5-sunburst beside GPT Image, which stays the
first choice when a picture is given to work from. Precise has the same
settings (quality, transparent) and takes pictures as references, and it
is reached through OpenAI directly like GPT Image, so its drafts stream.
The agent notes for GPT Image said it draws up to 2560 pixels a side,
but its long side is held to 2048, so that is corrected.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Let create_image take styles in the same undo step (DRA-547)
Every placed image was followed by a patch_styles call for its position,
object-fit and max-width. create_image now takes the same styles patch,
checked the same way, and writes it with the new layer as one undo step.
A style that is refused places no layer. The reply names any declaration
the new image already had, such as max-width.
The agent tool list grows by about 140 characters, so its size limit in
the tool list test moves from 56,400 to 56,600.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Show pictures only until each artboard is drawn (DRA-541)
Artboards no longer stay pictures while they're shown too small to read.
They draw live in turn as they did before pictures, and a picture stands
in for each one only until its live design is on screen. That removes
the pointer resting on an artboard or a row in Layers asking for its
live design, the sharpness rule, and the tuning that went with them.
Pressing an artboard still draws it ahead of the rest.
The tests now hold kept pictures back to show that a pressed artboard
draws first, and check that each artboard shows its picture until it's
drawn, never a stale one, and that an edit takes a picture down before
the next frame. The large-file measurement counts any picture towards
the canvas looking complete.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Show pictures only until each artboard is drawn (DRA-541)
Artboards no longer stay pictures while they're shown too small to read.
They draw live in turn as they did before pictures, and a picture stands
in for each one only until its live design is on screen. That removes
the pointer resting on an artboard or a row in Layers asking for its
live design, the sharpness rule, and the tuning that went with them.
Pressing an artboard still draws it ahead of the rest.
The tests now hold kept pictures back to show that a pressed artboard
draws first, and check that each artboard shows its picture until it's
drawn, never a stale one, and that an edit takes a picture down before
the next frame. The large-file measurement counts any picture towards
the canvas looking complete.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Name the agent window's limit for the files it holds, now that agents share them (DRA-537)
An artboard's page that runs past its bottom edge was left for the
browser to scroll, although the canvas does that scrolling itself. So the
browser drew each frame well past the artboard's edges and, while a zoom
was under way, drew and re-layered every page from top to bottom. On the
benchmark file, whose pages run about ten times past their artboards,
starting and ending a zoom stalled for up to 135 ms, each re-layering
took 9 to 12 ms, and a zoom out dropped to under 20 frames a second
while the GPU drew those pages again.
The frames are now not scrollable by the browser, and each is drawn as a
layer of its own, so marks redrawn over the canvas as it pans don't make
the artboards beneath them draw again. Scrolling a page inside an
artboard works as before.
On the benchmark file at 60 Hz, a zoom out now keeps its 95th-percentile
frame at 17.6 ms instead of 66 ms, the end of a zoom no longer stalls, and
a zoom in's 95th-percentile frame takes 5 to 6 ms of the window's thread
instead of 9 to 12 ms.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Draw each artboard as a layer the browser doesn't scroll (DRA-534)
An artboard's page that runs past its bottom edge was left for the
browser to scroll, although the canvas does that scrolling itself. So the
browser drew each frame well past the artboard's edges and, while a zoom
was under way, drew and re-layered every page from top to bottom. On the
benchmark file, whose pages run about ten times past their artboards,
starting and ending a zoom stalled for up to 135 ms, each re-layering
took 9 to 12 ms, and a zoom out dropped to under 20 frames a second
while the GPU drew those pages again.
The frames are now not scrollable by the browser, and each is drawn as a
layer of its own, so marks redrawn over the canvas as it pans don't make
the artboards beneath them draw again. Scrolling a page inside an
artboard works as before.
On the benchmark file at 60 Hz, a zoom out now keeps its 95th-percentile
frame at 17.6 ms instead of 66 ms, the end of a zoom no longer stalls, and
a zoom in's 95th-percentile frame takes 5 to 6 ms of the window's thread
instead of 9 to 12 ms.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Ask for image thumbnails by only what a layer holds of each image (DRA-543)
When image layers were trimmed to their hash, type and size in pixels
(DRA-520), the check on what main is asked to show became just as strict.
The Images view, the reference list in the generate form and the canvas
still handed it the full image details, with name, size and source, so the
check refused them: the Images view threw as soon as it had an image to show
a thumbnail for, which is where generating an image stopped. The canvas's
images and an agent looking at an image were refused the same way.
The thumbnail hook now takes images and sends only what a layer holds of
each, and the canvas and agent views do the same. The display copy changes
(DRA-519) weren't involved.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Ask for image thumbnails by only what a layer holds of each image (DRA-543)
When image layers were trimmed to their hash, type and size in pixels
(DRA-520), the check on what main is asked to show became just as strict.
The Images view, the reference list in the generate form and the canvas
still handed it the full image details, with name, size and source, so the
check refused them: the Images view threw as soon as it had an image to show
a thumbnail for, which is where generating an image stopped. The canvas's
images and an agent looking at an image were refused the same way.
The thumbnail hook now takes images and sends only what a layer holds of
each, and the canvas and agent views do the same. The display copy changes
(DRA-519) weren't involved.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Measure reopening the large file as well as opening it (DRA-540)
The large-file measurement now closes the file once it has opened, waits
for this computer to keep its copy, and opens it again, timing the same
steps as the first open.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No public downloads available for this build.
Build the macOS app on this Mac when it's awake (DRA-538)
A runner on the Mac now takes the macOS job in Desktop builds, and GitHub's
macOS runner takes it when the Mac isn't online. launchd keeps it listening in
the background at low priority. Each runner handles a single job and then a
fresh one registers through the GitHub CLI login, which avoids the dropped jobs
that persistent runners suffer from and keeps any admin token off disk.
Picking our runner or GitHub's moves into a shared workflow, which Checks now
uses too.
The macOS job sets up its own signing keychain instead of leaving it to
electron-builder. electron-builder unlocks its keychain with the certificate's
password rather than the keychain's, which macOS 26 and later refuse. The new
keychain is deleted when the job ends, so the signing key doesn't stay behind on
the Mac.
The Spark runners are stopped until GitHub ships a runner release that stops
dropping jobs (actions/runner#4728).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>