Re-add the exact Electron version pin that #586 had, hoisted to a named local in scripts/setup/dependencies.sh so the next bump is intentional. Upstream Claude Desktop's app.asar binds to a specific V8/NAPI ABI, Chromium pairing, and node-pty native surface; running a different Electron major against it is unsupported and was the reproducibility hole left when this PR dropped the ^41 pin. Also: - Wrap node fetch-electron-binary.js in a 2-attempt retry so a transient 503 from electron's CDN doesn't red the whole build. - Whitelist supported archs (x64, arm64, armv7l, ia32) with an actionable error in fetch-electron-binary.js, instead of 404'ing on electron's release server for exotic-arch hosts. - Document ELECTRON_MIRROR / ELECTRON_CUSTOM_DIR in docs/BUILDING.md and clarify that ELECTRON_CACHE is NOT honored by @electron/get (the original PR body's claim was wrong). Refs #584. Addresses self-review feedback on #587. Co-Authored-By: Claude <claude@anthropic.com>
5.7 KiB
Building from Source
Prerequisites
- Linux distribution (Debian/Ubuntu, Fedora/RHEL, or other)
- Git
- Basic build tools (automatically installed by the script)
Build Instructions
# Clone the repository
git clone https://github.com/aaddrick/claude-desktop-debian.git
cd claude-desktop-debian
# Build with auto-detected format (based on your distro)
./build.sh
# Or specify a format explicitly:
./build.sh --build deb # Debian/Ubuntu .deb package
./build.sh --build rpm # Fedora/RHEL .rpm package
./build.sh --build appimage # Distribution-agnostic AppImage
./build.sh --build nix # Nix derivation (patch only, used by flake)
# Build with custom options
./build.sh --build deb --clean no # Keep intermediate files
# Build using a locally downloaded installer
# (useful when the bundled download URL is outdated)
./build.sh --exe /path/to/Claude-Setup.exe
The build script automatically detects your distribution and selects the appropriate package format:
| Distribution | Default Format | Package Manager |
|---|---|---|
| Debian, Ubuntu, Mint | .deb |
apt |
| Fedora, RHEL, CentOS | .rpm |
dnf |
| NixOS | nix |
nix |
| Arch Linux | .AppImage (via AUR) |
yay/paru |
| Other | .AppImage |
- |
Build Environment Variables
The build pulls the Electron prebuilt binary from github.com/electron/electron/releases via @electron/get. Two upstream environment variables let you redirect that fetch:
ELECTRON_MIRROR— base URL to fetch Electron releases from instead of GitHub. Useful for mirrors or local proxies. Example:ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/.ELECTRON_CUSTOM_DIR— overrides the path segment after the mirror. Defaults tov{version}.
The cache location is fixed at ~/.cache/electron/ (resolved by @electron/get via envPaths) and is reused across builds. ELECTRON_CACHE is not read by @electron/get — set ELECTRON_MIRROR if you need to avoid the public CDN.
The pinned Electron version lives in scripts/setup/dependencies.sh (electron_version) and must match build-reference/app-extracted/package.json — the upstream Claude Desktop app.asar is built against a specific Electron major and running a different one is unsupported.
Installing the Built Package
For .deb packages (Debian/Ubuntu)
sudo apt install ./claude-desktop_VERSION_ARCHITECTURE.deb
# Or: sudo dpkg -i ./claude-desktop_VERSION_ARCHITECTURE.deb
# If you encounter dependency issues:
sudo apt --fix-broken install
For .rpm packages (Fedora/RHEL)
sudo dnf install ./claude-desktop-VERSION-1.ARCH.rpm
# Or: sudo rpm -i ./claude-desktop-VERSION-1.ARCH.rpm
For AppImages
# Make executable
chmod +x ./claude-desktop-*.AppImage
# Run directly
./claude-desktop-*.AppImage
# Or integrate with your system using Gear Lever
Note: AppImage login requires proper desktop integration. Use Gear Lever or manually install the provided .desktop file to ~/.local/share/applications/.
Automatic Updates: AppImages downloaded from GitHub releases include embedded update information and work seamlessly with Gear Lever for automatic updates. Locally-built AppImages can be manually configured for updates in Gear Lever.
For NixOS
The repository includes a Nix flake. Build and install directly:
# Build the package
nix build .#claude-desktop
# Build the FHS-wrapped variant (for MCP server support)
nix build .#claude-desktop-fhs
# Run without installing
nix run .#claude-desktop
For declarative NixOS installation, see the README.
Technical Details
How It Works
Claude Desktop is an Electron application distributed for Windows. This project:
- Downloads the official Windows installer
- Extracts application resources
- Replaces Windows-specific native modules with Linux-compatible implementations
- Repackages as one of:
- Debian package (.deb): For Debian, Ubuntu, and derivatives
- RPM package (.rpm): For Fedora, RHEL, CentOS, and derivatives
- AppImage: Portable, distribution-agnostic executable
- Nix package: For NixOS, via the included flake
Build Process
The build script (build.sh) handles:
- Dependency checking and installation
- Resource extraction from Windows installer
- Icon processing for Linux desktop standards
- Native module replacement
- Package generation based on selected format
Automated Version Detection
A GitHub Actions workflow runs daily to check for new Claude Desktop releases:
- Uses Playwright to resolve Anthropic's Cloudflare-protected download redirects
- Compares resolved URLs with those in
scripts/setup/detect-host.sh - If a new version is detected:
- Updates
scripts/setup/detect-host.shwith new download URLs - Updates
nix/claude-desktop.nixwith new version, URLs, and SRI hashes - Creates a new release tag
- Triggers automated builds for both architectures
- Updates
This ensures the repository stays up-to-date with official releases automatically.
Manual Updates
If you need to build with a specific version before the automation catches it:
-
Use a local installer: Download the latest installer from claude.ai/download and build with:
./build.sh --exe /path/to/Claude-Setup.exe -
Update the URL: Modify the
claude_download_urlassignments inscripts/setup/detect-host.sh(inside thedetect_architecturecase statement).