- add home/theme.nix as the single Silicon Volt palette and pass it to home modules via extraSpecialArgs - drive foot, hyprland, hyprlock, mako, fzf, starship, rofi and the herdr picker from that palette; raw config files use @color@ tokens substituted at build time - pass my = config.my into home-manager; add my.pi.enable, my.flakeDir - gate home/pi.nix on my.pi.enable (enabled on hades) - route zshconf/hyprconf aliases and FLAKE_CONFIG through my.flakeDir - rename the hyprland monitor option volt.monitors -> hypr.monitors - fix use_auto_tmux command-substitution bug in zsh/init.zsh - track home/nvim/config/lazy-lock.json for reproducible plugins - document theming and toggles in the README
3.0 KiB
NixOS Configs
Reproducible multi-host NixOS + Hyprland ("Silicon Volt") configuration.
Install (new machine)
# 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)
rebuild switch # zsh helper: sudo nixos-rebuild switch --flake ~/NixOS-Configs#<host>
Adding a new host (e.g. a laptop)
- Create
hosts/<name>/withdefault.nix,hardware-configuration.nix, and (optionally)disko.nix. Shared modules (modules/core,modules/graphical,modules/apps) are already pulled in bycommonModulesinflake.nix— the host only adds its own hardware/disko config. - Register it in
flake.nixundernixosConfigurations. - Turn optional features on per machine via the shared
my.*options:
# 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
pi.enable = false; # pi coding agent (home-manager)
};
- Declare host-specific displays in
hosts/<name>/default.nix:
home-manager.users.anish.hypr.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 hypr.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.flakeDir |
Checkout path used by the rebuild helper and zshconf/hyprconf aliases |
my.gaming.enable |
Steam, Gamemode, MangoHud |
my.ai.local.enable |
Ollama (CUDA), ComfyUI, Open WebUI |
my.pi.enable |
pi coding agent (home-manager) |
Hardware modules remain explicit imports per host (e.g. modules/hardware/nvidia.nix).
Theming
The Silicon Volt palette lives in one place, home/theme.nix, and is passed to
every home-manager module through extraSpecialArgs. Tools that only accept a
raw config file (starship, rofi, the herdr picker) carry @color@ placeholders
that are substituted from the same palette at build time, so changing an accent
means editing one file.