Add a zfs_manager module that reconciles the live datasets on jeeves against a nix declaration, and generate the snapshot retention config from that same declaration so the two can no longer drift apart. systems/jeeves/datasets.nix declares every dataset on the media, storage and scratch pools, nested the way zfs nests them and flattened into pool/parent/child names. Values were transcribed from the live pools rather than from scripts/zfs.sh, which had gone stale: acltype reads back as posix, and media/secure/important, scratch/kestra and storage/nomad were never recorded. root_pool datasets are declared for retention only, their properties stay unmanaged for now. python.tools.zfs_manager creates missing datasets and corrects drifted properties, and never destroys anything. Undeclared properties are judged by the zfs source field, so inherited and default values stay quiet while locally set ones warn. Size values are normalised to bytes so that 16K and 16384 do not re-issue zfs set on every run. vars.nix now derives its paths from the declared mountpoints instead of repeating them, dropping three zfs_* keys that nothing referenced. Replaces systems/jeeves/snapshot_config.toml, which listed a dataset that does not exist and omitted thirteen that do.
dotfiles
Installer ISO
Build a bootable NixOS ISO with the installer preinstalled:
nix build .#iso
Write result/iso/nixos-zfs-installer.iso to a USB stick (for example with dd) or boot it in a VM. The image is the minimal NixOS installation CD with ZFS enabled and nixos-installer on PATH. SSH is enabled and the nixos and root accounts use the password nixos, so you can also run the installer remotely. Once booted:
sudo nixos-installer
The ISO bundles the .#installer-nixos package, a variant of the binary that keeps its Nix store linkage instead of being patched for foreign distributions.
Installer binary
Build the self-contained installer executable with:
nix build .#installer
The flake package (defined in python/installer/package.nix) uses the Python builder in python/installer/build.py, which stages only the installer modules before running PyInstaller. You can also call it directly when pyinstaller and patchelf are on PATH:
python -m python.installer.build --output ./nixos-installer
Copy result/bin/nixos-installer to the installer USB stick and run it as root from the NixOS live environment:
sudo ./nixos-installer
Validate the live environment first with:
./nixos-installer --check
Paste a value into the TUI encryption password field to enable LUKS during install, or set ENCRYPT_KEY:
sudo env ENCRYPT_KEY='change-me' ./nixos-installer
The binary bundles the Python runtime and only the installer modules it imports. It still expects the NixOS installer environment to provide system install tools such as parted, zfs, zpool, cryptsetup, nixos-generate-config, and nixos-install.