Skip to content

Claude Desktop 1.24012.9 (patch release 9)

Choose a tag to compare

@github-actions github-actions released this 30 Jul 13:00
· 83 commits to master since this release

Claude Desktop 1.24012.9 (patch release 9)

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-9/claude-desktop-extra-1.24012.9-9-x86_64.pkg.tar.zst
# ARM64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.24012.9-9/claude-desktop-extra-1.24012.9-9-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-9_amd64.deb
# ARM64
sudo apt install ./claude-desktop-extra_1.24012.9-9_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-9.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-extra-1.24012.9-9.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) e3453d453785a359278adf46c5310b89cd2639f334828062ceb7e8cf16756290
Arch pacman (aarch64) 1912505c8fb95f33451885386848e798aeb0c03088de8c32482dedc3fa5c4dce
Tarball (x86_64) 3867ca3f220406f9991c8a60020b59c64e93e7e5014872ac8611902fbbd75ec5
Tarball (aarch64) 7bc1af36621f31790d18ab1b45e1c63d4c3d7f8efdd6143b84381c68b14c6f7f
AppImage (x86_64) 7beb6977b38bde9c54f29723400b14fee84a8af9e84a1356e74bdfe769f6c111
AppImage (aarch64) acddb5c13ed16559a1fe0cb26410ee8f414ec61e9773051d818a434c22db49b8
Debian (amd64) 0916eba83c5ca760da00acf8b0978466665c6da0c0f066da0f2bb19da8627172
Debian (arm64) bb8c9e156e4c4b173fa26fcc6f455031b87b0989d9a56f0ef5a98b9bfd26c0c4
RPM (x86_64) f14fdb83b1297d7125ff9f10959e522d0ac8290a23aeee1257bc9b3920575f68
RPM (aarch64) ba435ea2db89749ce1a75f08dab36fac57a1f09986a81e127d52a26914d04e03

Changes since last release

From CHANGELOG.md, 2026-07-30:

The project is now claude-desktop-extra

The packages are renamed from claude-desktop-bin to claude-desktop-extra. The name says what the project does: the official Claude Desktop Linux build covers Debian-based distros only, and this project fills the gaps - Arch, Fedora, RHEL, NixOS and AppImage packaging - plus the extra features on top (Computer Use backends, custom themes, multi-profile, Quick Entry, and the growing Extra settings hub).

Upgrades are automatic on every distro:

  • Arch: the new package carries replaces=claude-desktop-bin, so pacman -Syu swaps it in. The pacman repo section is now [claude-desktop-extra]; the old [claude-desktop-bin] section keeps working for the transition (the repo publishes both database names), and the package prints a one-line note if your pacman.conf still uses the old one. The install dir moves to /usr/lib/claude-desktop, the same path deb and rpm always used.
  • Debian/Ubuntu: a transitional claude-desktop-bin package depends on the new name, so apt upgrade migrates in place.
  • Fedora/RHEL: the rpm carries Obsoletes: claude-desktop-bin, so dnf upgrade migrates in place.
  • NixOS: the flake gains a claude-desktop-extra attribute; the existing claude-desktop and default attributes keep working.
  • Config: ~/.config/Claude/claude-desktop-extra.jsonc is the config file now. On first start the app copies an existing claude-desktop-bin.jsonc/.json over automatically - themes and flag overrides survive, and the old files stay in place as backups.

Version numbers keep their {upstream}-{pkgrel} format. The /deploy skill now documents the rule (new upstream version resets pkgrel to 1; any re-release at the same upstream bumps it) and decides force_rebuild itself from what actually changed since the last release.

The GitHub repository moved - and a compatibility mirror keeps old installs working

The repository is now github.com/patrickjaja/claude-desktop-extra; every documented URL follows it. The old claude-desktop-bin repository stays in place as a compatibility mirror for the transition: its Pages keep serving the APT and DNF repositories at the pre-rename URLs, its releases mirror the new repository's assets (so pre-rename pacman sections and AppImage self-updates keep resolving), and its flake re-exports the new one (so github:patrickjaja/claude-desktop-bin inputs keep evaluating). Upgrading migrates the APT/DNF repo configuration to the new URLs automatically; pacman users get the new stanza printed once. The mirror is fed by CI on every release and will be retired after the transition window.

claude-desktop-extra is on the AUR

CI publishes the release PKGBUILD to the claude-desktop-extra AUR package on every release, so yay -S claude-desktop-extra works alongside the signed pacman repo (which remains the recommended path).

The Code and Cowork transcript follows a running response again

Watching Claude work meant grabbing the mouse. Partway through a response the transcript would stop following the output and simply stay where it was, and nothing brought it back except scrolling down by hand. In the floating side chat it was worse - that viewport is a few hundred pixels tall, so once it fell behind, the part you wanted to read was always off-screen.

