# NixOS configurations One flake manages three x86_64 machines. NixOS uses stable `nixos-26.05`; `nixos-unstable` supplies only packages the older configs already selected from unstable. `nixos-hardware` provides the Framework 11th-gen Intel profile. All inputs are pinned in `flake.lock`. | Flake host | Network hostname | Hardware | | --- | --- | --- | | `t450s` | `samwise` | ThinkPad T450s, original encrypted ext4 layout | | `x1eg2` | `bilbo` | ThinkPad X1 Extreme Gen 2, original ZFS/NVIDIA layout | | `framework` | `framework` | Framework 13, Intel i5-1135G7; generated hardware file required | ## Organization Each `hosts//configuration.nix` explicitly imports its own generated `hardware-configuration.nix` and selected shared modules: - `common.nix`: flakes, store maintenance, locale, NetworkManager, user `clw`, zsh. - `kde.nix`: Plasma 6, SDDM, US keyboard, PipeWire, Bluetooth, printing, Flatpak. - `development.nix`: Emacs, VS Code, htop, general CLI/DevOps tools, Docker, direnv and nix-direnv on every host. - `desktop-apps.nix`: selected shared desktop applications, imported by the two ThinkPads only. - `gaming.nix`: shared Steam setup on all three hosts. The ThinkPads' different games, Wine variants and X1EG2 GameMode customization stay at host level. Storage, encryption, NVIDIA/PRIME, undervolting, backup datasets, virtualization, SSH server and firewall policy live in the host configurations. There is no shared laptop module because the older configurations did not have common laptop tuning. Framework enables power-profiles-daemon and touchpad support locally, and uses the upstream Framework 11th-gen Intel hardware profile. Its generated hardware file supplies the actual disk UUIDs and detected devices. ## Rebuild From this checkout on the relevant machine: ```sh sudo nixos-rebuild build --flake .#t450s sudo nixos-rebuild switch --flake .#t450s # Or use .#x1eg2 / .#framework ``` Flake names are independent of network hostnames. New files must be tracked with `git add` for Git-backed flakes to include them. Review the release upgrade before switching: the old machines were configured for Plasma 5, whereas the current release uses Plasma 6. Keep the original `system.stateVersion` values (`23.05` and `23.11`); changing inputs does not require changing stateVersion. The ThinkPads retain their disabled firewall. Only T450s enables the SSH server; Framework keeps the firewall enabled, with the gaming module's Steam port exceptions, and does not enable the SSH server. T450s still requires `/crypto_keyfile.bin` on that machine for its initrd. Never put that key in this repository. Its existing ZFS support is also preserved even though the generated root filesystem is ext4. ## Install Framework Framework uses a GPT layout with a FAT32 EFI partition at `/boot`, ext4 at `/`, and the remaining drive space in ZFS pool `tookland`. Dataset `tookland/home` is mounted at `/home`; other datasets can be created later. The NixOS configuration enables ZFS, imports the existing pool, mounts home, and schedules scrubs. It does **not** partition disks or create pools/datasets. Follow the [Framework installation guide](hosts/framework/README.md) to create and mount them before generating hardware configuration and running: ```sh sudo nixos-install --flake /mnt/etc/nixos-config#framework ``` Replace the deliberate failing `hosts/framework/hardware-configuration.nix` placeholder with the file generated by `nixos-generate-config --root /mnt`. No disk UUIDs are copied from another machine. Keep Framework's initial `system.stateVersion = "26.05"` after installation. ## Add a host 1. Generate its hardware configuration on that machine or mounted installation. 2. Create `hosts//configuration.nix`, import its hardware file and the shared modules you need, and set hostname, bootloader and initial stateVersion. 3. Add an explicit `nixpkgs.lib.nixosSystem` entry under `nixosConfigurations` in `flake.nix`, pointing to the new host configuration. 4. Track the files, evaluate/build, then install or rebuild with `.#`. ## Development General workstation tools belong here. Each project should provide its own `devShell`, container, or equivalent for languages, SDKs and dependencies: ```sh nix develop # For a project using direnv, review .envrc then: direnv allow ``` An `.envrc` containing `use flake` integrates a project's devShell with direnv. No existing development projects were changed. Docker and Compose are available on every host, with `clw` in the Docker group. Ansible and AWS CLI are shared DevOps tools. The module includes JSON/YAML tools (`jq`, `yq`), file/search utilities, tmux, and network troubleshooting tools. It does not add project language runtimes or Kubernetes/Terraform tooling. Android Studio remains on the ThinkPads as an existing IDE/workflow choice, but its bundled SDK is worth reviewing if moving fully to project-local tooling. ## Migration and package review The original repositories are left untouched. No credentials were found in the tracked configurations or a pattern scan of their Git history. UUIDs, host IDs, and references to local encryption keys are not the keys themselves. Do not add passwords, Wi-Fi PSKs, private keys, tokens or API credentials to Nix files. No secrets framework is added. Changes required for the current release include Plasma 6 and renamed graphics, keyboard, display-manager and package options. `programs.adb` and its old `adbusers` group are removed: systemd now grants device access automatically, and `android-tools` still provides ADB. Libvirt now exposes QEMU's OVMF firmware without the removed `qemu.ovmf` settings. NVIDIA containers use the current toolkit/CDI integration (for example, `docker run --device nvidia.com/gpu=all …`). `ffmpeg_6` becomes current `ffmpeg`, KCalc comes from `kdePackages`, Bitwarden becomes `bitwarden-desktop`, `du-dust` becomes `dust`, Jellyfin becomes `jellyfin-desktop`, and Proton VPN becomes `proton-vpn`. The Adwaita, nvtop, Noto fonts and Wine attribute names are also updated; `noto-fonts-extra` is now covered by `noto-fonts`. `whatsapp-for-linux` is removed because nixpkgs reports it was unmaintained and archived upstream. No replacement is installed automatically. The obsolete insecure-package exceptions for `mailspring-1.12.0` and `electron-24.8.6` are removed; do not restore these old exceptions simply to force evaluation. Removed from global packages in both old hosts: Java (`jdk`), Node 20, Flutter, Perl and Python. Put the versions each project needs in its development shell. Applications can still bring their own runtime dependencies. The shared desktop app selection omits Calf, Cryptomator, Discord, gscan2pdf, Minigalaxy, Proton VPN and Tilix. Tilix's VTE shell integration is removed too. Brave, Signal and Rocket.Chat now use stable nixpkgs from this shared module, instead of duplicate host entries (some previously used unstable). Emacs is also shared across all hosts using stable nixpkgs, as is VS Code. Review these preserved choices before your first switch: - Android Studio, Postman and Android tools: retain only tools you use across projects; SDKs are better project-local. - Mailspring, Rocket.Chat, Threema wrappers: verify which messaging clients you still use; availability may have changed since the old configs. - Firefox plus Chrome plus Brave, VLC plus mpv plus Jellyfin, and overlapping mail clients: remove whichever you no longer use. - Wine, Lutris and VCMI: older ThinkPad gaming choices; Framework currently gets Steam through the shared gaming module. - HP/Canon printing drivers and scanner support on T450s: keep only if you still own the relevant devices. - T450s ZFS support and host ID: retained despite its ext4 root; check whether you still attach ZFS pools. - X1EG2's `-100` CPU undervolt, PRIME bus IDs, NVIDIA power management, root-run QEMU, ZFS pools and Sanoid datasets are hardware/workflow-specific and retained. Confirm they still describe the actual machine before activating the upgrade. ## Update inputs and check ```sh nix flake update # Or update one input: nix flake update nixpkgs nix eval --raw .#nixosConfigurations.t450s.config.system.build.toplevel.drvPath nix eval --raw .#nixosConfigurations.x1eg2.config.system.build.toplevel.drvPath # After replacing Framework's hardware file: nix eval --raw .#nixosConfigurations.framework.config.system.build.toplevel.drvPath sudo nixos-rebuild build --flake .#framework ``` Review and commit `flake.lock` after checking the hosts. `nix flake check` will fail on the intentional Framework placeholder until its hardware file is supplied. Validation uses a temporary Nix Docker container because Nix is not installed on this workstation. Both ThinkPads evaluate to complete system derivations; Framework is evaluated with an external test-only ext4/EFI hardware fixture. The checked-in placeholder remains an intentional evaluation failure until the installer-generated hardware file is supplied. Full system builds, activation, and physical disk operations are not performed here.