Files
thoughtsync/desktop/packaging/arch/README.md
T
bvandeusenandClaude Opus 5 c883fd2eb6
Desktop (Tauri) / Windows installer (cross-compiled) (push) Successful in 2m26s
Desktop (Tauri) / Tauri desktop (Linux) (push) Successful in 4m6s
Desktop (Tauri) / Update manifest (push) Successful in 6s
desktop: one name across all three install channels (issue 2075)
The app answered to three different names depending on how it arrived, and the
part that actually hurt was WM_CLASS. Reading tauri-bundler settles what it is:
the generated .desktop template writes StartupWMClass={{exec}} where exec is
main_binary_name, and tao creates its GtkApplication with a NULL app id
(enableGTKAppId defaults off), so GTK falls back to the program name. WM_CLASS
is the binary name, nothing else.

Which inverts this issue's premise. The rename could not break grouping,
because two channels weren't grouping in the first place: pacman ships
/usr/bin/thoughtsync and the AppImage's AppRun execs thoughtsync-desktop, while
all three hand-written entries hardcoded StartupWMClass=ThoughtSync — a string
no binary in any channel has ever reported. Only the .deb worked, and only
because Tauri generates its entry from the binary and never consulted us.

So: thoughtsync everywhere, carried by the build target itself via Cargo [[bin]]
plus mainBinaryName rather than by the install path, since the target name is
what the desktop reads. The pacman package sheds its -desktop suffix and
declares conflict+replaces so an upgrade retires the old one instead of landing
beside it and fighting over /usr/bin/thoughtsync.

The .deb verifier now asserts binary path, Exec and StartupWMClass all agree,
which is the part that keeps this fixed: the .deb's entry is the one no human
writes, so it's the one that drifts silently.

Package: thought-sync stays. tauri-bundler derives it as kebab-case(productName)
with no override, and rewriting a control archive on every build is a poor trade
for one uninstall command.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-16 10:57:17 -04:00

2.9 KiB

ThoughtSync desktop — Arch package

A prebuilt native pacman package, published as an asset on every ThoughtSync release. Nothing to compile, no toolchain to install.

Installing natively on Arch matters for more than tidiness: pacman pulls webkit2gtk-4.1 itself and the app runs against your system's graphics stack, which is what keeps the bundled-library EGL_BAD_PARAMETER black window (issue 2021) from coming back. It also means the app is package-manager tracked and uninstalls cleanly.

Install

Easiest — the one-command installer picks this package automatically on any pacman system:

curl -fsSL https://git.fabledsword.com/bvandeusen/thoughtsync/raw/branch/dev/desktop/packaging/install.sh | sh

That installs the newest tagged release. To follow the rolling development channel instead, pass the flag through the pipe:

curl -fsSL https://git.fabledsword.com/bvandeusen/thoughtsync/raw/branch/dev/desktop/packaging/install.sh | sh -s -- --channel dev

Or grab the .pkg.tar.* from the releases page and install it directly:

sudo pacman -U thoughtsync-*-x86_64.pkg.tar.*

The compression suffix depends on what the build image provides — .zst when zstd is installed, otherwise .xz (today's builds are .xz). pacman reads all of them; only the filename differs.

Either way you get:

  • /usr/bin/thoughtsync — the app
  • /usr/share/applications/thoughtsync.desktop — the menu entry
  • /usr/share/icons/hicolor/*/apps/thoughtsync.png — themed icons

Launch ThoughtSync from your app menu, or run thoughtsync.

Uninstall: sudo pacman -R thoughtsync.

The package was called thoughtsync-desktop before; it declares replaces/ conflicts on that name, so an upgrade from it is a normal pacman -U and leaves nothing behind.

How the package is built

package-prebuilt.sh runs in CI (.forgejo/workflows/desktop.yml) and wraps the binary the Linux build already produced into a pacman package — it does not compile anything a second time.

Packaging a Debian-compiled binary for Arch is safe here because the binary bundles nothing: it resolves libwebkit2gtk-4.1.so.0, libgtk-3.so.0 and libsoup-3.0.so.0 by SONAME at runtime and those are identical on both distros, SQLite is compiled in (rusqlite "bundled"), and glibc's forward compatibility means building on Debian's older glibc and running on Arch's newer one is the safe direction.

CI is Debian and has no pacman, so it cannot install-test the result. The build step instead logs the package's .PKGINFO and complete file listing, so the package is auditable from the run log; a real pacman -U is the final proof.

Previously

This directory used to hold a source-build PKGBUILD requiring makepkg -si with rust + nodejs + npm installed. It was removed once prebuilt packages shipped — asking every user to install a compiler toolchain isn't distribution.