Claude Desktop 1.49585.0 (patch release 5)
This release provides Claude Desktop version 1.49585.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.49585.0-5/claude-desktop-extra-1.49585.0-5-x86_64.pkg.tar.zst
# ARM64
sudo pacman -U https://github.com/patrickjaja/claude-desktop-extra/releases/download/v1.49585.0-5/claude-desktop-extra-1.49585.0-5-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.49585.0-5_amd64.deb
# ARM64
sudo apt install ./claude-desktop-extra_1.49585.0-5_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.49585.0-5.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-extra-1.49585.0-5.aarch64.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-extraAppImage (Any Distro)
# x86_64
chmod +x Claude_Desktop-1.49585.0-x86_64.AppImage
./Claude_Desktop-1.49585.0-x86_64.AppImage
# ARM64
chmod +x Claude_Desktop-1.49585.0-aarch64.AppImage
./Claude_Desktop-1.49585.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) | 47c7bb567d5111ff9ffa045c380ba99bdc5177b07906ade5e20d56161fb1b13f
|
| Arch pacman (aarch64) | 68c5bda9cb6658b1572b6ed821c7b3a50fd9e8796d937e0fc2fbe5ad3b2f4daf
|
| Tarball (x86_64) | dbc64842401a661a2513b1abb3a1d80005308c89ecb9fa0dd0f7b7ca70186d9c
|
| Tarball (aarch64) | e3e923b3bc8a3300d1866bd08a8ce2d21871fa86e6acb892f79bfeef0bceec87
|
| AppImage (x86_64) | 8c550b74d36a000514bab06a7f3de2b0a2542d1b292c12330983707a1c6b32bf
|
| AppImage (aarch64) | 9b1dfbbc65d2085fdd0e47526deed4631b612a080334a8e6621ca57b4e79084e
|
| Debian (amd64) | ce07608129a63b9ebc4719a60280ba99b955f0f46dbd1b81ff671b66075ef73e
|
| Debian (arm64) | 624c7d427202768899e7400bc53640129ee18c591326ba52d7b9ca840904f504
|
| RPM (x86_64) | 423f66df4048207e505d971ce667ae436f50fc64b915fa589d5ae2b98b4b781d
|
| RPM (aarch64) | 81948a6db9f6ff088ab6230501e4094ffdfd91ead3e54aa89732fecd5c79356d
|
Changes since last release
From CHANGELOG.md, 2026-09-10:
Settings -> Extra: styling that survives a login, and a nav group that lands in any language
- The Extra settings page kept its stylesheet for one document only. Electron's
insertCSSis
scoped to the document that is live when it runs, and the panel's sheet was inserted once per
webContentsand never again. That is fine for the ordinary boot, where the firsthttpspage the
main window loads is the app itself, and wrong for every start that goes through/login: the sheet
landed on the login document, the app then replaced that document, and the one-shot guard blocked the
re-insert for the rest of the process. Settings -> Extra then rendered as unstyled text running past
the edge of the dialog. The sheet is now re-inserted on everydom-ready, dropping the previous
document's key first so sheets cannot stack, which is the same shape the theme engine has always
used. Measured on Electron 44.3.0, the bundled major: with the old shape the injected rule reads back
on the first page and is gone after a full navigation; with the new one it holds across both. - A rejected
insertCSSnow writesinsertCSS rejected: <reason>toclaude-patches.loginstead of
being dropped by an empty handler, so the next failure of this kind leaves evidence. The old guard had
a second failure mode for the same reason: it marked thewebContentsbefore the insert resolved, so
one transient rejection killed the panel's styling permanently rather than for one load. - The Extra nav group is no longer found by English text alone. Both the settings nav and the group
header to insert next to were matched against English labels, so a translated interface fell through
to the divider fallback - and a language sharing fewer words with English than Spanish does would
have dropped below the match threshold and got no Extra group at all. The nav is now located by the
data-testidattributes upstream puts on its own rows, which are build hooks rather than UI text and
read the same in every language, and the rows are then enumerated off the container's structure so
the groups upstream leaves untagged still come along. The insertion anchor gained two structural
tiers behind the label match: the header that follows the marked group, which is the desktop group in
any language, and failing that the last group that has a list of its own. - The shape line in
claude-patches.loggrew avia=field saying how the nav was found, and names a
structurally found anchor by its tier (hdr[#structure]) rather than by its text, because that text
is the user's interface language and page content does not belong in the log.via=testidwith
hdr[#structure]is the healthy line outside English. - Two new test harnesses cover this: the DOM suite gained the same captured nav in Spanish, with and
without the test ids, asserting the cloned header-and-list pair lands in the right place and that no
translated word reaches the diag channel; and a new main-process harness pins the stylesheet
lifetime, including that afile://first load does not consume the insert.
Launcher hardening
An audit of scripts/claude-desktop-launcher.sh - the one file every package installs byte-identical -
turned up nine defects, none of which had ever been reported. Each was reproduced before being fixed, and
each fix was re-run against the previous behaviour to confirm it changes what it claims to.
- The Chromium sandbox was disabled for every Wayland and XWayland launch.
--no-sandboxwas added
per session type rather than per package, so Wayland users ran remote claude.ai content unsandboxed
while the.deb,.rpmand pacman packages were busy installingchrome-sandbox4755 root and CI was
failing the build if it was not. The sandbox has nothing to do with the display backend: only the
AppImage genuinely needs it off, because a FUSE mount cannot carry a SUID bit. It is now added for the
AppImage alone, withCLAUDE_DISABLE_SANDBOX=1as an escape hatch. - A failed per-profile refresh deleted the profile's Electron binary and then launched it. The
refresh removed the old binary before writing the new one, so a full disk, a quota or a read-only home
turned a stale binary into no binary - and the launcher went on toexecthe path it had just deleted.
The deletion outlived the launch, so every later start silently lost the per-profile identity and
--create-profilerefused to repair it. The replacement is now staged beside the old one and renamed
into place, and the promised fallback to the canonical binary actually happens. - A sibling symlink to a file upstream had removed made every launch re-copy the binary, forever. The
staleness check treats any dangling sibling as "needs refresh", but the repair only visited names that
still exist in the current install, so the trigger could never clear. On a separate/homewithout
reflink support that is a ~228 MB copy on every single start. Stale links are now pruned. --create-profilerun while a profile was active pointed every shared symlink at itself, breaking
the Electron install for all named profiles until the next launch repaired it. Mirroring a directory
onto itself is now a no-op.- A stale
SingletonLockin a 3p deployment blocked every launch. The cleanup only knew the 1p
userData dir, although the--reload-themeprobe a few hundred lines above already walked both. - An unwritable
~/.cachestopped the app from starting. Onesudo claude-desktopis enough to
leave the log dir root-owned, and underset -ethe unguardedmkdirwas the first thing the launcher
did. Logging is a convenience and can no longer abort the launch, or print anything when it fails. PATHwas repaired 2100 lines after everything that needed it. The block exists because a
.desktoplaunch can start with an emptyPATH; it now runs first, instead of after themkdir,
find,ps,python3,gsettingsandsetsidcalls that were failing without it. With an empty
PATHthe launcher used to die at line 77 withmkdir: command not found.- Every
claude://URL exited silently whenXDG_RUNTIME_DIRwas missing (asu - usersession, a
container, a non-systemd distro):2>/dev/nullhid the message fromfindbut not its status, and
pipefailturned that into a wordless exit 1, so SSO callbacks did nothing at all. --diagnoserefused to run without a display - over SSH or from a VT, which is exactly where a
user diagnosing a GUI that will not start would run it. It is now exempt from the display check, and
the subcommands that only report or clean up (--help,--list-profiles,--unintegrate,
--delete-profileand friends) no longer refuse to run when the Electron binary is missing, which is
precisely when someone needs them.- Chromium collapses duplicate switches last-wins, and the launcher emitted two
--disable-features=on
a Wayland + native-titlebar launch. Only ordering luck decided the survivor was the Vulkan workaround
that prevents a silent no-window startup. Feature names are now accumulated and emitted once, with any
--disable-features=/--enable-features=the user passed folded in rather than silently replacing
ours. - The AppImage's
AppRunleft a trailing empty element inLD_LIBRARY_PATH, which the dynamic loader
reads as the current directory, so every AppImage launch searched$PWDfor shared objects. CLAUDE_MENU_BARwas advertised in--helpand in the environment-variables doc and read by nothing
at all - the launcher exported it and no patch or bundle code ever looked at it. Removed rather than
left as a knob that quietly does nothing.CLAUDE_NATIVE_TITLEBAR=0meant opposite things to the launcher and the app. The launcher
documents an explicitly set variable as winning in both directions and withholds every native-mode
argument when it sees0; the app read the same variable as a plain boolean, so0was
indistinguishable from unset and a savednativeTitlebarswitch still built the native window the user
had just asked not to have. The app now reads it as three-state - set to1forces on, set to0
forces off, unset defers to the saved switch - which restores the one-launch escape hatch from a saved
setting that leaves the window unusable.- Two comments that described the opposite of the code are corrected: profile resolution (an exported
CLAUDE_PROFILEbeats theclaude-desktop-<name>basename, not the other way round) and the claim
that a failed binary refresh fell back to the canonical binary.
Launcher: say when there is no keyring
- A session with no Secret Service provider now says so in
launcher.log. Without one, Chromium
falls back tobasic_text,safeStoragereports encryption unavailable and the sign-in is not
persisted, so the app goes through/loginon every start. That branch was silent, which made it
indistinguishable from a probe that never ran - and on a bare Wayland session (Hyprland, Sway, Niri)
it is the likeliest reason a user sees a login screen every time. The AppImage is the package where
this bites hardest: the.deb,.rpmand pacman packages pull a keyring in through their
dependencies, and an AppImage has no way to. --diagnosegrew aCredential storesection. It names whether
org.freedesktop.secretsandkwalletdanswer on the session bus, whether an explicit
--password-store=orCLAUDE_PASSWORD_STOREis overriding detection, and the verdict the launch path
will act on. The probes and the decision moved up next to_diagnose()and are now asked through one
shared function, because--diagnoseanswers from the argument dispatch and returns long before the
password-store block runs - so a second copy of those rules would have been free to drift from the one
that matters.- The Secret Service probe no longer stops at the first tool it finds.
busctlbeing installed is not
the same asbusctlreaching the bus, and answering from that one probe reported a keyring-less
session on machines that have one; all three probes now fall through to the next. On a machine where
the first probe was failing this switches the store offbasic_text, which costs one extra sign-in
and then persists it.