27 Commits
Author SHA1 Message Date
nevaforget 4489d42702 docs(desktop): record why pactl is not installed
Steam prints "pactl: command not found" and it means nothing: it probes
wpctl and pactl both and uses whichever is on PATH, which wireplumber
provides. Closed as expected behaviour in nixpkgs#525793.
2026-08-20 18:43:31 +02:00
nevaforget af101afd14 fix(pipewire): denoising through configPackages, desktop gets steam and bitwig
The RNNoise config was deployed to /etc/xdg/pipewire, which PipeWire
never reads: it resolves $PIPEWIRE_CONFIG_DIR, then the home config, then
its compiled-in /etc/pipewire, and knows nothing of XDG_CONFIG_DIRS. An
installed system therefore had no denoising while carrying the file.

It now goes through services.pipewire.configPackages, with the LADSPA
plugin substituted to its store path since LADSPA_PATH has no /usr here.

Alongside, on the desktop host only: steam via its module (which also
turns on 32-bit graphics), bitwig-studio, and rtkit so a DAW can ask for
realtime scheduling at all.
2026-08-20 18:25:36 +02:00
nevaforget b0e819d630 feat(desktop): install librewolf as the browser
The package set provided no browser at all. Waterfox, which Arch runs,
is not in nixpkgs; packaging its upstream tarball worked but leaves
version and hash to be bumped by hand, with nothing signalling a missed
release — poor terms for the most exposed program on the machine.

librewolf comes from nixpkgs, so its updates arrive with the flake, and
it is fully substitutable. Its defaults are stricter than Waterfox's.
2026-08-20 17:57:22 +02:00
nevaforget 425b502cf6 feat(desktop): driverless printing, OpenVPN plugin, VLC
networking.networkmanager.plugins defaulted to an empty list, so
NetworkManager offered no OpenVPN connection type at all.

Printing is driverless: asked over IPP the Samsung M267x 287x reports
image/urf and application/PCLm, so CUPS builds the queue from the
printer's own capabilities. No PPD, no unfree driver, and no printer
declared here. Avahi provides the discovery and resolves .local.

VLC instead of the mpv the Arch lists carry.
2026-08-20 17:41:04 +02:00
nevaforget f5b4f0174d fix(zsh): seed a placeholder ~/.zshrc
zsh/newuser runs zsh-newuser-install on every interactive login while the
user has none of .zshenv, .zprofile, .zshrc or .zlogin. The whole
configuration lives in /etc/zshrc, which is not a personal file, so the
wizard never stopped coming up.

The seeded file carries comments only: sourcing the shared zshrc from it,
as the Arch counterpart does, would load it a second time.
2026-08-20 15:39:09 +02:00
nevaforget 951eb0a186 fix(zsh): defend the sourced zshrc against the /etc/zshrc defaults
/etc/zshrc renders promptInit and environment.shellAliases after
interactiveShellInit, so both overrode the shared zshrc: the prompt
became `prompt suse` and ls/ll/l fell back to coreutils. The plugin
sourcing in the zshrc points at the Arch path /usr/share/zsh/plugins
and silently found nothing.

Clear promptInit, drop the three aliases with null, and enable the
syntax-highlighting and autosuggestions modules.
2026-08-20 14:35:55 +02:00
nevaforget e7e1ec0c48 feat(desktop): thunar and the moonarch zshrc
Both were missing against the Arch package set: thunar with volman and the
archive plugin, tumbler and ffmpegthumbnailer (packages/official.txt:79-83),
and defaults/shell/zshrc, which Arch installs as /etc/zsh/zshrc.moonarch.
2026-08-20 14:16:51 +02:00
nevaforget 14d16ee8ec docs: correct false claims in the README
Verified against nix eval, upstream sources and a local test:

- testvm accepts SSH password authentication (NixOS default), the README
  claimed the opposite
