Skip to content

Packaging

The GNARUS project is organized as several repositories under the gnarus-sh GitHub organization:

The Arch manifests live under arch/ in gnarus-pkgbuild: arch/gnarus/PKGBUILD, arch/gnarus-session/PKGBUILD, arch/gnarus-appearance/PKGBUILD, arch/gnarus-storage/PKGBUILD, arch/gnarus-calendar/PKGBUILD and arch/gnarus-greeter/PKGBUILD. Vendored dependencies (pwvucontrol, snappy-switcher and wlogout) live under vendors/.

GNARUS is packaged as an Arch Linux Hyprland spin split into focused component packages.

Package installation is system-only: it installs read-only defaults under /usr/share/, commands under /usr/bin/, and the display-manager session entry under /usr/share/wayland-sessions/. It never writes to $HOME during installation.

The gnarus package installs:

/usr/bin/gnarus-setup
/usr/share/gnarus/

gnarus-session installs the session entrypoints:

/usr/bin/gnarus-session
/usr/bin/gnarus-start
/usr/bin/gnarus-tty
/usr/share/wayland-sessions/gnarus.desktop

gnarus-appearance installs the shared assets:

/usr/share/backgrounds/gnarus/
/usr/share/fonts/

gnarus-storage is packaged separately. It installs /usr/bin/gnarus-storage, default configuration under /etc/gnarus-storage/, and its license under /usr/share/licenses/gnarus-storage/. See the Removable Storage page for usage and configuration.

gnarus-calendar is packaged separately. It installs /usr/bin/gnarus-calendar, defaults under /etc/gnarus-calendar/ and the user systemd unit at /usr/lib/systemd/user/gnarus-calendar.service. See the Calendar page for usage and configuration.

The gnarus package depends on gnarus-appearance, gnarus-calendar, gnarus-greeter, gnarus-session and gnarus-storage, so installing GNARUS resolves them from the same repository.

GNARUS does not copy dotfiles into $HOME before the desktop can start. Runtime entrypoints read packaged defaults from /usr/share/gnarus and user overrides from ~/.config, with the session prepending /usr/share/gnarus to $XDG_CONFIG_DIRS.

gnarus-setup is an optional helper. It copies /usr/share/gnarus/<app> to ~/.config/<app> on demand (--copy <app> or --copy-all), replacing an existing destination only with --force, which backs up the current directory as ~/.config/<app>.bak-<timestamp>. Once copied, files are user-owned overrides that package upgrades never replace.

gnarus-tty provides TTY login support without a display manager. It registers a logind session, starts D-Bus, sets environment variables, and launches Hyprland when the user runs gnarus-tty manually after logging in on a TTY. The package does not install a profile.d auto-start script; an opt-in profile is shipped under /usr/share/gnarus/gnarus/profile and automatic TTY startup is an explicit user choice.

Some runtime dependencies that previously required the AUR, including pwvucontrol, snappy-switcher, and wlogout, are vendored and published from the same repository as GNARUS:

Terminal window
sudo pacman -Syu gnarus

The component packages pin their source repositories by tag:

Terminal window
ENV_VER=0.3.34 # arch/gnarus/PKGBUILD
pkgver=0.1.4 # arch/gnarus-storage/PKGBUILD
pkgver=0.2.2 # arch/gnarus-calendar/PKGBUILD

Bump the package version with make version <X.Y.Z> from the gnarus-pkgbuild repository, keep ENV_VER aligned with the gnarus tag, and bump the component PKGBUILDs when their repositories publish new tags.

The build-and-publish.yml workflow in the gnarus-pkgbuild repository runs on package changes and on manual dispatch. It builds every discovered Arch .pkg.tar.zst, including gnarus and its component packages, signs the package files and pacman databases with the GNARUS GPG key, generates gnarus.db and gnarus.files, and publishes the package files to the main branch of packages.

The packages repository layout:

packages
public/arch/gnarus.conf
public/arch/gnarus.gpg
public/arch/x86_64/gnarus.db
public/arch/x86_64/gnarus.db.sig
public/arch/x86_64/*.pkg.tar.zst
public/arch/x86_64/*.pkg.tar.zst.sig
public/debian/
public/rpm/

The site deploy workflow (in the site-src repository) builds the static site with Astro and mirrors dist/ to gnarus-sh.github.io. It does not store binary packages.

Publishing the built packages to the packages repository requires PACKAGES_REPO_TOKEN (a fine-grained personal access token with contents: write on the packages repository) and GPG_PRIVATE_KEY (the ASCII-armored private key used only inside GitHub Actions). GPG_PASSPHRASE is optional when the private key is protected by a passphrase.