Releases: patrickjaja/claude-desktop-extra
Release list
Claude Desktop 1.26832.0 (patch release 3)
Claude Desktop 1.26832.0 (patch release 3)
This release provides Claude Desktop version 1.26832.0 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-extraArch Linux (manual package)
# x86_64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.26832.0-3/claude-desktop-extra-1.26832.0-3-x86_64.pkg.tar.zst
# ARM64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.26832.0-3/claude-desktop-extra-1.26832.0-3-aarch64.pkg.tar.zstDebian/Ubuntu (APT Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install.sh | sudo bash
sudo apt install claude-desktop-extraDebian/Ubuntu (manual .deb)
# x86_64
sudo apt install ./claude-desktop-extra_1.26832.0-3_amd64.deb
# ARM64
sudo apt install ./claude-desktop-extra_1.26832.0-3_arm64.debFedora/RHEL (RPM Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-extraFedora/RHEL (manual .rpm)
# x86_64
sudo dnf install ./claude-desktop-extra-1.26832.0-3.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-extra-1.26832.0-3.aarch64.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-extraAppImage (Any Distro)
# x86_64
chmod +x Claude_Desktop-1.26832.0-x86_64.AppImage
./Claude_Desktop-1.26832.0-x86_64.AppImage
# ARM64
chmod +x Claude_Desktop-1.26832.0-aarch64.AppImage
./Claude_Desktop-1.26832.0-aarch64.AppImageUpdate 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) | d1b5e1d9d925f4526858cfea3280e0bd9b61784bfa2cc6fa56c1f7023a2ea9d0 |
| Arch pacman (aarch64) | f9d8d85b7893c2344727b71c66a654431c4518350a6c38f1277f943fbe76b939 |
| Tarball (x86_64) | 639158916ad2dcb88e77a31be4a225b1a33bf3e01067b3683d2f5d1352d3e82b |
| Tarball (aarch64) | 82d415880f88a445be90d1c5ab6be210a8257ec83aa475aafa1394a2a4bb9526 |
| AppImage (x86_64) | 6aede026a97500877ef868404a7ca2f74cfad5bab8d74da409cf5b8f1d7247f2 |
| AppImage (aarch64) | 554db16a8590eae834355fda8e06f5ab5f9048d42663817ae406c1e9a60c2868 |
| Debian (amd64) | aba3d630801cd8f0a40f37957555e3ae70a85baca37830902c3a68d6fceeebe7 |
| Debian (arm64) | 69082b55aa5f7e9d9c078ed56716ae1ae5951599772726c471dd446ba3e8e44e |
| RPM (x86_64) | f96663754ced962183a311b5359ec6f67f2b29d1fe2ab06f988bd496974fb39d |
| RPM (aarch64) | 6907be18ff349a5ac1e6738bfa7c38815f3a37e5c19e8f5b0d8698a2058db181 |
Changes since last release
From CHANGELOG.md, 2026-08-11:
Every release download is attested (#224)
Contributed by Kaj Kowalski (@kjanat). The release job now publishes a GitHub build-provenance attestation for every release asset - tarballs, .deb, .rpm, AppImage, the pacman packages and repo database - before anything goes live, so gh attestation verify --owner patrickjaja <file> works on any download. The step is fail-closed ahead of all publishing: if attestation fails, the release aborts cleanly with every channel still on the previous version. The reproducibility probe now also reuses the release pipeline's own bridge binaries from its cache (restore-only) and prints its digest next to the latest release asset's, so probe and release attestations can cover the very same bytes.
Links
Claude Desktop 1.26832.0 (patch release 2)
Claude Desktop 1.26832.0 (patch release 2)
This release provides Claude Desktop version 1.26832.0 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-extraArch Linux (manual package)
# x86_64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.26832.0-2/claude-desktop-extra-1.26832.0-2-x86_64.pkg.tar.zst
# ARM64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.26832.0-2/claude-desktop-extra-1.26832.0-2-aarch64.pkg.tar.zstDebian/Ubuntu (APT Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install.sh | sudo bash
sudo apt install claude-desktop-extraDebian/Ubuntu (manual .deb)
# x86_64
sudo apt install ./claude-desktop-extra_1.26832.0-2_amd64.deb
# ARM64
sudo apt install ./claude-desktop-extra_1.26832.0-2_arm64.debFedora/RHEL (RPM Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-extraFedora/RHEL (manual .rpm)
# x86_64
sudo dnf install ./claude-desktop-extra-1.26832.0-2.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-extra-1.26832.0-2.aarch64.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-extraAppImage (Any Distro)
# x86_64
chmod +x Claude_Desktop-1.26832.0-x86_64.AppImage
./Claude_Desktop-1.26832.0-x86_64.AppImage
# ARM64
chmod +x Claude_Desktop-1.26832.0-aarch64.AppImage
./Claude_Desktop-1.26832.0-aarch64.AppImageUpdate 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) | 0b91c41755ebc03a074167ffad8365e41fa6b6f1c0645a0f4a1060804caf9e11 |
| Arch pacman (aarch64) | ac34d3939e289d10552c2a3ac3b7fb142240a1fe4c363f00affca60cd1fa36c3 |
| Tarball (x86_64) | 6813395c973924c381417cbd60abdfffc2543b653dbe7497b0155a1768433bb6 |
| Tarball (aarch64) | 22291af53618b17f4594c17ffd0ee6cec37b3d1e83a173a61e438d3db6416cb7 |
| AppImage (x86_64) | f8ab7a21b561ef7a08432031ab7f5168425e0427a4fa9ae7c088892a5bfe9712 |
| AppImage (aarch64) | a59a120dbde536868d9a4eb42dc055b2fd7a5f24483ba5eb62c433ba46f58428 |
| Debian (amd64) | 7582308185d25711d45b2884f2619d2b73818e3176a4a41f675ba00ea4491329 |
| Debian (arm64) | afbee8f7c9322ef668e49ee1a3b3af7e8104edd4be960d81ca11a0a88403b2e5 |
| RPM (x86_64) | bdba0a77e0456caea67d49329e7e41a633805f7e5792d8aa7134a29ab6663df3 |
| RPM (aarch64) | 52783dbbe93ce03647a3f2922d480fc97c52cad7e9f0093adfef2a7a399f69b2 |
Changes since last release
From CHANGELOG.md, 2026-08-08:
Claude Desktop v1.26832.0 - upstream switched its minifier, 31 of 45 patches re-anchored
Anthropic's v1.25927.0/v1.26832.0 releases (issue #218) came out of a new bundler toolchain, and the auto-release failed loudly as designed. Three output changes invalidated most of our regex anchors at once: string literals are now backtick template literals (process.platform===`darwin` instead of "darwin"), the "use strict"; prologue is gone from bundle heads (files open with a Sentry preamble), and the code-split bundle gained a second chunk family (index2.chunk-*.js, 130 files, next to 195 index.chunk-*.js).
All 31 affected patches are re-anchored with quote-tolerant patterns (["`] character classes), so they survive either quoting style. The patch orchestrator and validator now stage both chunk families as one logical bundle. fix_computer_use_linux additionally lost its silent-failure path: a sub-patch that does not match now exits nonzero instead of quietly writing the file back unpatched.
Substantively this release is the same app re-emitted through a new toolchain: the capability map (36 status:"unavailable" entries), the built-in MCP server roster, the Cowork VM probe shapes and every stable feature anchor are count-identical to v1.24012. There is still no native Linux Computer Use backend, so all four bundled bridges stay load-bearing. Upstream did ship new native Linux pieces alongside: a cowork-linux-helper binary and a raw smol-bin.x64.img VM image (the Cowork VM path keeps maturing on Linux), plus a chrome-native-host native-messaging binary for the Claude browser extension.
One sub-patch retired as upstreamed: the .deb now bundles that chrome-native-host binary in resources/, exactly where the packaged app looks for it - so fix_browser_tools_linux no longer redirects the native-host path to the Claude Code host under ~/.claude (that redirect existed only because the binary used to be absent from the official Linux build). Claude in Chrome now runs on upstream's own bundled native host; our patch still adds Chromium, Brave, Vivaldi and Opera discovery, the extension auto-install path and the DevTools opener.
The minifier switch also exposed one latent false success: add_growthbook_overrides anchored its injection on "use strict"; via plain string search, and the only remaining occurrence of that string now sits inside a vendored template literal - the injection landed as inert string content while reporting success. It now prepends at the bundle head and asserts its own injected marker. The other head-injecting patches already used a safe prefix check with a prepend fallback and needed no change; all ten were verified together in orchestrator order, twice for idempotency, with node --check clean on all 326 re-split bundle parts.
Settings → Extra → Deployment follows the new managed-settings schema
The key catalog now carries the six keys upstream added: skillCreationEnabled, trustBootstrapDelivery, endUserAttribution (renamed from all-lowercase enduserAttribution, which remains readable as a legacy key), the inferenceGatewayOidcAuthFlow/inferenceVertexWorkforceAuthFlow sign-in flow enums, and updateViaUpdatesHost (marked @next upstream, listed but not yet active).
Gaming themes: all six spinners redrawn as retro pixel art
The gaming themes' loading spinners were flat single-color glyphs (and the Dragon Ball a flat orange blob). Each is now a proper two-frame pixel sprite in the spirit of its game, drawn from period references on a 14-21px grid: the four PlayStation button symbols orbiting in their classic colors, a Game Boy DMG with a blinking screen, a Final Fantasy Black Mage casting sparkles, Link swinging his sword, a Warcraft peon striking a gold pile, and a shimmering 4-star Dragon Ball. All of them stay flat-fill paths with the existing flip animation, so nothing changes in the renderer.
Feature flag catalog refreshed for v1.26832.0
claude-desktop-extra.jsonc's commented-out flag list gains 14 new flags (among them the CliGovernor throttleEnabled/pressureEvictionEnabled pair, a renderer crash-loop watchdog, and resolveCloudBranch) and drops 4 that upstream removed.
Links
Claude Desktop 1.26832.0
Claude Desktop 1.26832.0
This release provides Claude Desktop version 1.26832.0 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-extraArch Linux (manual package)
# x86_64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.26832.0/claude-desktop-extra-1.26832.0-1-x86_64.pkg.tar.zst
# ARM64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.26832.0/claude-desktop-extra-1.26832.0-1-aarch64.pkg.tar.zstDebian/Ubuntu (APT Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install.sh | sudo bash
sudo apt install claude-desktop-extraDebian/Ubuntu (manual .deb)
# x86_64
sudo apt install ./claude-desktop-extra_1.26832.0-1_amd64.deb
# ARM64
sudo apt install ./claude-desktop-extra_1.26832.0-1_arm64.debFedora/RHEL (RPM Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-extraFedora/RHEL (manual .rpm)
# x86_64
sudo dnf install ./claude-desktop-extra-1.26832.0-1.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-extra-1.26832.0-1.aarch64.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-extraAppImage (Any Distro)
# x86_64
chmod +x Claude_Desktop-1.26832.0-x86_64.AppImage
./Claude_Desktop-1.26832.0-x86_64.AppImage
# ARM64
chmod +x Claude_Desktop-1.26832.0-aarch64.AppImage
./Claude_Desktop-1.26832.0-aarch64.AppImageUpdate 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) | f8829e8ca2add23095096c3ba0748d0f5f7203023b9237f5be496ac71419c4da |
| Arch pacman (aarch64) | d519e93350412c0c9c989fd586fb4eaee03e83fff8d2abd27c0828d2d75964a3 |
| Tarball (x86_64) | a07b2aa9d3560e19bda2f86ee697f45799c3bd17af742c50d6368ec56defdbeb |
| Tarball (aarch64) | b60b8156bb6a0fc9cfa9be3c8f1caddfd4513cbf16425e1c1a4e1b9b64850617 |
| AppImage (x86_64) | 1a2a7b0bd0000f9f17773584b837993f45d5bf3b685c150c2687c38f196a748d |
| AppImage (aarch64) | 62cb37554dfce7cc0716b348f14902991cc9f60e93b58ade131f03cf6d872a77 |
| Debian (amd64) | 3e04e290c58faac9f5e2a525dd91ea5e262af66deecd7bc1ed3107d3f8215fcd |
| Debian (arm64) | adfae80716728e4e98aa7ccf5063104e773d271e1f9252f3ec8c720deb282d12 |
| RPM (x86_64) | ef4f953ae4ffa55a01563f659ee8ec46feedfe5f4624eecb64d123ecffe02cb9 |
| RPM (aarch64) | 993486789ad0b70005f5c1dfb12adc62343ab7a435b487adca76412297f5e59e |
Changes since last release
From CHANGELOG.md, 2026-08-08:
Claude Desktop v1.26832.0 - upstream switched its minifier, 31 of 45 patches re-anchored
Anthropic's v1.25927.0/v1.26832.0 releases (issue #218) came out of a new bundler toolchain, and the auto-release failed loudly as designed. Three output changes invalidated most of our regex anchors at once: string literals are now backtick template literals (process.platform===`darwin` instead of "darwin"), the "use strict"; prologue is gone from bundle heads (files open with a Sentry preamble), and the code-split bundle gained a second chunk family (index2.chunk-*.js, 130 files, next to 195 index.chunk-*.js).
All 31 affected patches are re-anchored with quote-tolerant patterns (["`] character classes), so they survive either quoting style. The patch orchestrator and validator now stage both chunk families as one logical bundle. fix_computer_use_linux additionally lost its silent-failure path: a sub-patch that does not match now exits nonzero instead of quietly writing the file back unpatched.
Substantively this release is the same app re-emitted through a new toolchain: the capability map (36 status:"unavailable" entries), the built-in MCP server roster, the Cowork VM probe shapes and every stable feature anchor are count-identical to v1.24012. There is still no native Linux Computer Use backend, so all four bundled bridges stay load-bearing. Upstream did ship new native Linux pieces alongside: a cowork-linux-helper binary and a raw smol-bin.x64.img VM image (the Cowork VM path keeps maturing on Linux), plus a chrome-native-host native-messaging binary for the Claude browser extension.
One sub-patch retired as upstreamed: the .deb now bundles that chrome-native-host binary in resources/, exactly where the packaged app looks for it - so fix_browser_tools_linux no longer redirects the native-host path to the Claude Code host under ~/.claude (that redirect existed only because the binary used to be absent from the official Linux build). Claude in Chrome now runs on upstream's own bundled native host; our patch still adds Chromium, Brave, Vivaldi and Opera discovery, the extension auto-install path and the DevTools opener.
The minifier switch also exposed one latent false success: add_growthbook_overrides anchored its injection on "use strict"; via plain string search, and the only remaining occurrence of that string now sits inside a vendored template literal - the injection landed as inert string content while reporting success. It now prepends at the bundle head and asserts its own injected marker. The other head-injecting patches already used a safe prefix check with a prepend fallback and needed no change; all ten were verified together in orchestrator order, twice for idempotency, with node --check clean on all 326 re-split bundle parts.
Settings → Extra → Deployment follows the new managed-settings schema
The key catalog now carries the six keys upstream added: skillCreationEnabled, trustBootstrapDelivery, endUserAttribution (renamed from all-lowercase enduserAttribution, which remains readable as a legacy key), the inferenceGatewayOidcAuthFlow/inferenceVertexWorkforceAuthFlow sign-in flow enums, and updateViaUpdatesHost (marked @next upstream, listed but not yet active).
Feature flag catalog refreshed for v1.26832.0
claude-desktop-extra.jsonc's commented-out flag list gains 14 new flags (among them the CliGovernor throttleEnabled/pressureEvictionEnabled pair, a renderer crash-loop watchdog, and resolveCloudBranch) and drops 4 that upstream removed.
Links
Claude Desktop 1.24012.11 (patch release 2)
Claude Desktop 1.24012.11 (patch release 2)
This release provides Claude Desktop version 1.24012.11 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-extraArch Linux (manual package)
# x86_64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.24012.11-2/claude-desktop-extra-1.24012.11-2-x86_64.pkg.tar.zst
# ARM64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.24012.11-2/claude-desktop-extra-1.24012.11-2-aarch64.pkg.tar.zstDebian/Ubuntu (APT Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install.sh | sudo bash
sudo apt install claude-desktop-extraDebian/Ubuntu (manual .deb)
# x86_64
sudo apt install ./claude-desktop-extra_1.24012.11-2_amd64.deb
# ARM64
sudo apt install ./claude-desktop-extra_1.24012.11-2_arm64.debFedora/RHEL (RPM Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-extraFedora/RHEL (manual .rpm)
# x86_64
sudo dnf install ./claude-desktop-extra-1.24012.11-2.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-extra-1.24012.11-2.aarch64.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-extraAppImage (Any Distro)
# x86_64
chmod +x Claude_Desktop-1.24012.11-x86_64.AppImage
./Claude_Desktop-1.24012.11-x86_64.AppImage
# ARM64
chmod +x Claude_Desktop-1.24012.11-aarch64.AppImage
./Claude_Desktop-1.24012.11-aarch64.AppImageUpdate 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) | e7a89e6df2547d66a29dd966cef7de17109470f1b91dbcfa102e29316492b7ed |
| Arch pacman (aarch64) | 360bffcf63f51c1d778269a32f0da1bec6b69fcd4ab292c4655dce40662e2182 |
| Tarball (x86_64) | b2ec868f12c42df5ee88718474988334861fd8293bd1b8de7f3788e632772c00 |
| Tarball (aarch64) | 0fe76118bb90990fe67d4f32e91c72ebce81be782d26d17066c01d08b7df79c5 |
| AppImage (x86_64) | e111ddb3d0cb1b6770f179db946874131e6bdac0b5d1cc707a10a9889e0716bb |
| AppImage (aarch64) | ed5f23c3a9acd6a9f511dbba3cbef969865d0fca3a34fee25a79268973b5ec59 |
| Debian (amd64) | adc4353367ddeea2875b8489adaacaf204d39122e9ec00c9460e2d0183eb6983 |
| Debian (arm64) | c639f68e617ce17f8053397fcd302d2bc42855c3885c48453d7ef0b5e3453e35 |
| RPM (x86_64) | 8ab2f743b65a50d644c4a45fc7e73b5222c01deed9ba6995b8912e84fd4bd7bb |
| RPM (aarch64) | 2d6b071b1fb1b75c72ec06f75de1efdf70eca5639f70ccc34683fda0c54a86c9 |
Changes since last release
From CHANGELOG.md, 2026-08-07:
Settings → Extra: our switches and Anthropic's flags are now two separate pages
The Features page held two unrelated things: the handful of optional features this project adds, and Anthropic's own 134 rollout flags. They are now one page each.
Community Features holds our switches - Diff view modes, Panel tabs, Calm the Cowork glow, and the new Theme picker hotkey - and gains the same filter box the flag list has, so a growing list stays quick to search. Anthropic Features holds the upstream flag list, the per-flag overrides and the "changes require a restart" notice with its Restart now button, unchanged. Nav order is Themes, Community Features, Anthropic Features, Deployment.
The new Theme picker hotkey switch (config key themePicker, on by default) turns the Ctrl+Shift+T gallery off for anyone who wants that shortcut back for something else. The theme list in Settings → Extra → Themes is unaffected.
Nothing moves on disk: both claude-desktop-extra.jsonc (yours, wins) and claude-desktop-extra.json (written by the UI) keep the same keys in the same places.
The Cowork glow switch named the wrong config file
When coworkGlow is set by hand, the switch locks itself and explains where the value came from - but it named claude-desktop-bin.jsonc, the filename from before the project was renamed. It now names claude-desktop-extra.jsonc, which is the file actually being read.
Patches are grouped by what they are for
patches/ was a flat directory of 45 .nim files where nothing distinguished a Linux bug fix from an optional feature. It is now three:
patches/linux/(32) - Linux compatibility. Always on, nothing to configure.patches/community/(6) - optional features, each with a switch in Settings → Extra → Community Features.patches/core/(7) - always-on infrastructure the other two build on: the Extra settings pages, the theme engine, the flag-override mechanism, the multi-profile plumbing.
Patches still apply in basename order, so the split changes classification only, not behavior. scripts/apply_patches.py now pins the total in EXPECTED_PATCH_COUNT and refuses to run if discovery finds a different number - a patch cannot be added or lost without someone saying so. The README documents the recipe for adding a community feature.
The Code tab's side panels can open as tabs instead of a split
Diff, terminal, browser, files, artifacts and background tasks have always shared the panel area as a fixed split, each one shrinking to make room for its neighbours. A new Panel tabs switch (Settings → Extra → Community Features → Layout) turns that into a tab strip instead: each panel gets the full width of the panel area. Open panels the way you always have - the app's own toolbar buttons and its Session actions menu - and each one arrives as a new tab. Ctrl+1-9 jump straight to a tab, and closing one replays it through the panel's own close control, so panel teardown itself is unchanged. The chat column is unaffected.
Switching tabs shows and hides panels rather than rebuilding them, so every panel keeps its state: the diff panel's expanded and collapsed files are still expanded and collapsed when you come back, and the terminal keeps its scrollback and its size. Upstream's own layout is never rewritten to switch - the panels you are not looking at are still in it, just hidden - which is also why a switch is instant instead of taking the second a rebuild used to.
The consequence worth knowing: a hidden panel keeps running. A live preview goes on rendering and a browser tab goes on loading in the background, where closing a split pane would have torn them down. That is what makes them instant to come back to, and it costs some CPU for a preview that never stops moving.
The chat/side boundary stays where you put it. The panel area is sized as if it were a two-pane split - chat versus one panel - and that proportion is remembered per session, so opening or closing a panel no longer moves the boundary. Drag the divider between chat and the panel area to resize, exactly as before; where you drop it is where it stays, on every tab and after a reload.
The tab bar carries the expand control, at its right edge. Expanding spans the active panel across the window, and it stays expanded while you switch tabs, so you can flick between two panels at full width. Upstream discards the other panels while one is expanded, so the panel you switch to while expanded comes back fresh - collapse first if you want to keep where you were. With many tabs open the chips scroll sideways while the expand control stays pinned at the right edge, so it is always reachable.
Opening and closing panels does not disturb the layout. A panel the app has only just inserted is hidden before it can paint, rather than appearing as a second split for a few frames and then being tidied away, so the boundary holds still through the whole operation - measured at zero pixels of movement across every frame of an open and a close, where it previously jumped 165 px for around 90 ms each way.
Off by default, and off is a complete retreat: the tab bar and its styling are removed and upstream's real split layout is simply there again, because it was never replaced. Nothing you had open is lost. Only the active tab and the chat/side proportion are remembered per session - which panels are open is upstream's own record, so opening, closing or reordering panels in its UI is reflected in the tabs.
Because the Code tab is remote claude.ai code, the bar degrades rather than fights: if an update moves the internals it drives, it renders no bar and warns once, leaving the layout exactly as the app left it - and since it never rewrites that layout, the degraded state is just the stock split UI. Everything it reaches into is read-only: the only upstream controls it ever presses are the active panel's own close and expand buttons, and only when you press them. The anchors it depends on are inventoried with re-derivation recipes in baseline/PANEL_TABS_ANCHORS.md, which joins the per-release audit checklist.
Designed, built and hardened by @dels07 in #216 - thanks!
Diff views: the scope dropdown no longer survives a panel swap
Upstream reuses a panel's chrome row when one panel replaces another in the same slot, and the diff-views scope dropdown installed on that row could survive the swap and appear on a view it does not apply to. Installed dropdowns are now revalidated against the row's current view and removed when it no longer qualifies. A pre-existing bug, found and fixed in #216 because panel ta...
Claude Desktop 1.24012.11
Claude Desktop 1.24012.11
This release provides Claude Desktop version 1.24012.11 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-extraArch Linux (manual package)
# x86_64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.24012.11/claude-desktop-extra-1.24012.11-1-x86_64.pkg.tar.zst
# ARM64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.24012.11/claude-desktop-extra-1.24012.11-1-aarch64.pkg.tar.zstDebian/Ubuntu (APT Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install.sh | sudo bash
sudo apt install claude-desktop-extraDebian/Ubuntu (manual .deb)
# x86_64
sudo apt install ./claude-desktop-extra_1.24012.11-1_amd64.deb
# ARM64
sudo apt install ./claude-desktop-extra_1.24012.11-1_arm64.debFedora/RHEL (RPM Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-extraFedora/RHEL (manual .rpm)
# x86_64
sudo dnf install ./claude-desktop-extra-1.24012.11-1.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-extra-1.24012.11-1.aarch64.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-extraAppImage (Any Distro)
# x86_64
chmod +x Claude_Desktop-1.24012.11-x86_64.AppImage
./Claude_Desktop-1.24012.11-x86_64.AppImage
# ARM64
chmod +x Claude_Desktop-1.24012.11-aarch64.AppImage
./Claude_Desktop-1.24012.11-aarch64.AppImageUpdate 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) | 490e52168588f9056da78bd68adf04f50dc7b0502a058d899cf9a47874c2062f |
| Arch pacman (aarch64) | c16f19f889e49f87347a00ac2fd0ed3a7bcbf18e2eab0056f9eddf6b35bc31ab |
| Tarball (x86_64) | 9f11a4979ec3f6c58dbb3112a1549ce96074749de26476c7b940d06b0839d62b |
| Tarball (aarch64) | 3842eaaf9ae31fe5e292eb347b2e3460e8f089c8da7a462e11956f75378ec604 |
| AppImage (x86_64) | 0842e7afe0919b25697a735bb20f1df8908466928401126e457d505efb09598c |
| AppImage (aarch64) | ecaa4a161964765e379dc8ad9672da4448f4675145a1f19d573a5f18a52c5378 |
| Debian (amd64) | 3dcd48dd832c934fcfc2f1e0ac9cd631cd820042332460c796ef978bdad5c90d |
| Debian (arm64) | dde90257b36c209baf7fec948c9b7ed76f3d1c4df65bb3c86127dba2600028f8 |
| RPM (x86_64) | 374d16d92880f72ff1d9c09ea91bd80ac182948730bf3766496bc580ef1ab592 |
| RPM (aarch64) | 9f2637f91c70fdbf532d89784ed07cc1cccd6bc7c50da63905fe8deb126898dd |
Changes since last release
From CHANGELOG.md, 2026-08-07:
The Code tab's side panels can open as tabs instead of a split
Diff, terminal, browser, files, artifacts and background tasks have always shared the panel area as a fixed split, each one shrinking to make room for its neighbours. A new Panel tabs switch (Settings → Extra → Features → Layout) turns that into a tab strip instead: each panel gets the full width of the panel area. Open panels the way you always have - the app's own toolbar buttons and its Session actions menu - and each one arrives as a new tab. Ctrl+1-9 jump straight to a tab, and closing one replays it through the panel's own close control, so panel teardown itself is unchanged. The chat column is unaffected.
Switching tabs shows and hides panels rather than rebuilding them, so every panel keeps its state: the diff panel's expanded and collapsed files are still expanded and collapsed when you come back, and the terminal keeps its scrollback and its size. Upstream's own layout is never rewritten to switch - the panels you are not looking at are still in it, just hidden - which is also why a switch is instant instead of taking the second a rebuild used to.
The consequence worth knowing: a hidden panel keeps running. A live preview goes on rendering and a browser tab goes on loading in the background, where closing a split pane would have torn them down. That is what makes them instant to come back to, and it costs some CPU for a preview that never stops moving.
The chat/side boundary stays where you put it. The panel area is sized as if it were a two-pane split - chat versus one panel - and that proportion is remembered per session, so opening or closing a panel no longer moves the boundary. Drag the divider between chat and the panel area to resize, exactly as before; where you drop it is where it stays, on every tab and after a reload.
The tab bar carries the expand control, at its right edge. Expanding spans the active panel across the window, and it stays expanded while you switch tabs, so you can flick between two panels at full width. Upstream discards the other panels while one is expanded, so the panel you switch to while expanded comes back fresh - collapse first if you want to keep where you were. With many tabs open the chips scroll sideways while the expand control stays pinned at the right edge, so it is always reachable.
Opening and closing panels does not disturb the layout. A panel the app has only just inserted is hidden before it can paint, rather than appearing as a second split for a few frames and then being tidied away, so the boundary holds still through the whole operation - measured at zero pixels of movement across every frame of an open and a close, where it previously jumped 165 px for around 90 ms each way.
Off by default, and off is a complete retreat: the tab bar and its styling are removed and upstream's real split layout is simply there again, because it was never replaced. Nothing you had open is lost. Only the active tab and the chat/side proportion are remembered per session - which panels are open is upstream's own record, so opening, closing or reordering panels in its UI is reflected in the tabs.
Because the Code tab is remote claude.ai code, the bar degrades rather than fights: if an update moves the internals it drives, it renders no bar and warns once, leaving the layout exactly as the app left it - and since it never rewrites that layout, the degraded state is just the stock split UI. Everything it reaches into is read-only: the only upstream controls it ever presses are the active panel's own close and expand buttons, and only when you press them. The anchors it depends on are inventoried with re-derivation recipes in baseline/PANEL_TABS_ANCHORS.md, which joins the per-release audit checklist.
Designed, built and hardened by @dels07 in #216 - thanks!
Diff views: the scope dropdown no longer survives a panel swap
Upstream reuses a panel's chrome row when one panel replaces another in the same slot, and the diff-views scope dropdown installed on that row could survive the swap and appear on a view it does not apply to. Installed dropdowns are now revalidated against the row's current view and removed when it no longer qualifies. A pre-existing bug, found and fixed in #216 because panel tabs made it easy to hit.
Release pipeline: releases can skip the AUR during an extended outage
The AUR preflight added on 2026-08-03 did its job: when the AUR went into maintenance again, the v1.24012.11 auto-release (run 30868900341) stopped before publishing anything, keeping every channel consistent. The right call for a blip - but this maintenance window has lasted days, freezing all channels behind one that is down. The release workflow now takes a skip_aur dispatch input: the AUR preflight and push are skipped, every other channel (GitHub Release, pacman repo assets, Pages apt/dnf repos, README/Nix versions) publishes normally, and the AUR catches up automatically on the next non-skipped release, since the push diffs the PKGBUILD against whatever the AUR currently holds. Unattended auto-releases keep the default false, so the fail-fast preflight still guards them.
Links
Claude Desktop 1.24012.9 (patch release 14)
Claude Desktop 1.24012.9 (patch release 14)
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-extraArch Linux (manual package)
# x86_64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.24012.9-14/claude-desktop-extra-1.24012.9-14-x86_64.pkg.tar.zst
# ARM64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.24012.9-14/claude-desktop-extra-1.24012.9-14-aarch64.pkg.tar.zstDebian/Ubuntu (APT Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install.sh | sudo bash
sudo apt install claude-desktop-extraDebian/Ubuntu (manual .deb)
# x86_64
sudo apt install ./claude-desktop-extra_1.24012.9-14_amd64.deb
# ARM64
sudo apt install ./claude-desktop-extra_1.24012.9-14_arm64.debFedora/RHEL (RPM Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-extraFedora/RHEL (manual .rpm)
# x86_64
sudo dnf install ./claude-desktop-extra-1.24012.9-14.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-extra-1.24012.9-14.aarch64.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-extraAppImage (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.AppImageUpdate 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) | f35533c278a7441c44143fe8a7c2adb835714ef28cf00ce0215f18070f2c94fc |
| Arch pacman (aarch64) | fb24567f75734dea2c32b0af26724b484199342cecc22f2b6d1969e7b5468187 |
| Tarball (x86_64) | bac937ed248e3291f91290a674f7c944b434102f89dd65e317732d83f594fe22 |
| Tarball (aarch64) | 4cbfa080b7ebb93b3b251c44da15d26fe2872aa6bb954e3f2bdfcc761c35359a |
| AppImage (x86_64) | 7e043478547f92d6fc20eeb0cfb824fc15fdeb867c450d5dc904ba68ce187497 |
| AppImage (aarch64) | cdf15c516a151512598db8ae09dc61a4338839192d46e305d05cad2826a2340e |
| Debian (amd64) | ac63c83cec87c1c03cf788b62f618d15ccf8e03aea60c3387794d2be5d0b0d85 |
| Debian (arm64) | 4a94a632f489ed434faad398ab320699c48899ac9e91fffc9655a7a6a6f61a67 |
| RPM (x86_64) | 72515eccf2eb2fc1ea095425f028edac1d8028dfc5bb88df350fa07d55ee2dc1 |
| RPM (aarch64) | f21226a07f90ae4870d833191598f79a42e036bf641821aa0a5fdb8e518f5417 |
Changes since last release
From CHANGELOG.md, 2026-08-03:
Launching from a panel or menu no longer freezes startx/xinit desktops
On a session started with startx/xinit instead of a display manager, launching Claude Desktop from a panel button or the applications menu suspended the entire desktop: the window mapped blank, nothing redrew, only the pointer and VT switching kept working. The desktop on such a session runs on a VT and shares one process group, and the app's Claude Code integration probes the user environment with an interactive login shell (bash -l -i -c '... env'). Bash's job-control init finds that shell in a background process group of its controlling terminal and raises SIGTTIN against the whole group - which on a startx session is xfce4-session, the window manager, the panel and everything else. Terminal launches were always fine, because there the launcher is the foreground job.
The launcher now detaches via setsid before exec, but only when it is genuinely a background job on a controlling terminal (tpgid exists and differs from pgid). Display-manager sessions (tpgid == -1) and foreground terminal launches (tpgid == pgid) are untouched - terminal users keep live output and Ctrl-C. On a detached launch the app's stdout/stderr now lands in ~/.cache/claude-desktop/stdout.log (2 MiB rotation) instead of an unreadable VT, which also makes issue reports from menu-launched sessions possible. CLAUDE_KEEP_TTY=1 restores the old behaviour.
Root-caused (down to the wchan do_signal_stop capture) and fixed by Marco Bucchiarone (@Eresy) in #213 - thanks!
Computer Use executor: remaining probe/timing exec calls converted to argument arrays
The residual shell-string execSync calls in js/cu_linux_executor.js now run through execFileSync with argument arrays: the systemd-detect-virt VM probe, the which-based command cache, the pgrep -x ydotoold daemon check, and the ydotool hold-key sleep. None of these carried attacker-controlled input (the model-supplied paths were already converted 2026-07-13), so this is defensive consistency, not a vulnerability fix. The now-unused _exec/_execBuf shell helpers are gone.
Contributed by @anupamme (#212) - thanks!
Post-merge follow-up: the PR also whitespace-split COWORK_SCREENSHOT_CMD into an execFileSync argument array, which would have broken quoted arguments and pipes in user templates (e.g. grim -g "{X},{Y} {W}x{H}" {FILE}). That variable is a user-supplied command template from the user's own environment - shell evaluation is its documented contract and carries no injection surface - so the follow-up commit restores it verbatim.
Links
Claude Desktop 1.24012.9 (patch release 13)
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-extraArch 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.zstDebian/Ubuntu (APT Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install.sh | sudo bash
sudo apt install claude-desktop-extraDebian/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.debFedora/RHEL (RPM Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-extraFedora/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.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-extraAppImage (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.AppImageUpdate 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 masterEverything 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 ...
Claude Desktop 1.24012.9 (patch release 12)
Claude Desktop 1.24012.9 (patch release 12)
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-extraArch Linux (manual package)
# x86_64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.24012.9-12/claude-desktop-extra-1.24012.9-12-x86_64.pkg.tar.zst
# ARM64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.24012.9-12/claude-desktop-extra-1.24012.9-12-aarch64.pkg.tar.zstDebian/Ubuntu (APT Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install.sh | sudo bash
sudo apt install claude-desktop-extraDebian/Ubuntu (manual .deb)
# x86_64
sudo apt install ./claude-desktop-extra_1.24012.9-12_amd64.deb
# ARM64
sudo apt install ./claude-desktop-extra_1.24012.9-12_arm64.debFedora/RHEL (RPM Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-extraFedora/RHEL (manual .rpm)
# x86_64
sudo dnf install ./claude-desktop-extra-1.24012.9-12.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-extra-1.24012.9-12.aarch64.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-extraAppImage (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.AppImageUpdate 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) | f9aaa3e2ca3c3de5089ac4c9ffd8607c627c7e4d29a768c87d3860446d1468b3 |
| Arch pacman (aarch64) | 0c643ec01c4e25f28f4e7fe1706de71a0710da5295873ec97dc9ac2ea84e0c32 |
| Tarball (x86_64) | 9374de74ffbb604625add39231c61fdf3948449593ceee1c7c118ef7dd426d1a |
| Tarball (aarch64) | 52c4e822f68246aaab8c432e3cba964fddd44dae28ea06ac20a7acfdd170782c |
| AppImage (x86_64) | 529ac2a9fadd458bafc691d40de1ebcba5cf89ca35ec001b254a76c1890d5020 |
| AppImage (aarch64) | f3085e1e1616547e5d71bd4b9df8d3b9756272da42d50d20f0c4881b979a4f78 |
| Debian (amd64) | 7353a9669cf2c722b4bd0464cf698b7b08bf592ecec4a6b4a0c7cf474ab492f1 |
| Debian (arm64) | 4f3396ca8d5b230f6c7cf73a4945391345079c0c4495abc7336a2c037eb08865 |
| RPM (x86_64) | c4af9cc28f358a4d1a85b4a3fcc18f262b825050678e44b7c42e20ea248307d3 |
| RPM (aarch64) | b3b96b8cbdf4c9dcd3b69f07417112b66cb68607f0d2a75293d2a4794dd5383e |
Changes since last release
From CHANGELOG.md, 2026-07-31:
Settings → Extra → Deployment: a 1P/3P switch, and the whole 3P config as toggles
Third-party inference was a one-way door. Turning it on took a root shell to place /etc/claude-desktop/managed-settings.json, and getting back to a personal claude.ai login took knowing that deleting that file is not enough - the app keeps its own stored 3P config and boots from that, so the only way out was a launcher flag or hand-editing JSON in a directory most people never look at.
The new Deployment panel makes both directions a button. It has:
- The mode switch.
1P/3P, showing what the running session is, what the next start will use, and which config source decided that. It writes upstream's owndeploymentModekey, which overrides a stored 3P configuration - so a machine that got stuck in 3P is one click and one restart from personal again, with nothing deleted. - The configuration, as a form. Every key of the managed-settings schema this build accepts, grouped the way upstream's own schema groups it: provider and credentials, model list, surfaces (Chat/Cowork/Code), workspace and egress allowlists, disabled built-in tools, connectors and extensions, plugins, telemetry, update policy, usage limits, branding, bootstrap. Booleans are switches, enums are selects, lists are one-per-line, and a key you never touch stays absent from the file so Claude Desktop keeps its own default. Provider-specific fields stay hidden until that provider is selected.
- The stored configurations. The panel edits the applied entry of the same store upstream's 3P Setup wizard uses, so the two show each other's values. Its Active configuration picker switches between them - and picking None boots 1P while leaving every file on disk.
- A raw JSON editor for anything the form does not cover, which rejects a key this build does not know instead of writing a file the app would then ignore whole.
- Undo for everything. Each set key has a
clearchip, the mode switch has one that forgets the saved choice so the stored configuration decides again, and the section heading has aclear all(two clicks, because it throws work away) for a handful of toggles flipped by mistake. Clearing never deletes a configuration file - the entry stays listed and can be filled in again.
Everything is written to your own profile directory (~/.config/Claude-3p/, per profile), 0600 in a 0700 dir, using only files upstream already reads - so no sudo, and no patch to the app's startup path. Stored credentials are write-only: the panel can replace one but never displays it, and it will not hand one to the claude.ai page it renders in. Two keys stay read-only there and remain yours to deploy through the policy file: disableDeploymentModeChooser, which is precisely what locks a machine into 3P, and managedMcpServers, whose entries can start a process. A valid /etc/claude-desktop/managed-settings.json still wins over all of it; the panel says so and turns read-only.
Also in this release: betaFeaturesEnabled no longer exists upstream. If your policy file still carries it, remove it - one unrecognized key makes Claude Desktop discard the entire managed file. docs/third-party-inference.md documents the new route and this trap.
Themes: Built-in and Community are one "Common" section
Whether a palette ships as a built-in or came from the community collection is a packaging detail, not something to pick a theme by - so the two sections are now one Common list, alphabetically, in both the Settings panel and the Ctrl+Shift+T picker. Your themes and Gaming are unchanged.
The Extra panels link the config file behind them
Each panel ends in the file it is really about, as a link: click the path to open it in your editor, or the folder button to show it in your file manager. Files that do not exist yet open their containing folder rather than failing. Themes names the file a click there actually persists to, which depends on which of claude-desktop-extra.jsonc / .json exists; Features links the .jsonc - the file you edit by hand, and the one whose flag ids win over the panel. The page asks for a location by name and never sends a path, so it cannot ask the desktop to open anything but our own files.
Links
Claude Desktop 1.24012.9 (patch release 9)
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-extraArch 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.zstDebian/Ubuntu (APT Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install.sh | sudo bash
sudo apt install claude-desktop-extraDebian/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.debFedora/RHEL (RPM Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-extra/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-extraFedora/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.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-extraAppImage (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.AppImageUpdate 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, sopacman -Syuswaps 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-binpackage depends on the new name, soapt upgrademigrates in place. - Fedora/RHEL: the rpm carries
Obsoletes: claude-desktop-bin, sodnf upgrademigrates in place. - NixOS: the flake gains a
claude-desktop-extraattribute; the existingclaude-desktopanddefaultattributes keep working. - Config:
~/.config/Claude/claude-desktop-extra.jsoncis the config file now. On first start the app copies an existingclaude-desktop-bin.jsonc/.jsonover 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 ...
Claude Desktop 1.24012.9 (patch release 8)
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-extraArch 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.zstDebian/Ubuntu (APT Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-bin/install.sh | sudo bash
sudo apt install claude-desktop-extraDebian/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.debFedora/RHEL (RPM Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-bin/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-extraFedora/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.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-binAppImage (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.AppImageUpdate 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, sopacman -Syuswaps 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-binpackage depends on the new name, soapt upgrademigrates in place. - Fedora/RHEL: the rpm carries
Obsoletes: claude-desktop-bin, sodnf upgrademigrates in place. - NixOS: the flake gains a
claude-desktop-extraattribute; the existingclaude-desktopanddefaultattributes keep working. - Config:
~/.config/Claude/claude-desktop-extra.jsoncis the config file now. On first start the app copies an existingclaude-desktop-bin.jsonc/.jsonover 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 palet...
