Notes on LinuxBeginnings/NixOS-Hyprland — evaluating whether to adopt it, and how the installer actually works under the hood.
Install scripts
Two entry points at repo root, sharing helpers from scripts/lib/install-common.sh:
auto-install.sh— the curl-piped bootstrap for a machine that doesn’t have the repo yet. If~/NixOS-Hyprlandalready exists it moves it to~/NixOS-Hyprland-backups/<timestamp>and does a freshgit clone --depth 1, then runs the same flow asinstall.sh.install.sh— run from inside an already-cloned repo. Checks NixOS/git/pciutils/Go version, prompts for hostname/keyboard/timezone, detects GPU vialspci/hostnamectland toggles the right driver flags, generateshardware.nixvianixos-generate-config, patchesflake.nix, thensudo nixos-rebuild switch --flake ~/NixOS-Hyprland/#<hostName>.scripts/lib/install-common.sh— shared functions:nhl_detect_gpu_and_toggle,nhl_prompt_timezone_console,nhl_check_go_version(needed for buildingwaybar-weather).
Post-rebuild, both scripts also (imperatively, outside Nix):
- back up/copy
assets/.zshrcto~/.zshrc - clone
GTK-themes-iconsand run itsauto-extract.shinto~/.icons/~/.themes - clone
Hyprland-Dotsand run itscopy.sh— this is where the actualhyprland.conf/waybar/hypridle/hyprlock/rofi config comes from, not from the Nix flake - mask the user
waybar.serviceto avoid a duplicate bar
Will the flake build without running the scripts?
Yes, evaluation-wise — but two values are hardcoded in flake.nix rather than templated, and the scripts just sed them:
host = "jak-hl";
username = "dwilliams";
These are the maintainer’s own hostname/user, not placeholders. Also hosts/default/hardware.nix is someone’s real generated hardware config (hardcoded disk UUIDs, an NFS mount) — install.sh regenerates this via sudo nixos-generate-config --show-hardware-config for your actual disks before rebuilding.
Skipping the scripts and hand-editing instead works fine:
- edit
host/usernameinflake.nix sudo nixos-generate-config --show-hardware-config > hosts/<host>/hardware.nixyourself (same command the script runs)- hand-flip the
drivers.amdgpu/intel/nvidia/nvidia-prime.enable/vm.guest-services.enableflags inhosts/<host>/config.nix - set
keyboardLayoutinvariables.nix,time.timeZone/console.keyMapinconfig.nix sudo nixos-rebuild switch --flake .#<host>directly
But modules/home/default.nix (the home-manager config actually wired into the flake) only manages CLI tools — tmux, nixvim, bat, btop, eza, fzf, git, yazi. No Hyprland config, no waybar, no rofi, no wallpaper anywhere in the Nix modules. So building the flake alone gets Hyprland installed but unconfigured — you still need the separate Hyprland-Dots clone + copy.sh (and optionally GTK-themes-icons) for the actual desktop experience, even when skipping the NixOS-layer installer.
Keeping up to date after hand-editing
The repo’s own update model is destructive, not incremental: re-running auto-install.sh backs up and re-clones (shallow) from scratch. That’s incompatible with hand-edited host files, so:
- Clone with full history (no
--depth 1) so merge/rebase actually works. - Fork on GitHub if I want my edits versioned; add
upstreamremote pointing atLinuxBeginnings/NixOS-Hyprland. - Put all machine-specific edits in my own
hosts/<unique-name>/dir, neverhosts/defaultor an existing maintainer host (jak-hl,nixos,nixos-test) — that dir never exists upstream, so it never conflicts on merge. - Expect occasional manual conflict resolution on
flake.nixitself (thehost/usernamelines) since they’re inline in the sharedoutputsblock rather than per-host — usually trivial, only conflicts if upstream touches the same lines. - Routine:
git fetch upstream && git merge upstream/main, checkCHANGELOG.mdfor breaking changes, resolve theflake.nixconflict if any,sudo nixos-rebuild switch --flake .#<host>. - Don’t run my own
nix flake update— pull the maintainer’sflake.lockvia merge instead, since that reflects revisions they’ve actually tested (README warns their flake tracksnixos-unstable, which can break things).