diff --git a/pkgbuilds/claude-desktop/.omarchy/package.json b/pkgbuilds/claude-desktop/.omarchy/package.json new file mode 100644 index 0000000..c089113 --- /dev/null +++ b/pkgbuilds/claude-desktop/.omarchy/package.json @@ -0,0 +1,12 @@ +{ + "source": "local", + "release_ring": "fast", + "upstream": { + "debian": "https://downloads.claude.ai/claude-desktop/apt/stable/dists/stable/main/binary-amd64/Packages", + "package": "claude-desktop", + "sources": { + "x86_64": ["https://downloads.claude.ai/claude-desktop/apt/stable/pool/main/c/claude-desktop/claude-desktop_{pkgver}_amd64.deb"], + "aarch64": ["https://downloads.claude.ai/claude-desktop/apt/stable/pool/main/c/claude-desktop/claude-desktop_{pkgver}_arm64.deb"] + } + } +} diff --git a/pkgbuilds/claude-desktop/PKGBUILD b/pkgbuilds/claude-desktop/PKGBUILD new file mode 100644 index 0000000..8eab40b --- /dev/null +++ b/pkgbuilds/claude-desktop/PKGBUILD @@ -0,0 +1,83 @@ +# Maintainer: Spencer Bull + +# Omarchy tracks Anthropic's own Debian repository, the only channel the +# Linux beta ships through. The declarative "debian" upstream provider in +# .omarchy/package.json rewrites the version and checksums below from that +# repository's package index. + +pkgname=claude-desktop +pkgver=1.46388.2 +pkgrel=1 +pkgdesc="Official Claude desktop app with Claude Code" +arch=('x86_64' 'aarch64') +url="https://claude.ai" +license=('custom') + +depends=( + 'alsa-lib' + 'at-spi2-core' + 'bash' + 'gcc-libs' + 'glibc' + 'gtk3' + 'libdrm' + 'libnotify' + 'libsecret' + 'libxcb' + 'libxtst' + 'mesa' + 'nss' + 'util-linux-libs' + 'xdg-desktop-portal' + 'xdg-utils' +) + +optdepends=( + 'gnome-keyring: store credentials in a system keyring' + 'edk2-ovmf: UEFI firmware for the Cowork virtual machine' + 'virtiofsd: file sharing with the Cowork virtual machine' +) +optdepends_x86_64=('qemu-system-x86: run Cowork tasks in a local virtual machine') +optdepends_aarch64=('qemu-system-aarch64: run Cowork tasks in a local virtual machine') + +makedepends=('libarchive') +options=('!debug' '!strip') + +# Omarchy: same treatment as openai-codex-desktop. The build image compresses +# with zstd at its default level, which leaves this 560 MB Electron tree at +# 210 MB. Maximum zstd takes it to 160 MB for ~3 extra minutes of build time +# -- worth it for a package every user re-downloads on each of Anthropic's +# frequent releases. +COMPRESSZST=(zstd -c -z -q --ultra -22 --threads=0 -) + +_deb_x86_64="claude-desktop_${pkgver}_amd64.deb" +_deb_aarch64="claude-desktop_${pkgver}_arm64.deb" +source=('claude-desktop-launcher.sh') +_pool="https://downloads.claude.ai/claude-desktop/apt/stable/pool/main/c/claude-desktop" +source_x86_64=("${_deb_x86_64}::${_pool}/${_deb_x86_64}") +source_aarch64=("${_deb_aarch64}::${_pool}/${_deb_aarch64}") +noextract=("${_deb_x86_64}" "${_deb_aarch64}") +sha256sums=('edfdbc63b65891ef7c481b07086c7e630fc102c042b6ed65331a52fcaf72b14a') +sha256sums_x86_64=('98bf54e85e4916068c4281459b0f0431d8ff68034773f3ee98311d7206566ab1') +sha256sums_aarch64=('b944a2154528815bb476bfb1e7091f8a3e329b3c67f6c11de8d41668a603bd9e') + +package() { + cd "${srcdir}" + + local deb_var="_deb_${CARCH}" + local deb="${!deb_var}" + + bsdtar -xOf "${deb}" data.tar.xz | + bsdtar --no-same-owner -xf - -C "${pkgdir}" + + # Upstream's /usr/bin/claude-desktop is a bare symlink to the Electron + # binary; replace it with a launcher that picks the right Ozone platform. + rm "${pkgdir}/usr/bin/claude-desktop" + install -Dm755 claude-desktop-launcher.sh "${pkgdir}/usr/bin/claude-desktop" + + install -Dm644 "${pkgdir}/usr/share/doc/claude-desktop/copyright" \ + "${pkgdir}/usr/share/licenses/${pkgname}/copyright" + + # Debian package-policy files are not used on Arch Linux. + rm -rf "${pkgdir}/usr/share/doc" "${pkgdir}/usr/share/lintian" +} diff --git a/pkgbuilds/claude-desktop/claude-desktop-launcher.sh b/pkgbuilds/claude-desktop/claude-desktop-launcher.sh new file mode 100644 index 0000000..b6db841 --- /dev/null +++ b/pkgbuilds/claude-desktop/claude-desktop-launcher.sh @@ -0,0 +1,32 @@ +#!/bin/bash +set -euo pipefail + +user_flags=() +config_home="${XDG_CONFIG_HOME:-}" +[[ -n "$config_home" || -z "${HOME:-}" ]] || config_home="$HOME/.config" +flags_file="${config_home:+$config_home/claude-desktop-flags.conf}" + +if [[ -n "$flags_file" && -f "$flags_file" && -r "$flags_file" ]]; then + while IFS= read -r line || [[ -n "$line" ]]; do + line="${line%%#*}" + [[ -n "${line//[[:space:]]/}" ]] || continue + read -r -a flags <<<"$line" + user_flags+=("${flags[@]}") + done <"$flags_file" +fi + +# Chromium's own Ozone detection falls back to XWayland often enough to matter, +# and the result is a blurry window on every scaled display. Ask for Wayland +# directly, unless the user has already picked a platform themselves. +platform_flags=() +if [[ -n "${WAYLAND_DISPLAY:-}" || "${XDG_SESSION_TYPE:-}" == wayland ]]; then + platform_flags=(--ozone-platform=wayland) + + for flag in "${user_flags[@]}" "$@"; do + case "$flag" in + --ozone-platform=* | --ozone-platform-hint=*) platform_flags=() ;; + esac + done +fi + +exec /usr/lib/claude-desktop/claude-desktop "${platform_flags[@]}" "${user_flags[@]}" "$@"