github patrickjaja/claude-desktop-bin v1.15200.0-2
Claude Desktop 1.15200.0 (patch release 2)

7 hours ago

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

Debian/Ubuntu (APT Repository — recommended)

curl -fsSL https://patrickjaja.github.io/claude-desktop-bin/install.sh | sudo bash
sudo apt install claude-desktop-bin

Debian/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.deb

Fedora/RHEL (RPM Repository — recommended)

curl -fsSL https://patrickjaja.github.io/claude-desktop-bin/install-rpm.sh | sudo bash
sudo dnf install claude-desktop-bin

Fedora/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.rpm

NixOS / Nix

nix run github:patrickjaja/claude-desktop-bin

AppImage (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.AppImage

Update existing AppImage (delta download — only changed blocks):

appimageupdatetool Claude_Desktop-*-x86_64.AppImage
# Or from within the AppImage:
./Claude_Desktop-*-x86_64.AppImage --appimage-update

Checksums

File SHA256
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; in nord these were 220 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 for nord/latte/sweet. catppuccin-mocha and catppuccin-macchiato already 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. nord Polar Night 220 16% 15%, Catppuccin Mantle/Crust), giving 5.7-11.5:1. catppuccin-latte keeps white oncolor (it's a light theme with darker accents).
  • Values mirrored into the themes/*/claude-desktop-bin.json reference files. Patch compiles, applies clean, and the output passes node --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-target into an isolated tmpfs copy, so a patch can only reliably touch the single file in its @patch-target: header. fix_enterprise_config_linux correctly patched index.js (main process) but tried to patch index.pre.js (the early bootstrap that decides the -3p userData 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-scoped Set that gets populated only as a side effect of the upstream key-registration function (kW/Hzi), which Windows calls while walking the registry. Our reader returned JSON.parse(...) directly, bypassing that function, so the Set stayed empty, the gate evaluated false, and 3p never activated (inference stayed on api.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.js is now patched by a dedicated fix_enterprise_config_linux_pre.nim with its own @patch-target: index.pre.js (first-class orchestrator target, required, quit(1) on miss). The dead sibling block was removed from fix_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 gate Set and 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 pass node --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_paths patched index.pre.js as a sibling too. As of v1.15200.0 the bootstrap no longer references process.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 dedicated fix_locale_paths_pre.nim that positively asserts the bootstrap state (and rewrites a process.resourcesPath if a future version reintroduces one).
    • enable_local_agent_mode had a vestigial "Patch 7" that spoofed window.process.platform in the sibling mainView.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's navigator.platform="Win32" spoof. Removed it and corrected the patch count (25 -> 24). (mainView.js's real process.argv fix is unaffected - it has its own @patch-target patch.)
  • 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_cwd now 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_linux Patch B (remote-session-control bypass) now keys its "already patched" check on the produced &&!1 shape rather than the absence of the old pattern plus a generic error string (CLAUDE.md Rule 6); fix_window_bounds Patch #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 the lint-scripts job) 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 --check passes).

Links

Don't miss a new claude-desktop-bin release

NewReleases is sending notifications on new releases.