Skip to content
This repository was archived by the owner on Aug 30, 2026. It is now read-only.

Repository files navigation

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.

CI Downloads License

release dnf pacman apt appimage tarball

Install page  ·  Releases  ·  Report a bug

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 .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.
  • 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 own WM_CLASS so 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) stays claude-desktop, indistinguishable from the official build.

GPU / Wayland launcher workaround

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.

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 machines APPIMAGE_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, 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:

  • Match exactly one occurrence. Collect all matches ([...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.
  • 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 and 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.
  • Fail loud, never guess. On any mismatch 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.

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.

About

Repackages the official Claude Desktop .deb installer for other distros

Topics

Resources

Security policy

Stars

6 stars

Watchers

2 watching

Forks

Releases

Used by

Contributors

Languages