Skip to content

Claude Desktop 1.19367.0 (patch release 2)

Choose a tag to compare

@github-actions github-actions released this 11 Jul 19:42

Claude Desktop 1.19367.0 (patch release 2)

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-2_amd64.deb
# ARM64
sudo apt install ./claude-desktop-bin_1.19367.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.19367.0-2.x86_64.rpm
# ARM64
sudo dnf install ./claude-desktop-bin-1.19367.0-2.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) 7bda9734f67d54bd866a1f18b267b2417ae758559a1f7d3103ca267086c41f03
Tarball (aarch64) f4f3c80fed5c363efe4a0eab40948c3939560d67ed97c9b23eb7228fbcee5cc0
AppImage (x86_64) 9661b9a00783915e7cdbe5ce16efee7cec3253237a65832e016babb6f84c9a63
AppImage (aarch64) cdc547c5350be543993483481e8480ec3ddac99ad829008f93d261cfcb89ba0d
Debian (amd64) d51eaf342308590543eee12bcc16a3be7fce1e6a728c19a62d89674ab367182d
Debian (arm64) 3c1c9121879a10a7b01afbd0fe4670329fcb4a2a614896c8cf6451780e6753b3
RPM (x86_64) 876884ae5e1842366ccfe032be743a3313bdf8074794a2bf78b066b7919f64f4
RPM (aarch64) 58a46397ed4c343e26cb79cf52b0ec130a1b90d81f5ef25daec1a903d0a6c7df

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.

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