Files
NixOS-Configs/README.md
Anish Govind 598a43eace refactor: make hosts declarative and consolidate shared config
- add my.username / my.gaming.enable / my.ai.local.enable options and
  gate optional app modules on them instead of per-host import lists
- move vendor-neutral hardware.graphics into modules/graphical, leaving
  only NVIDIA-specific drivers and env vars in modules/hardware/nvidia
- derive the primary user everywhere from my.username (users, getty,
  home-manager, tmpfiles)
- de-duplicate Hyprland autostart down to a single system loginShellInit
  using the start-hyprland wrapper
- consolidate all nixpkgs overlays into modules/core/nix.nix and use
  final.stdenv.hostPlatform.system
- make the zsh rebuild helper target $(hostname) instead of hardcoded hades
- add nixpkgs follows for nixos-hardware, pi and comfy-ui (single nixpkgs)
- add .gitignore and a nixfmt flake formatter; format all nix files
- remove empty browser.nix/display-configuration.nix and rename
  local_ai.nix -> local-ai.nix
- document the my.* toggles in the README
2026-09-18 23:32:32 -07:00

75 lines
2.4 KiB
Markdown

# NixOS Configs
Reproducible multi-host NixOS + Hyprland ("Silicon Volt") configuration.
## Install (new machine)
```bash
# Setup disks
nix run --experimental-features "nix-common flakes" github:nix-community/disko -- --mode disko --flake .#hades
# install configs
nixos-install --flake .#hades
# set password
nixos-enter --root /mnt -- passwd anish
```
## Rebuild (existing machine)
```bash
rebuild switch # zsh helper: sudo nixos-rebuild switch --flake ~/NixOS-Configs#<host>
```
## Adding a new host (e.g. a laptop)
1. Create `hosts/<name>/` with `default.nix`, `hardware-configuration.nix`, and
(optionally) `disko.nix`. Shared modules (`modules/core`, `modules/graphical`,
`modules/apps`) are already pulled in by `commonModules` in `flake.nix` — the
host only adds its own hardware/disko config.
2. Register it in `flake.nix` under `nixosConfigurations`.
3. Turn optional features on per machine via the shared `my.*` options:
```nix
# hosts/<name>/default.nix
my = {
username = "anish"; # default; change for a different primary user
gaming.enable = false; # Steam, Gamemode, MangoHud
ai.local.enable = false; # Ollama, ComfyUI, Open WebUI
};
```
4. Declare host-specific displays in `hosts/<name>/default.nix`:
```nix
home-manager.users.anish.volt.monitors = [
{
output = "eDP-1"; # or "desc:<panel description>"
mode = "2880x1800@120Hz"; # or "preferred"
position = "auto";
scale = 2;
vrr = null; # optional per-monitor VRR
}
{ output = ""; mode = "preferred"; position = "auto"; scale = "auto"; } # fallback
];
```
The `volt.monitors` default (any output @ preferred) keeps every machine working
out of the box; hosts override only what they need. Hosts without an NVIDIA GPU
simply don't import `modules/hardware/nvidia.nix` — all vendor env vars live there,
while the vendor-neutral `hardware.graphics` stack lives in `modules/graphical`.
## Feature toggles (`my.*`)
Optional app modules are always imported (via `modules/apps/default.nix`) but only
activate when a host sets the corresponding flag, so hosts never need to edit
import lists:
| Option | Enables |
| --- | --- |
| `my.username` | Primary user (users, home-manager, getty autologin) |
| `my.gaming.enable` | Steam, Gamemode, MangoHud |
| `my.ai.local.enable` | Ollama (CUDA), ComfyUI, Open WebUI |
Hardware modules remain explicit imports per host (e.g. `modules/hardware/nvidia.nix`).