Claude Desktop 1.15200.0 (patch release 2)
This release provides Claude Desktop version 1.15200.0 pre-patched for Linux.
Installation Options
Arch Linux (AUR)
yay -S claude-desktop-binDebian/Ubuntu (APT Repository — recommended)
curl -fsSL https://patrickjaja.github.io/claude-desktop-bin/install.sh | sudo bash
sudo apt install claude-desktop-binDebian/Ubuntu (manual .deb)
# x86_64
sudo apt install ./claude-desktop-bin_1.15200.0-2_amd64.deb
# ARM64
sudo apt install ./claude-desktop-bin_1.15200.0-2_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-binFedora/RHEL (manual .rpm)
# x86_64
sudo dnf install ./claude-desktop-bin-1.15200.0-2.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-bin-1.15200.0-2.aarch64.rpmNixOS / Nix
nix run github:patrickjaja/claude-desktop-binAppImage (Any Distro)
# x86_64
chmod +x Claude_Desktop-1.15200.0-x86_64.AppImage
./Claude_Desktop-1.15200.0-x86_64.AppImage
# ARM64
chmod +x Claude_Desktop-1.15200.0-aarch64.AppImage
./Claude_Desktop-1.15200.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 |
|---|---|
| Tarball (x86_64) | aca810745f89ccf2448498fcab59654b6a837ebd252b7bd0f12d8e275d905681
|
| Tarball (aarch64) | 730b5afe027a115ecc6cd7d20541604121282a22194f4fdcd8b96f869a8ccb69
|
| AppImage (x86_64) | 94725472d49e0abb548511c1a474a33d2f1e7613b95a06682c510b9b9424605e
|
| AppImage (aarch64) | aca0d726068c2385bff1616c615d1a0d6d0896f2fd5f6b757f2ea1a9dff6cdff
|
| Debian (amd64) | f5176802fac683aa68d9effdda33f8f75d38127d45be3d8bac67d86faceed8fc
|
| Debian (arm64) | 890c6ab6ecfd6c01deb5332ab4ea33edf95e84a0204e6fda7e2e6307deb3cf6f
|
| RPM (x86_64) | 1cb698195b954a5cfbd92de25b2df55a662c0ac20e5ebc7039371e98b5307d3a
|
| RPM (aarch64) | 0d20e7514f1be0bea7f6a48e0cd2e815ddd660d4197c954910ac998ab513a2ba
|
Changes since last release
Fix: built-in theme text contrast (unreadable muted text + white-on-pale-accent labels)
- Muted/secondary text was below the WCAG AA readability floor in several built-in themes. With a theme active, sidebar items, secondary text, links and suggestion-chip labels render from
--text-400/--text-500; innordthese were220 10% 55%, only 3.47:1 against the background (AA needs 4.5:1), which read as dark-grey-on-dark. Raised the muted-text tokens to reference-faithful values that clear 4.5:1:nord->219 18% 66%(also restores the Nord Snow Storm hue the old desaturated grey had lost),catppuccin-latte->233 13% 41%(= Catppuccin Subtext1),catppuccin-frappe->228 28% 77%,sweet--text-500->300 18% 64%. Matching--claude-text-500(legacy hex, used by renderer chrome) bumped fornord/latte/sweet.catppuccin-mochaandcatppuccin-macchiatoalready passed. - White button labels were invisible on the themes' pale accent fills. All dark themes set
--oncolor-*(text on accent-filled buttons/badges/checkboxes) to white, but copied Catppuccin/Nord's bright accent colours into--accent-main-100, so white-on-accent computed to 1.5-2.7:1. Set--oncolor-*to each theme's darkest base tone (e.g.nordPolar Night220 16% 15%, Catppuccin Mantle/Crust), giving 5.7-11.5:1.catppuccin-lattekeeps white oncolor (it's a light theme with darker accents). - Values mirrored into the
themes/*/claude-desktop-bin.jsonreference files. Patch compiles, applies clean, and the output passesnode --check. No upstream-version bump. - Known remaining item (deferred): bold notice-banner / card-section headings (e.g. the "Claude Fable 5 is currently unavailable" title) still read muddy. claude.ai draws those dimmed (reduced opacity / a CDS component token) on surfaces the theme darkens; the token is remote-only and not in the app bundle, so it needs a targeted selector override verified against the live UI - to be tackled in a follow-up.
Fix: enterprise.json / 3p mode broken on Linux since v1.15200.0, plus a class of silent-no-op patch bugs
A user reported enterprise.json "broken" after the v1.15200.0 release: the app hit api.anthropic.com instead of the configured inference gateway, userData stayed in ~/.config/Claude instead of relocating to ~/.config/Claude-3p, and the startup banner had no [custom-3p] lines. Investigating it surfaced a systemic defect class, fixed across several patches.
- Root cause - two compounding defects. (a) A load-bearing patch silently patched nothing. The orchestrator (
scripts/apply_patches.py) stages each@patch-targetinto an isolated tmpfs copy, so a patch can only reliably touch the single file in its@patch-target:header.fix_enterprise_config_linuxcorrectly patchedindex.js(main process) but tried to patchindex.pre.js(the early bootstrap that decides the-3puserData split) as a sibling (parentDir(filePath)/"index.pre.js") - a guaranteed no-op, since the sibling is never next to the staged temp file. So the bootstrap shipped unpatched. (b) Even patched, the Linux reader returned raw JSON. v1.15200 refactored the bootstrap's "is this a managed/3p deployment?" gate to depend on a module-scopedSetthat gets populated only as a side effect of the upstream key-registration function (kW/Hzi), which Windows calls while walking the registry. Our reader returnedJSON.parse(...)directly, bypassing that function, so theSetstayed empty, the gate evaluated false, and 3p never activated (inference stayed onapi.anthropic.com). In v1.14271 the gate checked config keys directly (t.inferenceProvider!==void 0), so the bypass didn't matter then - a textbook "re-validate patches every upstream release" regression. - Fix:
index.pre.jsis now patched by a dedicatedfix_enterprise_config_linux_pre.nimwith its own@patch-target: index.pre.js(first-class orchestrator target,required,quit(1)on miss). The dead sibling block was removed fromfix_enterprise_config_linux.nim. And both readers now route the parsed JSON through the captured key-registration fn -return kW(JSON.parse(...))/Hzi(...)instead of returning it raw - which populates the gateSetand runs the same validation Windows gets (the fn name is captured dynamically from its body, not hardcoded). Verified on a fresh-from-msix v1.15200.0 bundle: the reader is present and routed through the fn in BOTH files, the full patch suite applies clean, and both files passnode --check. - Swept the whole patch suite for the same class. Two other patches had the identical sibling-no-op or a related silent-failure shape:
fix_locale_pathspatchedindex.pre.jsas a sibling too. As of v1.15200.0 the bootstrap no longer referencesprocess.resourcesPath, so there was nothing to patch and no runtime breakage - but the absence-keyed skip could not tell "absent (fine)" from "pattern changed (broken)". Split into a dedicatedfix_locale_paths_pre.nimthat positively asserts the bootstrap state (and rewrites aprocess.resourcesPathif a future version reintroduces one).enable_local_agent_modehad a vestigial "Patch 7" that spoofedwindow.process.platformin the siblingmainView.js. It never applied (same staging no-op) yet its "skipped" branch counted as success, and Cowork/Code work fine without it - the keyboard-shortcut need it was added for is already covered by Patch 8'snavigator.platform="Win32"spoof. Removed it and corrected the patch count (25 -> 24). (mainView.js's realprocess.argvfix is unaffected - it has its own@patch-targetpatch.)
- Hardened three latent guard-robustness defects (all currently correct in v1.15200.0, but would silently ship broken on a future upstream refactor):
fix_asar_workspace_cwdnow asserts each of its 5 IPC-bridge cwd-sanitizers matches exactly once instead of summing match counts across 6 sites (a sum could let an over-match mask a zero-match);fix_dispatch_linuxPatch B (remote-session-control bypass) now keys its "already patched" check on the produced&&!1shape rather than the absence of the old pattern plus a generic error string (CLAUDE.md Rule 6);fix_window_boundsPatch #1 now raises on its own non-match instead of relying on a shared guard that Patch #2 could satisfy. - Added a CI guard (
scripts/check-patch-sibling-noop.sh, wired into thelint-scriptsjob) that fails the build if any patch derives a second file's path from its staged target - so this no-op class cannot silently return. - No upstream-version bump - these are patch-correctness fixes against the same v1.15200.0 bundle. Full orchestrator run is clean (all targets patched,
node --checkpasses).