- only /boot goes through by-partlabel; the filesystems inside the container
  come up as /dev/mapper/crypted
- kanshi parses an empty config fine; a missing one is the error case, in the
  README and in the desktop module comment
- modules/user.nix ABOUTME claimed a login name shared by every host
- the flake imports six modules, not five

Rewrites "Keeping a machine up to date": the checkout is ~/flakes/moonix and
/etc/nixos/flake.nix a symlink to it, which man 8 nixos-rebuild documents.
Drops the git and ssh-keygen basics. Adds an optional LUKS header backup step,
and records the checkout decision in DECISIONS.md.
2026-08-20 12:09:23 +02:00
nevaforget 205e3eb60f feat: desktop host with /home on a second disk
Adds hosts/desktop: 512G system disk, 1T disk for /home, each in its own
LUKS container. modules/disk.nix gains moonarch.disk.home, which moves the
/home subvolume to the second disk and drops it from the first.

New modules/user.nix declares moonarch.user without a default, so the login
name exists once per host instead of once per reference. Both hosts set an
initialPassword: swaylock authenticates through pam_unix and cannot unlock a
screen for an account without one.
2026-08-20 12:09:07 +02:00
nevaforget 656d1c70bb fix(desktop): follow swaylock config move, use blurred wallpaper
The config source is defaults/etc/swaylock/config now. The tmpfiles seed
stays: nixpkgs leaves meson's sysconfdir at $out/etc, so the
/etc/swaylock/config that Arch owns is never read here.
2026-08-18 17:34:01 +02:00
nevaforget ec881f6401 feat: drop moonlock and moonset
The power menu is a Quickshell popout in the moonarch config now, and it
was the last caller of moonlock. Inputs, package entries and both build
recipes are gone, together with the generated /etc configs and the
moonlock PAM stack — swaylock's comes from programs.niri.enable.
2026-08-14 17:48:52 +02:00
nevaforget f5965b2328 feat: regreet and swaylock from nixpkgs, autologin after LUKS
greetd.nix configures services.displayManager.regreet and keeps niri as
the greeter compositor, so niri-greeter.kdl stays the shared file that
carries the German keyboard layout. The moongreet input, its package and
pkgs/moongreet.nix are gone.

extraCss goes through builtins.readFile: the module only recognises a
direct /nix/store child as a path, so passing the file path as a string
wrote the path itself into /etc/greetd/regreet.css.

desktop.nix installs swaylock, seeds ~/.config/swaylock/config with the
wallpaper rewritten to the store path, and now owns the moonlock PAM
stack. The Colloid overrides moved to flake.nix so the greeter and the
desktop share one derivation.

initial_session is set per host because the accounts differ. greetd's
restart option flips itself off, verified.

flake.lock still pins moonarch at the pushed revision; it needs
`nix flake update moonarch` once the moonarch commit is pushed.
2026-08-14 14:32:43 +02:00
nevaforget 515d5c7ea6 Declare the disk layout with disko
Installing used to mean six manual steps through Calamares, one of which
copied hardware-configuration.nix into the repo — a step that fails
silently unless the file is also git added, since Nix only sees tracked
files. It also did not scale past one machine.

modules/disk.nix defines moonarch.disk.{enable,device,encrypt,espSize,
swapSize} and builds disko.devices from it, so another machine is a
device path rather than a new layout. Installing is a single
disko-install run from the ISO.

hardware-configuration.nix is no longer needed: nvme, ahci, sd_mod and
the USB HID modules are in the initrd via
boot.initrd.includeDefaultModules, and nixpkgs.hostPlatform comes from
nixosSystem. The testvm copy described a qcow2 that no longer exists and
is deleted; that host now uses the module against /dev/vda.

The user password no longer arrives with the installer, so it is set
once via nixos-enter after installing instead of committing a hash.
2026-08-11 09:50:55 +02:00
nevaforget 2f3ac2557a Install only the helper scripts that are still called
cpugov, sink-switcher and nightlight were referenced solely by the waybar
config; the Quickshell popouts cover all three. btnote, capsnote, vpn and
waybar-hidpp are unreferenced anywhere.

