Skip to content

Cowork VM bundle checksums in manifest drift from CDN, causing download loop #334

@relica-ai

Description

@relica-ai

Problem

The Linux x64 VM bundle manifest checksums injected by patch_cowork_linux() (Patch 4 in build.sh) become stale when Anthropic updates the VM files on their CDN. This causes Cowork to enter an infinite download retry loop:

[Bundle:status] rootfs.vhdx missing
rootfs.vhdx not found, downloading...
Downloading rootfs.vhdx...
[download] VM download failed: Checksum mismatch for rootfs.vhdx.zst: 
  expected a829fe446f24..., got 1d49e23b4cce...

The app downloads the file successfully but rejects it because the hardcoded checksum doesn't match. This repeats for each file (rootfs.vhdx, vmlinuz, initrd) and the app never reaches the startVM/isGuestConnected stage.

Root cause

Patch 4 in build.sh computes SHA-256 checksums of the VM bundle files at build time and injects them into the app.asar manifest. When Anthropic updates the files on downloads.claude.ai, the checksums in the already-built .deb become stale.

Current workaround

Manually replacing the checksums in app.asar using sed:

sudo chattr -i /usr/lib/claude-desktop/node_modules/electron/dist/resources/app.asar

# For each mismatched file (rootfs.vhdx, vmlinuz, initrd):
sudo sed -i 's/OLD_CHECKSUM/NEW_CHECKSUM/g' \
  /usr/lib/claude-desktop/node_modules/electron/dist/resources/app.asar

sudo chattr +i /usr/lib/claude-desktop/node_modules/electron/dist/resources/app.asar

The actual checksums from CDN errors can be found in ~/.config/Claude/logs/cowork_vm_node.log.

Suggested fixes

  1. For bwrap users (default backend): The bwrap backend doesn't use rootfs.vhdx/vmlinuz/initrd at all. The manifest could inject an empty files array for Linux so no download is attempted. The download happens unconditionally in the app-side code before the daemon backend is even selected.

  2. For all users: The build script could fetch the current checksums from the CDN at build time rather than computing them from local files that may be from a different version. Alternatively, a post-install hook or launcher wrapper could verify and update checksums on launch.

  3. Nightly rebuild: PR fix: disable GPU compositing for XRDP/VNC sessions + nightly update scripts #320 proposes nightly rebuilds which would naturally pick up new checksums, but doesn't solve the problem between rebuilds.

Environment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingcoworkRelated to Cowork modepriority: highImportant, should be addressed soontriage: investigatedIssue has been triaged and investigated

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions