github patrickjaja/claude-desktop-bin v1.19367.0-3
Claude Desktop 1.19367.0 (patch release 3)

2 hours ago

Claude Desktop 1.19367.0 (patch release 3)

This release provides Claude Desktop version 1.19367.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.19367.0-3_amd64.deb
# ARM64
sudo apt install ./claude-desktop-bin_1.19367.0-3_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.19367.0-3.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-bin-1.19367.0-3.aarch64.rpm

NixOS / Nix

nix run github:patrickjaja/claude-desktop-bin

AppImage (Any Distro)

# x86_64
chmod +x Claude_Desktop-1.19367.0-x86_64.AppImage
./Claude_Desktop-1.19367.0-x86_64.AppImage
# ARM64
chmod +x Claude_Desktop-1.19367.0-aarch64.AppImage
./Claude_Desktop-1.19367.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) c76d8e46dfb156ffffbb5e51310eba3e4eb9448433f3e3d2ec61ff3c1f38a448
Tarball (aarch64) db36f55767f11d392e5292e483c2351f2443514eff1d5f15deac1d1e2e1f91c9
AppImage (x86_64) d03433a0c45fef0425adae965a5b3f9247cdf991e1949602465510c2f5c443da
AppImage (aarch64) b8f66f96c84c77dd3370f4c77dc512388bc3b75e47d79cd051c37cd0a81334fc
Debian (amd64) 5898b32b3b929513a48112255c22e90ba31f31405b6c77f0093d50154fc5058b
Debian (arm64) c00f9e4f9b07e29f25e148985f3ce6f645a861bed3118ede86985070eed77a6a
RPM (x86_64) d7ff095d487946024d8f7039ec4b2efeab70a7276af0394a8c33fb9e35299a18
RPM (aarch64) 9966c68e55501179e96e7a79bea3c82e7fb94ce183d78082b185b13366aa85f1

Changes since last release

v1.19367.0: upstream code-split the main bundle - orchestrator now patches stub + chunks as one logical file

