Packaging
The GNARUS project is organized as several repositories under the gnarus-sh GitHub organization:
- gnarus: desktop configuration (config, bin/gnarus-setup, share).
- gnarus-session: session launchers and the Wayland session entry.
- gnarus-appearance: shared wallpapers and bundled fonts.
- gnarus-storage: Rust program powering the removable-storage Waybar module.
- gnarus-calendar: Rust program powering the Waybar calendar popup.
- gnarus-greeter: greetd greeter integration.
- gnarus-pkgbuild: Arch PKGBUILDs for the desktop and its component packages.
- packages: binary package repository served at
https://gnarus-sh.github.io/packages/. - site-src: this site’s source (Astro).
- gnarus-sh.github.io: the published site.
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 Packaging
Section titled “GNARUS Packaging”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.
Installed layout
Section titled “Installed layout”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.desktopgnarus-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.
User configuration
Section titled “User configuration”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:
sudo pacman -Syu gnarusPackage versioning
Section titled “Package versioning”The component packages pin their source repositories by tag:
ENV_VER=0.3.34 # arch/gnarus/PKGBUILDpkgver=0.1.4 # arch/gnarus-storage/PKGBUILDpkgver=0.2.2 # arch/gnarus-calendar/PKGBUILDBump 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.
GitHub Actions
Section titled “GitHub Actions”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.