Upstream ships a systemd unit in the Arch package but not in the source tarball, so it is declared in the module.
moonix
Moonarch on NixOS — packages and NixOS modules that reproduce the Moonarch desktop from the same sources as the Arch packages.
Arch stays the primary target. This repo is the parallel NixOS path: it
consumes moonarch/defaults/ unchanged and builds the Rust projects with Nix
instead of makepkg.
Layout
flake.nix Inputs (project repos pinned to tags) and outputs
pkgs/ Build recipes — counterparts to the PKGBUILDs
moonlock.nix
moongreet.nix
moonset.nix
stasis.nix
sweet-cursors.nix
modules/
desktop.nix /etc deployment, package set, theme
greetd.nix greetd + moongreet
services.nix systemd system and user services
hosts/
moonarch-vm/ QEMU test VM
Usage
Build a single package:
nix build .#moonlock
Build the whole system without activating it:
nix build .#nixosConfigurations.moonarch-vm.config.system.build.toplevel
Activate:
sudo nixos-rebuild switch --flake .#moonarch-vm
Version bumps
The project repos are pinned to release tags. After tagging a new version:
# adjust the tag in flake.nix, then
nix flake update moonlock
Configuration sources
moonarch/defaults/ is the single source of truth for both distributions.
Files are deployed as-is wherever possible. Three exceptions exist, each
because the file contains an FHS path that does not exist under Nix:
| File | Reason |
|---|---|
moongreet.toml |
wallpaper path, generated with the store path |
waypaper/config.ini |
wallpaper path, generated and seeded into $HOME |
| fontconfig defaults | /etc/fonts/conf.d is owned by the NixOS module |
Two files from defaults/xdg/ are deliberately not deployed:
walker/— walker is not part of this setup, the Quickshell launcher replaced itkanshi/config— a 0-byte placeholder, unused on Arch as well; kanshi rejects it and restarts in a loop
Test VM
hosts/moonarch-vm targets a QEMU guest. The launcher script lives outside
this repo at ~/VMs/moonix-vm.sh.
The guest needs a 3D capable virtio GPU: niri's TTY backend fails every buffer
import with Error::DeviceMissing otherwise, and software rendering is not a
workaround. On the current host that path has twice triggered an amdgpu hard
recovery, killing the QEMU process — shut the VM down when not testing.
Not covered
- Clipboard history and the
walker -dmenus inmoonarch-sink-switcher,moonarch-vpnandmoonarch-cpugov— walker was dropped without a replacement yet - Bare metal installation (disk layout, encryption, bootloader)