Upstream restructured the app: .vite/build/index.js went from a 15 MB monolith to a 773-byte loader stub, with the real main-process code in ~44 content-hashed index.chunk-<hash>.js siblings, and index.pre.js (now the package.json entry point) grew to 4.5 MB. Chunk hashes change every release, so no patch can target them by name. Every pattern-matching patch 0-matched and the auto-release failed (#187).

The fix is in the patch orchestrator, not in 40 regexes: apply_patches.py (and validate-patches.sh) now stage the stub plus all sibling chunks as one concatenated file with boundary markers, run every index.js patch against it, then split it back and write each file. Patches keep their @patch-target: .../index.js headers and their strict aggregate match counts work across the whole logical bundle exactly as on the old monolith; a corrupted boundary fails the build loudly, and each split file is node --checked. This proved necessary beyond convenience: fix_asar_workspace_cwd's five anchor sites now span two different chunks.

31 of 40 patches applied verbatim on the concatenation. Nine needed real fixes, almost all one shared root cause: the code-split minifier turned module-local identifiers into dotted cross-chunk member paths that [\w$]+ cannot match - the main window is now exports.mainWindow (fix_window_bounds, fix_profile_window_title, fix_quick_entry_cli_toggle), loggers are n.logger.info (fix_asar_workspace_cwd), and flag reads are p.isFeatureEnabled("...") instead of rt("...") (fix_imagine_linux, fix_buddy_ble_linux, enable_local_agent_mode - the latter's standalone flag matchers would otherwise have produced dangling l.!0 syntax errors). The remaining drifts were minifier hoisting (var r; before the folder-drop handler in fix_asar_folder_drop) and a renamed tray icon variable (fix_tray_icon_theme). SSH plugin/MCP forwarding remains unconditional upstream (regression guard re-anchored, satisfied).

Two latent pre-existing bugs were found and fixed along the way: fix_quick_entry_cli_toggle's second-instance argv sub-patch reported "already applied" on pristine bundles because its idempotency probe matched a sibling sub-patch's own injected text (it now checks the real end-state and genuinely applies), and fix_buddy_ble_linux reported success on files containing no buddy code at all (absence now fails loud).

v1.19367.0: desktopName pinned to claude-desktop.desktop (upstream renamed to com.anthropic.Claude.desktop)

Upstream renamed its desktopName to com.anthropic.Claude.desktop, matching the .desktop file the official .deb installs. Chromium derives the window's Wayland app_id / X11 WM_CLASS from that value, and every .desktop entry we ship (Arch/deb/rpm/AppImage/Nix, the launcher's per-profile entries, StartupWMClass, the claude:// xdg-mime handler) is built around the claude-desktop identity - the window-to-icon matching fixed in #148 would have silently broken on Wayland. The tarball build now pins desktopName back to claude-desktop.desktop after extraction (the JS bundle references neither name, so the pin is safe) and fails loud if the key ever disappears.

New: local feature-flag overrides via claude-desktop-bin.jsonc (shared with themes)

New patch add_growthbook_overrides.nim: Claude Desktop's GrowthBook flags are served by Anthropic with no local override layer (the fcache disk cache is encrypted), so the only way to flip a flag used to be a binary patch. Now every flag load (startup, the ~hourly refresh, account changes) runs through a hook that merges a growthbookOverrides map from the local config over the freshly loaded feature map - user overrides win over the server rollout, applied on a copy so the raw payload and its disk cache stay untouched. Uncommenting a line is all it takes; changes apply on the next refresh without a restart, and active overrides are logged to claude-patches.log. Booleans flip switches; numbers/strings/objects set value flags.

The config is the same file custom themes already use, now under a .jsonc-first scheme: ~/.config/Claude/claude-desktop-bin.jsonc is the documented home going forward, and a legacy claude-desktop-bin.json keeps working - both files are JSONC-parsed and merged per key with .jsonc winning, themes maps merged per name. The theme reader was taught the same comment-tolerant dual-file parsing, so nothing breaks for existing theme configs and both features can live in one file. The auto-created template is a full catalog: all 110 GrowthBook flags observed being read from the feature store in v1.19367.0, each commented out with a description (from the baseline flag docs where catalogued), dangerous entries marked (hostLoopMode carries a DO-NOT-ENABLE warning), value flags and inverted/inert gates annotated. Flags our patches force at the call site are excluded from the list since they bypass the store. The same catalog also ships as a browsable file, docs/claude-desktop-bin.jsonc, linked from the README; a CI guard (scripts/check-jsonc-template-sync.sh) fails the build if that file ever drifts from the template the app actually writes.

Deliberate scope: flags our patches force at the call site (the Code/Cowork/Computer Use enablement set) never consult the store, so this file cannot accidentally disable the Linux enablement; and server-side account capabilities remain out of reach by design. The immediate use case: anyone who wants tool search back after the ENABLE_TOOL_SEARCH change below can set "1129419822": true themselves.

Local agent sessions: stop forcing ENABLE_TOOL_SEARCH (Patch 3f disabled)

enable_local_agent_mode.nim no longer forces GrowthBook flag 1129419822 (ENABLE_TOOL_SEARCH='auto' for local agent sessions); the flag now follows Anthropic's server-side rollout. Forcing it put a ToolSearch tool into every Cowork/Code session, but with a session inventory of ~79 tools nothing was ever deferred, so the tool had nothing to load - and its mere presence primed the model into a bogus "load tools first" detour (observed in a live session: Skill({"skill":"ToolSearch"}) -> "Unknown skill" error, one wasted turn before recovering). All computer-use and MCP tools were always fully loaded; removing the force removes the confusion surface without losing anything.

v1.19367.0: what else changed upstream

The bundle actually shrank 1.7 MB - the old build double-shipped agent-sdk (0.3.198 + 0.3.202), the new one ships only 0.3.202. Electron stays 42.5.1; the built-in MCP server set, the Cowork VM backend files, and the CU platform gates are unchanged. No newly darwin/win32-gated features exclude Linux; the new file-index-worker (fuzzy file scorer) and coworkScheduledTaskProjects capability are ungated and work on Linux natively. Three new GrowthBook flags (session-concurrency limits, device-tool artifact read gate, GPU crash-streak marker) - none patch-relevant; all 13 flags forced by enable_local_agent_mode are unchanged. ion-dist needed no patch changes (one new config key upstream: inferenceFoundryAuthFlow for Entra ID device-code vs browser sign-in). Eleven new IPC channels landed (LocalSessions remote-target trust/WSL/cwd handling, a DocumentFunnel bridge, Extensions.isLocalExtensionInstallAllowed), none removed. One structural caveat for future audits, now noted in the baseline docs: minified helper names differ per chunk (the flag reader is rt() in the big chunk but isFeatureEnabled() in smaller ones), so greps must cover all index*.js files.

Links

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

NewReleases is sending notifications on new releases.