Are you the author? Sign in to claim
Repackages the official Claude Desktop .deb installer for other distros
Anthropic's official Claude Desktop, repackaged for the distros they don't ship, with signed install repos and automatic updates.
This repo takes Anthropic's official Linux .deb and re-wraps it, unmodified
except for a few small Linux patches, into every format the other
distros expect, published as a signed GitHub Release and served from signed
install repos with real upgrade-style updates. A scheduled GitHub Action
rebuilds it automatically whenever Anthropic ships a new version, all verified
against one GPG key.
Not affiliated with or endorsed by Anthropic. Source of truth: https://claude.com/download. See the Disclaimer below.
Worth using even if an official build already runs on your distro:
.deb for
Debian/Ubuntu, so Fedora, RHEL, openSUSE, Arch, NixOS and portable AppImage users
are left out. This fills every gap, with signed repos and automatic updates.claude-desktop-hotkey, and the transparent Quick Entry overlay gets
its own WM_CLASS so shell extensions can exclude just it without touching the
main window.See Patches for the details on all four.
Scope: this ships the app as Anthropic ships it, plus the small functional fixes above; it deliberately does not unlock features Anthropic gates off on Linux.
If you want the full experience, definitely check out patrickjaja/claude-desktop-bin: it patches a whole set of Linux-only extras to life, including Computer Use, custom themes, multiple side-by-side profiles, Recent Projects, Open in VS Code / Cursor / Zed, Hardware Buddy and more.
Huge thanks to @patrickjaja for that excellent work, which paved the way for this project. Go give it a look and a star.
The recommended way is a signed repo with automatic updates. All one-liners are also on the install page.
sudo curl -fsSL -o /etc/yum.repos.d/claude-desktop-repack.repo https://boommasterxd.github.io/claude-desktop-repack/rpm/claude-desktop-repack.repo
sudo dnf install claude-desktop-repack # then: sudo dnf upgrade
(Works on both dnf5 and dnf4. The old dnf config-manager --add-repo was dropped
in dnf5 / Fedora 41+, so we just drop the .repo file in directly.)
sudo zypper addrepo -f https://boommasterxd.github.io/claude-desktop-repack/rpm/claude-desktop-repack.repo
sudo zypper --gpg-auto-import-keys refresh
sudo zypper install claude-desktop-repack
curl -fsSL https://boommasterxd.github.io/claude-desktop-repack/RELEASE-PUBKEY.asc | sudo pacman-key --add -
sudo pacman-key --lsign-key 2874A3CDE4A67DD1
printf '\n[claude-desktop-repack]\nSigLevel = Required\nServer = https://boommasterxd.github.io/claude-desktop-repack/arch/$arch\n' | sudo tee -a /etc/pacman.conf
sudo pacman -Sy claude-desktop-repack
curl -fsSL https://boommasterxd.github.io/claude-desktop-repack/RELEASE-PUBKEY.asc | gpg --dearmor | sudo tee /usr/share/keyrings/claude-desktop-repack.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/claude-desktop-repack.gpg] https://boommasterxd.github.io/claude-desktop-repack/deb stable main" | sudo tee /etc/apt/sources.list.d/claude-desktop-repack.list
sudo apt update && sudo apt install claude-desktop-repack
Anthropic's official apt repo is also a fine choice on Debian/Ubuntu.
Download the .AppImage from the latest release,
chmod +x, and run it. Add it to GearLever
and it updates itself via the embedded zsync info, downloading only the changed
blocks, never the whole file again.
NIXPKGS_ALLOW_UNFREE=1 nix profile install --impure github:boommasterxd/claude-desktop-repack
# or: inputs.claude-desktop-repack.url = "github:boommasterxd/claude-desktop-repack";
Every format is also a plain release asset:
sudo dnf install ./claude-desktop-repack-*.x86_64.rpm # rpm
sudo pacman -U ./claude-desktop-repack-*-x86_64.pkg.tar.zst # arch
sudo apt install ./claude-desktop-repack_*_amd64.deb # deb
chmod +x claude-desktop-repack-*-x86_64.AppImage && ./claude-desktop-repack-*-x86_64.AppImage
tar xzf claude-desktop-repack-*-linux.tar.gz && ./claude-desktop-repack-*/claude-desktop
Every release ships RELEASE-PUBKEY.asc + SHA256SUMS.txt.asc; the rpm packages
and all repo metadata are GPG-signed with the same key.
gpg --import RELEASE-PUBKEY.asc
gpg --verify SHA256SUMS.txt.asc SHA256SUMS.txt && sha256sum -c SHA256SUMS.txt
| Format | Arches | For |
|---|---|---|
| RPM + dnf repo | x86_64, aarch64 | Fedora / RHEL / openSUSE |
pacman .pkg.tar.zst + repo | x86_64, aarch64 | Arch / Manjaro / EndeavourOS |
| .deb + apt repo | amd64, arm64 | Debian / Ubuntu |
AppImage + .zsync | x86_64, aarch64 | any glibc distro |
| tarball | x86_64, aarch64 | generic / portable |
| Nix flake | x86_64, aarch64 | NixOS / Nix |
Package name: claude-desktop-repack (so dnf/apt/pacman show it as ours);
app identity (binary, .desktop, icon, WM_CLASS, claude:// handler) stays
claude-desktop, indistinguishable from the official build.
On some GPU + kernel-driver + compositor combinations (see
#66 - Intel
xe on GNOME Wayland), Electron's Ozone/Wayland GPU-process init fails
repeatedly and Chromium self-aborts (GPU process isn't usable. Goodbye.,
exit SIGTRAP). That's an upstream Electron/Chromium/Mesa interaction, not
something a repack can fix outright - but every packaged format execs the real
Electron binary through a launcher (packaging/launcher/claude-desktop-launcher
for rpm/deb/Arch; the tarball/AppImage/Nix builds' own wrappers) that reads
three opt-in env vars, so you do not have to invoke claude-desktop with raw
flags by hand:
| env var | effect | when to use it |
|---|---|---|
CLAUDE_GPU_BACKEND=angle-gl | --use-gl=angle --use-angle=gl | try first: usually clears the GPU-process crash while keeping GPU acceleration |
CLAUDE_USE_XWAYLAND=1 | --ozone-platform=x11 | if that isn't enough: run under XWayland instead of native Wayland |
CLAUDE_DISABLE_GPU=full | --disable-gpu | last resort: software rendering, guaranteed not to crash |
CLAUDE_GPU_BACKEND=angle-gl claude-desktop
None are set by default, so unaffected setups see no change. To apply one
whenever you launch from the app grid, edit the Exec= line of
/usr/share/applications/claude-desktop.desktop, e.g.
Exec=env CLAUDE_GPU_BACKEND=angle-gl claude-desktop %U.
The only changes to the app are a few small patches applied to app.asar at build
time by scripts/patch-payload.mjs (regex on the minified index.js). The
Electron binary and native modules are never touched. If a patch ever stops
matching after an upstream change, the build fails and opens an issue naming the
patch, so a broken patch is never shipped silently.
Two of them (quick-entry-cli-toggle, quick-entry-app-id) address gaps specific
to GNOME on Wayland; on X11 and other compositors the official build already
behaves correctly. Two more (cowork-firmware-paths, cowork-install-hint) make
Cowork work and its dependency hint correct on non-Debian distros. The app itself
runs unmodified everywhere; these only fill in the Linux/distro gaps the official
Debian build leaves.
quick-entry-cli-toggle)The official build's global Quick Entry hotkey does not work on GNOME Wayland: it
goes through Chromium's GlobalShortcuts portal, which is broken for non-sandboxed
apps on xdg-desktop-portal 1.20+ (see
electron/electron#51875).
This patch exposes the app's own Quick Entry toggle over a Unix socket. The
packages ship a small claude-desktop-hotkey command; it pokes that socket to
open/close Quick Entry in ~5-25 ms. Bind it to a native GNOME shortcut:
claude-desktop-hotkey --install # binds Ctrl+Alt+Space
# custom key: CLAUDE_QE_ACCEL='<Super>space' claude-desktop-hotkey --install
# remove: claude-desktop-hotkey --uninstall
(claude-desktop-hotkey is installed in PATH by the RPM and .deb. Running it
with no arguments toggles Quick Entry; pressing the bound key does the same.)
quick-entry-app-id)The Quick Entry window is a transparent, frameless overlay: only the small input pill is drawn, the rest of the window is transparent. GNOME extensions that add rounded corners and a drop shadow (Rounded Window Corners Reborn, Unite, ...) paint an opaque rounded rectangle behind every window. On the transparent Quick Entry that rectangle shows through, so instead of just the pill you see a large opaque box with the pill floating in its corner.
Those extensions can exclude windows by WM_CLASS / Wayland app_id, but
Electron assigns one app_id per process, so the main Claude window and the Quick
Entry window both report claude and cannot be told apart, you would have to
disable the effect on the main window too.
This patch gives the Quick Entry window its own WM_CLASS,
claude-quick-entry, so you can exclude just it. In Rounded Window Corners
Reborn: open its settings, go to Blacklist, and add:
claude-quick-entry
The main Claude window keeps its rounded corners and shadow; only the transparent
Quick Entry overlay is excluded. Other extensions (Unite, Blur my Shell, ...)
have the same kind of per-WM_CLASS blacklist.
cowork-firmware-paths)Cowork runs its agent workspace inside a QEMU/KVM VM that needs OVMF (UEFI)
firmware and virtiofsd. The official Debian .deb hard-codes Debian-only paths
(/usr/share/OVMF/..., /usr/{libexec,bin}/virtiofsd), so on distros that ship
the firmware elsewhere the VM capability probe returns unsupported and the
Cowork Download button stays inert.
This patch appends the non-Debian search paths (Fedora/RHEL
/usr/share/edk2/ovmf/, Arch /usr/share/edk2/x64/, plus /usr/lib/virtiofsd)
to the probe's candidate lists. Debian paths are kept first, so Debian/Ubuntu
behaviour is byte-for-byte unchanged. You still need the VM dependencies
installed:
# Fedora / RHEL
sudo dnf install qemu-kvm edk2-ovmf virtiofsd
# Arch
sudo pacman -S qemu-full edk2-ovmf virtiofsd
Notes: on x86_64 Fedora a compatibility symlink at /usr/share/OVMF/ often makes
Cowork work even without this patch, but Arch, arm64 and others need it. openSUSE
(firmware named *-code.bin) needs a different VARS-file rule and is a known gap.
cowork-install-hint)When those Cowork dependencies are missing, the app shows a copy-paste install
command. Upstream hard-codes the Debian one (sudo apt install ... with Debian
package names), which is wrong on other distros. This patch wraps it in a tiny
runtime translator: on Debian/Ubuntu it is returned unchanged, otherwise the first
of dnf/pacman/zypper found rewrites the manager and package names for that
distro. Cosmetic and fully guarded: any failure falls back to the original string.
Contributions are welcome. Build the packages locally into ./dist:
npm ci # once: installs @electron/asar
bash scripts/build-local.sh # all formats, host arch
bash scripts/build-local.sh amd64 rpm # just one format/arch
build-deb.sh needs dpkg-deb (on Fedora: sudo dnf install dpkg);
build-appimage.sh needs zsync/zsyncmake, and on FUSE-less machines
APPIMAGE_EXTRACT_AND_RUN=1. Building locally (no GITHUB_REPOSITORY set) skips
the AppImage update-info and .zsync, which is expected.
A patch is a small ES module in patches/ that exports name, description, and
apply(code) -> code. It is auto-discovered by patches/index.mjs, applied by
scripts/patch-payload.mjs, then the result is run through node --check, so
there is nothing else to wire up:
// patches/my-fix.mjs
export const name = "my-fix";
export const description = "one line, shown in the release notes";
export function apply(code) {
const pattern = /("some-stable-string-literal":)([\w$]+)/g; // see rules below
const matches = [...code.matchAll(pattern)];
if (matches.length !== 1) { // exactly one
throw new Error(`my-fix: expected 1 match, found ${matches.length}`);
}
const out = code.replace(pattern, (_m, key, id) => `${key}patched_${id}`);
if (!out.includes("patched_")) { // assert result
throw new Error("my-fix: injection marker missing after replace");
}
return out;
}
The patches run as regex over Anthropic's minified index.js, so every
upstream release can rename every local identifier and re-shuffle the code. The
whole difficulty is writing a match that still hits exactly the one spot you
mean after a re-minify, and fails loudly the moment it no longer does. Rules that
make that hold:
[...code.matchAll(re)])
and throw unless there is exactly 1. A pattern that quietly matches 0 (silent
no-op) or 2+ (patches an unrelated site) is the main way these break. Never use a
bare .replace() whose success you don't count.[\w$]+. Minified identifiers
are short, unstable, and can contain $ (e.g. F$e, $S) - bare \w+ silently
fails to match those. Capture the name and reuse it in the replacement instead of
assuming what it is.getPrimaryDisplay, app_id, socket paths),
enum members, error messages. Do not anchor on the exact expression shape,
variable order, or whitespace unless the structure is genuinely required for the
injection - that is exactly what re-minification perturbs.[\w$]+ bridges are not. Prefer a narrow context
over a broad one, so you don't accidentally become non-unique on the next release.throw if not.
"The old pattern is gone" is not proof the new behaviour is in - those diverge
the instant upstream refactors. Verify the thing you added, not the absence of the
thing you removed.throw. patch-payload.mjs prints
PATCH-FAILURE version=<v> failed=<name> and exits 1, which fails CI and (in the
release workflow) opens a per-version issue naming your patch. A broken patch is
never shipped silently - a loud failure is the desired outcome, not something to
paper over with a try/catch or an "already patched" shortcut.To pull the current minified bundle out of a fetched payload and iterate against the real code:
node -e 'const a=require("@electron/asar"); require("fs").writeFileSync("/tmp/index.js", a.extractFile("PAYLOAD/usr/lib/claude-desktop/resources/app.asar", ".vite/build/index.js"))'
Add a ### ... subsection to the Patches section above so the change is
documented for users.
PRs target main, which is protected: the CI and gitleaks checks must pass
before merge. Use Conventional Commit titles
(fix(patches): ..., feat: ..., docs: ...) - PRs are squash-merged, so the PR
title becomes the commit on main and drives the grouped release-notes changelog.
This is an unofficial, community-maintained project. It exists purely for convenience and interoperability, so that Anthropic's official Linux build can be installed on the distributions and package formats it is not officially shipped in. It is not affiliated with, endorsed by, or sponsored by Anthropic.
What this repository contains. Only build scripts, packaging metadata, and a small set of Linux compatibility patches. It does not contain, redistribute, or vendor the Claude Desktop application itself. During the build the upstream package is downloaded directly from Anthropic's official distribution, its SHA256 is verified against Anthropic's own apt index, and it is repackaged unmodified except for the documented patches. The Electron runtime and all native modules are left untouched.
Proprietary software and terms. Claude Desktop is proprietary software owned by Anthropic PBC. Your use of the application stays subject to Anthropic's own terms and policies (their Terms of Service, Usage Policy, and any applicable licenses). Installing it through this repackage grants you no additional rights to the application and does not change Anthropic's terms; if those terms and this project ever conflict, Anthropic's terms govern your use of the app.
Trademarks. "Claude" and "Anthropic" are trademarks of Anthropic PBC. They are used here only nominatively, to identify the software this project repackages; no affiliation or endorsement is implied. All trademarks are the property of their respective owners.
Licensing. The GPL-3.0 license in this repository covers only the contents of this repository (the build scripts, packaging, and patches). It does not apply to the Claude Desktop application, which remains under Anthropic's proprietary license.
No warranty. This project is provided "as is", without warranty of any kind, to the extent permitted by law. The maintainers are not liable for any issue arising from installing or running the repackaged application. Bugs in the app itself (as opposed to the packaging) belong to Anthropic and should be reported to them, not here.
Rights holders. This project only helps Linux users install software they are already entitled to run. If you represent Anthropic and have any concern about anything in this repository, please open an issue and we will respond promptly.
⚠️ Experimentelle Skill-Sammlung für deutsches Recht (Arbeits-, Gesellschafts-, Insolvenz-, Datenschutz-, Prozessrecht u
Manage multiple Claude Code agents from TUI or Web with tmux and git worktrees
Project management using GitHub Issues + Git worktrees for parallel agent execution
Core skills library for Claude Code with 20+ battle-tested skills including TDD, debugging, and brainstorming