Skip to content

Claude Desktop 1.24012.9 (patch release 8)

Choose a tag to compare

@github-actions github-actions released this 30 Jul 11:26
· 86 commits to master since this release

Claude Desktop 1.24012.9 (patch release 8)

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-bin/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-bin/releases/download/v1.24012.9-8/claude-desktop-extra-1.24012.9-8-x86_64.pkg.tar.zst
# ARM64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-bin/releases/download/v1.24012.9-8/claude-desktop-extra-1.24012.9-8-aarch64.pkg.tar.zst

Debian/Ubuntu (APT Repository — recommended)

curl -fsSL https://patrickjaja.github.io/claude-desktop-bin/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-8_amd64.deb
# ARM64
sudo apt install ./claude-desktop-extra_1.24012.9-8_arm64.deb

Fedora/RHEL (RPM Repository — recommended)

curl -fsSL https://patrickjaja.github.io/claude-desktop-bin/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-8.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-extra-1.24012.9-8.aarch64.rpm

NixOS / Nix

nix run github:patrickjaja/claude-desktop-bin

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) c394d44d600d754cfa393de43bc682fcda47c864c588627ffd9938a749b00f32
Arch pacman (aarch64) 51dc249523a8c885f6bdb102a5bda09c2f72b2f1e37badd4fbf4fdf747531834
Tarball (x86_64) c75ce95450e814d879ff66db7f5fb35ccfc22094a67ba220aee1c125bc4295e6
Tarball (aarch64) 7bcc867a412c9501a0f28a5d0ff437f15025eeb8545e773deacbb48594cf85e2
AppImage (x86_64) c36aa190d4a824d3260bdc4aed452cc4fe45b2da9568bfd6d9b8f11e92a2bb9f
AppImage (aarch64) 36dbf61f9ac368f29f0f2a627deb6aca2ffc1163555d856ace8ed302ac6050ed
Debian (amd64) b3e58a1d9d59cb7a293280ad47c530acc779d803f1ff06f0cf60f27f074b8906
Debian (arm64) 137b3c704f070c7f01f4663d329b3e4d986d23a1c6c0be2f2df221912cf7a471
RPM (x86_64) 57d4b75a345cc94eededb3f3520f0a50d9913a4420f7384d8a805bd616a44304
RPM (aarch64) 684ffe6e6322aea94569ed15c1f315b0ce801674bb73a40c77ab5db6b5807966

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 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