claude-desktop-repack
Health Warn
- License — License: GPL-3.0
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 6 GitHub stars
Code Pass
- Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
Repackages the official Claude Desktop .deb installer for other distros
Attention
This repo will be archived and will not been maintained anymore, because I will switch to Codex. If you want too keep using Claude Desktop on your Linux Distributions checkout patrickjaja/claude-desktop-extra.
Claude Desktop for Linux (repack)
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.
Why
Worth using even if an official build already runs on your distro:
- The formats Anthropic doesn't ship. They release Linux only as a
.debfor
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. - GNOME-on-Wayland fixes that help everyone, including Debian/Ubuntu. Two of the
patches fix bugs the official build has on GNOME Wayland on any distro: the
global Quick Entry hotkey (broken by a Chromium portal bug) works again via a
socket +claude-desktop-hotkey, and the transparent Quick Entry overlay gets
its ownWM_CLASSso shell extensions can exclude just it without touching the
main window. - Cowork on non-Debian distros. Two more patches fix the VM firmware-path lookup
and the dependency-install hint so Cowork works on Fedora / Arch / openSUSE too.
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-extra:
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.
Install
The recommended way is a signed repo with automatic updates. All one-liners are
also on the install page.
Fedora / RHEL (dnf)
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.)
openSUSE (zypper)
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
Arch / Manjaro / EndeavourOS (pacman)
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
Debian / Ubuntu (apt)
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.
AppImage (any glibc distro, self-updating)
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.
Nix / NixOS (flake)
NIXPKGS_ALLOW_UNFREE=1 nix profile install --impure github:boommasterxd/claude-desktop-repack
# or: inputs.claude-desktop-repack.url = "github:boommasterxd/claude-desktop-repack";
Direct download
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
Verify
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
What it repackages
| 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) staysclaude-desktop, indistinguishable from the official build.
GPU / Wayland launcher workaround
On some GPU + kernel-driver + compositor combinations (see
#66 - Intelxe 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.
Patches
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. One more
(os-entry-points-desktop-id) keeps the launcher jump-list actions working under
this repack's stable desktop-entry filename. The app itself runs unmodified
everywhere; these only fill in the Linux/distro gaps the official Debian build
leaves.
Quick Entry hotkey (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 window name (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 VM firmware paths (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 dependency hint (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.
OS entry points desktop id (os-entry-points-desktop-id)
The app can augment its Linux launcher entry with extra Desktop Actions (New
Chat, New Claude Code Session, Continue Last Session, Sessions Waiting for You),
shown as a jump list by launchers/file managers that support XDG Desktop
Actions. To do that it reads back its own installed .desktop file from/usr/share/applications/, hard-coding upstream's current filename
(com.anthropic.Claude.desktop).
This repack installs that file as claude-desktop.desktop instead, so its
filename stays stable across upstream's own desktop-entry renames (as happened
once already, at 1.19367.0). Without this patch the hard-coded read never
matches what's actually installed, and the feature silently no-ops. This patch
repoints it at claude-desktop.desktop, matching the file this repack actually
installs.
Contributing
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 machinesAPPIMAGE_EXTRACT_AND_RUN=1. Building locally (no GITHUB_REPOSITORY set) skips
the AppImage update-info and .zsync, which is expected.
Writing a patch
A patch is a small ES module in patches/ that exports name, description, andapply(code) -> code. It is auto-discovered by patches/index.mjs, applied byscripts/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:
- Match exactly one occurrence. Collect all matches (
[...code.matchAll(re)])
andthrowunless there is exactly1. 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. - Never hardcode a minified name; match it with
[\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. - Anchor only on things upstream is unlikely to rename. String literals, public
API / property / method names (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. - Keep the pattern as short and specific as possible. Match the smallest slice
that uniquely identifies the site. Long literal runs of minified code are brittle;
a couple of stable anchors plus[\w$]+bridges are not. Prefer a narrow context
over a broad one, so you don't accidentally become non-unique on the next release. - Assert your end-state after replacing. Check the injected marker (or the
behaviour you guarantee) is actually present in the output andthrowif 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. - Fail loud, never guess. On any mismatch
throw.patch-payload.mjsprintsPATCH-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 atry/catchor 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.
Opening a PR
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.
Disclaimer
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.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found