Skip to content

Claude Desktop 1.24012.9 (patch release 13)

Choose a tag to compare

@github-actions github-actions released this 02 Aug 09:22
· 59 commits to master since this release

Claude Desktop 1.24012.9 (patch release 13)

This release provides Claude Desktop version 1.24012.9 pre-patched for Linux.

Installation Options

Arch Linux (pacman Repository - recommended)

curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install-pacman.sh | sudo bash
sudo pacman -Syu claude-desktop-extra

Arch Linux (manual package)

# x86_64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.24012.9-13/claude-desktop-extra-1.24012.9-13-x86_64.pkg.tar.zst
# ARM64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.24012.9-13/claude-desktop-extra-1.24012.9-13-aarch64.pkg.tar.zst

Debian/Ubuntu (APT Repository — recommended)

curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install.sh | sudo bash
sudo apt install claude-desktop-extra

Debian/Ubuntu (manual .deb)

# x86_64
sudo apt install ./claude-desktop-extra_1.24012.9-13_amd64.deb
# ARM64
sudo apt install ./claude-desktop-extra_1.24012.9-13_arm64.deb

Fedora/RHEL (RPM Repository — recommended)

curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-extra

Fedora/RHEL (manual .rpm)

# x86_64
sudo dnf install ./claude-desktop-extra-1.24012.9-13.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-extra-1.24012.9-13.aarch64.rpm

NixOS / Nix

nix run github:patrickjaja/claude-desktop-extra

AppImage (Any Distro)

# x86_64
chmod +x Claude_Desktop-1.24012.9-x86_64.AppImage
./Claude_Desktop-1.24012.9-x86_64.AppImage
# ARM64
chmod +x Claude_Desktop-1.24012.9-aarch64.AppImage
./Claude_Desktop-1.24012.9-aarch64.AppImage

Update existing AppImage (delta download — only changed blocks):

appimageupdatetool Claude_Desktop-*-x86_64.AppImage
# Or from within the AppImage:
./Claude_Desktop-*-x86_64.AppImage --appimage-update

Checksums

File SHA256
Arch pacman (x86_64) a52719298ec7eeca6fe750f3b477a281af0975765a49ab734501e5a534951568
Arch pacman (aarch64) 84a8dda9eff57683c68585820d82ab267f0cf7dde776a4c2892c28e7aeff4b24
Tarball (x86_64) b81ceb83ace6e8684d9b76f8a1bc3f2f12de7fa9d78c9e05e36f8d41b0cc68bf
Tarball (aarch64) 2edc2fc5aed11478493a139cd372e5d581c52f95ea2a53fbba1cdb443396bf13
AppImage (x86_64) f9e7aef9a6760ead9b755baa985f78b9015600bea01e5b54045c0ea95cef0965
AppImage (aarch64) e48aba5e92cddde2ab5410f65f9e2cb157b03c3ec0920f9f22fdfe81f92f4816
Debian (amd64) 439238179a3d085bba80697597630b8d98739c09e8912d1a22266c3aeb9ff3fb
Debian (arm64) babb7efbb71081f8bd25c80001da4073bc82d9dab853296ad6b6133f9e25dac8
RPM (x86_64) 30f33a7b0f428866f1768cc6d1e75b4f6b38f058be4fe064e1f5a5162bb078ac
RPM (aarch64) 891aeda8972a35561e4b1c1513dea2c17dad3375a5be6652f4bac3ba149949fe

Changes since last release

From CHANGELOG.md, 2026-08-01:

The Code tab's diff panel gets view modes - and stops comparing against the wrong branch

The diff panel had one view: everything between the remote default branch and your working tree. Committed work and uncommitted edits arrived in one undifferentiated list, so "what have I actually committed on this branch" and "what did Claude just change" were questions the panel could not answer.

A dropdown in the panel's own header row now switches between three scopes:

  • Working tree - what the panel always showed.
  • Branch changes - committed work only, from the fork point to HEAD.
  • Latest turn - what changed during the most recent conversation turn, untracked files included.

Nothing is re-rendered. Rather than draw a second diff view, this rewrites the arguments of the app's own git IPC and lets the stock renderer draw every mode - so syntax highlighting, virtualized scrolling, theming and line comments work in Branch changes exactly as they do in Working tree. Refs are handed over as full SHAs, because the app resolves a name by trying origin/<ref> first and would otherwise turn HEAD into origin/HEAD and diff a commit against itself.

The diff panel now finds the branch you actually branched from

Upstream takes the base branch from the remote default (origin/HEAD) and nothing else. In a repository whose default is develop, a branch cut from master is measured from whatever old commit develop and master last shared, so the panel lists files nobody on the branch has touched - and the breadcrumb names a branch the diff was never computed against.

