Migrate Claude Desktop to Anthropic's official APT repo (fixes the coder-xfce-vnc build) #19
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "0-migrate-official-claude-desktop"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why the build is red
The
coder-xfce-vncbuild has failed on every branch since 2026-07-22, includingmaster. The cause is not in this repo.Anthropic released an official Claude Desktop for Linux beta and took the
claude-desktoppackage name with it. The community claude-desktop-debian repack this image used therefore renamed itself toclaude-desktop-unofficial, leavingclaude-desktopbehind as a 624-byte transitional dummy that merely depends on the new name.So
apt-get install claude-desktopstill succeeded — it pulled the dummy — and the very next assertion failed:testprints nothing on failure, which is exactly why the CI log ends with no error text at all:Every path the block asserted (
/usr/bin/claude-desktop,claude-desktop.desktop,/usr/lib/claude-desktop/) moved to a-unofficialname.Why migrate rather than chase the rename
The rename is the migration signal — the community project stepped aside because Anthropic now ships this officially.
Both repos package the same upstream Electron app, and the official repo is at the same version the community repack wraps (
1.24012.0), with an identicalDepends:list. So this is a supply-chain change, not a functional one: same app, signed by Anthropic, one fewer third-party repo and keyring.What the switch required
/usr/bin/claude-desktopstraight to the bundled Electron binary. The community repack shipped a shell launcher there that did its own environment setup; nothing does that now. The wrapper is consequently the only placeELECTRON_DISABLE_SANDBOX=1and--disable-dev-shm-usageget applied. The deb's setuid-rootchrome-sandboxhelper and AppArmor userns profile don't help in an unprivileged pod —allowPrivilegeEscalation=falsemakes setuid a no-op, and loading AppArmor policy needs privileges the pod lacks.com.anthropic.Claude.desktop, and itsExecis the bare, PATH-resolvedclaude-desktoprather than an absolute path. The wrapper in/usr/local/bintherefore shadows every launch path on its own — which also makes the wrapper's absolute/usr/bintarget load-bearing rather than stylistic: an unqualified call there would re-resolve to the wrapper onPATHand recurse forever. The entry also carriesNewChat/NewCodeactions, so thesedrewrites all threeExeclines and those launcher actions get the pod flags too.coder-init-desktop.sh's stale-entry healer now checks all three entry names a long-lived PVC can carry (claude-desktop.desktop,claude-desktop-unofficial.desktop,com.anthropic.Claude.desktop) and matches only absolute-pathExecs, so Anthropic's own bareExec=claude-desktop— which already resolves to the wrapper — is correctly left alone.Verification
The
RUNstep was extracted from the Dockerfile verbatim and executed in anubuntu:24.04pod on the cluster:31DD…CACEapt-get install claude-desktoptest -x "$(readlink -f /usr/bin/claude-desktop)"/usr/lib/claude-desktop/claude-desktopgrep -q '^Exec=/usr/local/bin/claude-desktop'grep -q '^Categories=Development;'The healer regex was unit-tested against 10 cases (5 bypass forms that must be parked, 5 wrapper-routed/custom forms that must be left alone) — all correct.
shellcheckis clean on both modified scripts.Not verified: rendering inside the VNC session, which needs a real desktop. It's the same Electron build as the package already in use, so
ELECTRON_DISABLE_SANDBOX=1should behave identically — but that is inference, not proof. Worth a smoke test once the image lands.Note for other branches
masteris red for this same reason, so this should land before rebasing anything else. #18 is unaffected on its own merits — it just inherited the failure.Beta caveats inherited from upstream: no Computer Use, no dictation, Debian-based distros only.