Adds the two system units for battery threshold restore and camera
shutoff, which had been missed.
2026-08-07 17:12:53 +02:00
nevaforget d35c4a1408 Set moonset background blur to match the Arch user config 2026-08-07 16:48:59 +02:00
nevaforget d0cc1f1644 Point moonlock and moonset at the wallpaper store path
Both fall back to /usr/share/moonarch/wallpaper.jpg, which does not exist
under Nix, so they rendered without a background.
2026-08-07 16:46:56 +02:00
nevaforget 9fa14f412b Wire stasis into the desktop and add its user service
Upstream ships a systemd unit in the Arch package but not in the source
tarball, so it is declared in the module.
2026-08-07 16:21:14 +02:00
nevaforget eec0dbe2ac Seed waypaper config into the home directory
waypaper reads only ~/.config/waypaper/config.ini and has no system-wide
fallback, so it wrote its own default with an empty wallpaper entry and
nothing was ever set. systemd.user.tmpfiles 'C' copies the file once
without overwriting later user edits.
2026-08-07 15:41:58 +02:00
nevaforget 0f8001da62 Do not deploy the empty kanshi config
defaults/xdg/kanshi/config is a 0-byte placeholder, unused on Arch as
well, where kanshi reads ~/.config/kanshi/config instead. Deploying it
made kanshi fail to parse and restart in a loop. The unit now starts only
when a user config exists.
2026-08-07 15:36:51 +02:00
nevaforget 54ac8a7319 Drop waybar and swaync from the desktop set
Both are marked 'kept as a reserve' in the Arch config, a note left over
from the migration to the Quickshell bar. A fresh setup has no reason to
carry them, so the packages, their configs and the waybar-only helper
scripts stay out.
2026-08-07 15:02:39 +02:00
nevaforget cf70c68b48 Emit a complete XML document in fonts.fontconfig.localConf
localConf is written to /etc/fonts/local.conf verbatim. Without the XML
declaration and the fontconfig root element, fontconfig rejects the file
with 'junk after document element' and the generic-family defaults never
take effect.
2026-08-07 14:47:36 +02:00
nevaforget 3207f6d8d7 Fix niri config discovery, polkit path, wallpaper stack
- NIRI_CONFIG points niri at /etc/xdg; without it niri writes its own
  default config, so none of the Moonarch settings applied.
- config.kdl spawns the polkit agent by FHS path, provided via tmpfiles
  instead of diverging the config shared with Arch.
- waypaper was missing entirely, hence no wallpaper. It invokes swww,
  which the maintained awww provides under a different name.
2026-08-07 13:17:46 +02:00
nevaforget 3dbd61bf7f Package sweet-cursors and use it in the greeter 2026-08-07 12:58:15 +02:00
nevaforget 593c7ed73c Expose wayland-sessions at the FHS path moongreet expects
moongreet hardcodes /usr/share/wayland-sessions in src/sessions.rs and
greeter.rs calls get_sessions(None, None), so the default cannot be
overridden from config.
2026-08-07 12:47:29 +02:00
nevaforget d8b1ebe782 Boot into graphical.target so greetd starts
greetd is WantedBy=graphical.target, but an install without a desktop
defaults to multi-user.target and never activates it.
2026-08-07 12:38:04 +02:00
nevaforget acb7301e97 Route fontconfig through fonts.fontconfig.localConf
/etc/fonts/conf.d is owned by the NixOS fontconfig module and rejects
environment.etc entries. Same content as
defaults/etc/fonts/conf.d/65-moonarch-fonts.conf.
2026-08-07 12:33:43 +02:00
nevaforget baae084594 Add NixOS modules for desktop, greetd and services 2026-08-07 12:26:46 +02:00