The cause is how narrow claude.ai's own test is. Its transcript scroller decides whether to keep itself at the bottom by watching a 1px sentinel element with an IntersectionObserver, and it sets overflow-anchor: none, so the browser's own scroll anchoring does not step in either. Being at the bottom therefore means being at it exactly. Measured in a live session: park the transcript at the bottom, move scrollTop up by 3 pixels, and it never follows again - content grew from 1280 to 3080 pixels while the scroll position stayed frozen at 641, stranding the view 1803 pixels behind the output. A 3px drift is not an edge case during streaming; sub-pixel layout, scrollbar-gutter: stable both-edges, a font finishing loading and [contain:strict] reflow all produce one.

fix_epitaxy_autoscroll.nim attaches our own stick-to-bottom to the transcript scrollers in both surfaces. It treats a band of a few lines as "at the bottom" rather than a single pixel, re-asserts the position on every content resize and mutation, and gives up following the moment you scroll up on purpose - wheel, touch and PageUp/Home/ unpin synchronously, so a message arriving in the same frame as your gesture cannot yank you back down. Scroll back to the bottom and it resumes on its own.

This markup belongs to the remote claude.ai SPA rather than to the bundle we patch, so a claude.ai deploy can rename the anchors it keys on. It fails soft when that happens: the sweep finds nothing and the view behaves exactly as it does today.