Base detection now scores candidates - origin/HEAD, main, master, develop, trunk and the branch's own upstream - by how few commits separate each candidate's merge-base from HEAD, and takes the closest fork point. Nothing hardcodes a branch-naming scheme, and a repository whose default really is the closest fork point is left exactly as upstream had it. The breadcrumb is corrected with the comparison, so the label always names the branch the diff was computed against.

To pin a base by hand:

git config branch.<branch-name>.cdbBaseBranch master

Everything degrades to the stock panel rather than breaking, and each refusal is logged once with its reason. Git runs on fixed argument vectors in the directory observed on the session's own CLI spawn, never one supplied by the page, and every ref and path is checked before it reaches a command. A diff or file over 2 MiB is refused rather than served truncated: collection is killed mid-stream, so a partial patch presented as a complete one would be a wrong answer that looks like a right one.

Latest turn keeps its snapshot per repository, and says so when it has none

Latest turn compares two git write-tree snapshots taken from a temporary index at each turn boundary - no commits, no stashes, no refs, and untracked files included. Snapshots are kept per repository, because the app spawns its CLI for other directories (plain $HOME among them) every few seconds.

When a repository has no turn recorded yet, the Latest turn entry is disabled and explains itself on hover - the menu does not offer a scope that would show you something else. Sending one message arms it.

The diff view modes are opt-in, behind their own switch

Everything above is off by default. A Source control switch at the top of Settings -> Extra -> Features turns it on, and leaving it alone is the supported way to use this build: the feature reshapes a first-party surface - it rewrites the arguments of Anthropic's own git IPC and corrects the base branch the stock panel compares against - and that is worth asking for rather than assuming. A fresh install therefore behaves exactly like the official one.

Off is a genuine retreat, not a hidden control: no dropdown, a byte-for-byte pass-through, no base-branch correction (the breadcrumb names upstream's own base again), no turn snapshots, and every remembered mode reset to Working tree. Both directions apply live, with no restart.

The modes arm per repository, once a CLI session has been observed in it, so turning the switch on mid-session leaves the dropdown reading Working tree until the next message lands. That wait is deliberate: the file list and the content of each file in it are gated on the same fact, so the panel can never show one from the branch and the other from the working tree.

The setting is diffViewModes in claude-desktop-extra.json; "off" is the absence of the key, so only an explicit opt-in ever writes anything. Set it by hand in the .jsonc and the switch shows itself as locked rather than silently disagreeing with the file.

Expand or collapse every file in the Code tab's diff panel

The diff panel opens one file at a time. A new button in the panel's own header row, between the scope dropdown and the ⤢/✕ controls, does the whole list at once.

Expanding is not a single sweep, and cannot be: the app fetches each file's patch lazily as it scrolls into view, and a file whose patch has not arrived has a disabled header that cannot be expanded at all. So one press expands everything already loaded and stays armed - files keep expanding as you scroll and their patches land. Press again to collapse everything and turn that off. Collapsing runs bottom-up on purpose: the app scrolls each file into view as it closes, so top-down would leave you staring at the bottom of the diff.

It never fights you. A file you collapse by hand stays collapsed, even while the button is armed. Changing the diff scope disarms it, so a large branch diff is never dumped open unasked, and closing the last open file by hand disarms it too - the button then reads Expand again rather than promising a Collapse it no longer offers. Closing the panel, or expanding it to fullscreen, tears the old instance down instead of leaving it running invisibly.

The button is a clone of its neighbouring control, so it inherits the panel's hover, focus ring and theme rather than approximating them, and its caret glyph comes from Anthropic's own icon font - but only after two checks agree it will actually draw: the font is loaded, and a canvas ink probe finds ink at both codepoints it can paint (the expand caret and the collapse caret). That font renders nothing at all for an unmapped codepoint, so a codepoint that shifts in a future release would silently produce an invisible button - and when the font is missing altogether, the browser substitutes one whose tofu box the ink check alone would read as success. Either check failing leaves the hand-drawn SVG in place.

Part of the existing Diff view modes switch (Settings → Extra → Features), still off by default. A new headless-Chromium suite, scripts/test-diff-views-expand-dom.mjs, covers placement, the ARIA contract, both press directions, sticky expansion, auto-disarm, and every teardown path (panel unmount, fullscreen, feature switch); a missing icon font is reported as an explicit SKIP rather than quietly shrinking the run. Also fixed a build trap found on the way: patches/Makefile had no staticRead dependency line for add_feature_diff_views, so editing its JS did not rebuild the patch binary - and scripts/validate-patches.sh piped this suite through sed, so it reported PASS on the pipeline's exit status no matter how many assertions failed.

Merged with one hardening on top: the dropdown's status query now refuses to run git in a directory nothing in the main process has vouched for - only the panel's own fetches and the session's CLI spawns make a directory queryable, so the remote page cannot use the status call to probe arbitrary paths.

Contributed by @dels07 (#211) - thanks!

Links