Contributed by @Felitendo (#209) - thanks!

84 community color palettes now ship with the package

Alongside the seven curated built-in themes, the theme patch now bundles 84 palettes converted from the Noctalia community-palettes collection - Rose Pine, Gruvbox, Everforest, Kanagawa, Solarized, Tokyo Night, the Catppuccin accent variants and many more. Each one is a full dual light/dark token set, so "activeTheme": "rose-pine-moon" is all a config needs and Claude's own light/dark toggle keeps working. Theme resolution order is your own themes entries first, then the built-ins, then the community palettes, so a theme you author under the same slug replaces the bundled one instead of colliding with it.

The conversion is done by scripts/generate-community-themes.mjs, which maps each palette's Material-ish roles onto our CSS tokens, fixes border polarity (community palettes follow surface polarity; claude.ai needs the opposite), substitutes button-label colors that would be unreadable on their own accent, and renders one swatch card per palette. It is deterministic and takes the collection path as its argument, so refreshing after the upstream collection changes is a single command. The role-to-token mapping is documented in the script's header.

themes/PALETTES.md is the visual catalog: all 97 bundled palettes with their swatch cards and slugs, an index, and notes on the ones with deliberately unusual variants (the AMOLED palettes' pure-black backgrounds, the muted mid-tone light variants of Everforest and the Kanagawa pair).

Six gaming themes and a Gaming category

Six palettes drawn from games ship alongside the curated built-ins: PlayStation (PS1 console gray over charcoal blue-black, PlayStation-blue accent, status colors borrowed from the controller's button symbols), Game Boy (DMG shell gray with magenta buttons in light, pea-green LCD in dark), Final Fantasy (parchment cream over the classic menu blue with a crystal-gold accent), Zelda (forest green and gold), Warcraft (parchment gold and Alliance blue, with orc-green success) and Dragon Ball (sky and white over deep blue, bright orange accent). They resolve at built-in rank, so "activeTheme": "gameboy" is all a config needs, and they are authored in js/gaming_themes.json.

They are grouped by a new category field rather than by which registry they come from, so they get their own divider-separated Gaming section in both the Ctrl+Shift+T picker and Settings -> Extra -> Themes. Mario carries the same category, so it moves into that section too - seven cards in all. A theme of your own can join it with "category": "gaming".

Every bundled palette now has its own loading spinner

The spinner reshape used to be a built-in-only luxury. All 84 community palettes now carry one too, drawn from the palette's name or its colors: a stag for Everdeer, aurora ribbons for Nord Aurora, a great-wave curl across the Kanagawa family, one curled sleeping cat across every Catppuccin variant, an ensō brush circle for Zenbones, a crescent moon for Tokyo Night Moon. There are 53 distinct designs across the 84 slugs, because families share a shape on purpose.

The glyphs are curated in scripts/community-spinners.json and merged into the palettes by scripts/generate-community-themes.mjs, so regenerating after the upstream collection changes is still one command. The generator hard-fails rather than shipping a broken glyph: slug parity is checked in both directions, path data must tokenize as SVG, and any explicitly colored fill must clear 2.5:1 against both variants' backgrounds. The same spec contract is asserted while the patch compiles, for every bundled theme.

Theme switches now re-theme the loading glyph too

Switching theme changed the colors live but left the loading glyph on the old shape until the app was restarted, because reshaping it rewrote the star's SVG paths in place and the original geometry the matcher keys on was gone after the first pass.

The engine now takes custody of the original glyph: the first time it reshapes an element it stashes that element's untouched markup, keeps the first capture as a document-wide fallback for glyphs the page later clones, and tracks every element it owns. A theme switch re-renders all of them with the new spec and sweeps for any that appeared since; reverting to Claude default puts Claude's own star back. Its MutationObserver installs the spec in effect now rather than the one baked in at injection time, so glyphs rendered after a switch get the new shape as well.

Nothing about a theme switch needs a restart any more - colors, fonts, customCss and the spinner all follow the click, in every open window. Hand-editing claude-desktop-bin.jsonc still does, since that file is read at startup.

A "flip" spinner animation for two-frame sprites

Spinner specs accept a fourth animation, flip, next to pulse, spin and bounce. It renders two frames at once (paths and paths2) and hard-cuts between them at about two frames per second with no interpolation, the way a retro sprite animates: the Zelda hero takes a step, the Warcraft peon swings his pick. Six community glyphs use it as well, among them a blinking terminal cursor and a checker-diamond flicker.

paths2 is required exactly when the animation is flip and ignored otherwise, and that pairing is asserted at build time, so a half-authored sprite fails the build instead of shipping as a glyph that flickers against nothing.

Theme picker on Ctrl+Shift+T

Press Ctrl+Shift+T in any Claude Desktop window and a searchable gallery opens with every theme available to you - your own, the gaming palettes, the built-ins, and the community palettes, each in its own section - every card showing a dark and a light row of swatches. Click one and it applies immediately in every open window; no restart, no editing a file by hand. A "Claude default" entry at the top reverts to Claude's stock palette.

The choice is persisted to claude-desktop-bin.jsonc by a surgical text edit that replaces only the activeTheme value, so comments and every other key survive; if the file does not exist yet it is created from a short commented template. Colors, the chatFont override, customCss and the loading spinner all switch live.

The picker is a local window driven by a key handler in the main process, so it does not depend on anything in claude.ai's bundle.

An "Extra" page in Claude's own Settings dialog

Claude's Settings dialog now carries an Extra group with two panels:

  • Themes - the same registry as the picker, rendered as rows with color dots. Clicking one applies it live and saves it exactly as the picker does.
  • Features - the 134 catalogued GrowthBook feature flags as switches, so browsing and flipping a flag no longer means hand-editing a config file. Flags upstream already enables start switched on, and turning one off writes an explicit false. Flags that carry a value rather than a switch are read-only, and the one flag documented as breaking Cowork is not toggleable.

Flag changes are written to growthbookOverrides in claude-desktop-bin.json; the panel states in red that they need a restart (the features they gate are wired up at startup) and offers a Restart now button. Anything set by hand in claude-desktop-bin.jsonc is shown as owned by that file and left alone - the hand-edited value still wins per flag ID.

The group looks native because it is not drawn from scratch: its header and its two rows are clones of Claude's own, so font, size, indentation, the icon box and the selected pill all come from Claude's stylesheet, and the selected look is handed back to the row it was borrowed from when you navigate away. Only the word "Extra" and the two glyphs are ours.

Because the Settings dialog is claude.ai markup this package does not control, the injector anchors on semantics only and fails soft: if it cannot find the dialog it logs one line and changes nothing. The shape it is fitted to is recorded verbatim in baseline/SETTINGS_NAV_CAPTURE.md, and a sanitized DOM-shape line in claude-patches.log names the anchor to refit when claude.ai changes. Ctrl+Shift+T is entirely local and always available.

Fix: uncommenting a single flag line no longer invalidates the whole config

claude-desktop-bin.jsonc is auto-created as a template with every known flag commented out, one per line, each already ending in a comma - so uncommenting exactly one entry left a trailing comma before the closing brace, which is not valid JSON. The parser rejected the file silently, and with it every other setting in it, activeTheme included: the documented "uncomment an entry to activate it" workflow appeared to do nothing. All readers of the file now tolerate trailing commas.

Fix: chat header, "Quick answer" band and disclaimer strip now follow the theme

With a custom theme active, three chat regions kept Claude's stock background: the sticky conversation header, the "Quick answer" band above the composer, and the disclaimer strip below it. claude.ai's desktop-frame stylesheet redefines the background token on the container that wraps the whole chat view, and a CSS variable set directly on an element always beats one inherited from an ancestor - so those regions never saw the theme's value. The theme engine now re-asserts its background ramp at that container too (via collision-proof mirror variables), which also fixes the two regions that paint the token through gradients. A regression suite renders the affected elements against the real claude.ai CSS and asserts the computed colors in both modes.

Links