1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
NixOS flake configuration for multiple machines (kronos, herra, mystra) using NixOS 25.11 and Home Manager 25.11. Features a layered architecture with swappable desktop rices.
## Common Commands
```bash
# Apply configuration (full rebuild and activation)
sudo nixos-rebuild switch
# Test configuration without making it the default boot option
sudo nixos-rebuild test
# Validate flake syntax and check for errors
nix flake check
# Preview what changes would be made
sudo nixos-rebuild dry-run
# Update flake inputs to latest versions
nix flake update
# Update specific input (e.g., nixpkgs)
nix flake lock --update-input nixpkgs
# Build for specific host
sudo nixos-rebuild switch --flake .#kronos
sudo nixos-rebuild switch --flake .#herra
sudo nixos-rebuild switch --flake .#mystra
```
## Architecture
```
flake.nix # Entry point - assigns rices to hosts
↓
hosts/{kronos,herra,mystra}/ # Per-machine (hostname + hardware)
↓
system/ # System-wide config (base only)
└─ boot, audio, bluetooth, networking, graphics
packages, programs, services, users, nix
↓
home/rices/{rice}/system.nix # Rice-level system config
└─ desktop.nix (X11 + i3wm) # Desktop environment
stylix.nix (theming) # Colors, fonts, cursor
↓
home/mun/ # User config
├─ programs/ # git, ssh, zsh
└─ (imports rice via specialArgs)
↓
home/rices/{rice}/default.nix # Rice home-manager modules
└─ alacritty, i3, nvim, helix, picom, etc.
```
## Key Files
- `flake.nix` - Entry point: defines inputs and outputs, assigns rices to hosts in `nixosConfigurations` (e.g., `kronos = mkSystem "kronos" "nord-blue"`)
- `hosts/*/configuration.nix` - Per-machine config (hostname, hardware imports, machine-specific overrides)
- `hosts/herra/configuration.nix` - Desktop: dual-boot with Windows 11 (GRUB OS prober), Zen kernel override
- `system/default.nix` - System module orchestrator (imports base system modules only, no desktop/stylix)
- `system/packages.nix` - System-wide packages
- `home/mun/default.nix` - User orchestrator: imports user programs and rice via `${rice}` specialArg
- `home/rices/*/system.nix` - Rice-level system config (desktop environment + stylix theming)
- `home/rices/*/default.nix` - Rice home-manager modules orchestrator
- `home/rices/*/variables.nix` - Rice color definitions (optional, some rices use system.nix for colors)
## Adding Configurations
**New system package:** Add to `system/packages.nix` under `environment.systemPackages`
**New user package:** Add to `home/mun/default.nix` under `home.packages` (supports fenix Rust toolchain, TeX Live combinations, RetroArch cores)
**New system module:** Create in `system/`, add to `system/default.nix` imports
**New user program:** Create in `home/mun/programs/`, add to `home/mun/default.nix` imports
**New rice module:** Create in target rice directory (e.g., `home/rices/nord-blue/mymodule.nix`), add to that rice's `default.nix` imports
**New rice:**
1. Create `home/rices/my-rice/` directory
2. Create `system.nix` with desktop environment and stylix config
3. Create `default.nix` (imports home-manager modules)
4. Create app-specific configs (i3.nix, terminal.nix, etc.)
5. Optional: create `variables.nix` for shared color variables
## Switching Rices
Rices are assigned per-host in `flake.nix`. Edit the `nixosConfigurations` section:
```nix
nixosConfigurations = {
kronos = mkSystem "kronos" "nord-blue"; # Laptop uses nord-blue
herra = mkSystem "herra" "cosmic"; # Desktop uses cosmic
mystra = mkSystem "mystra" "nord-blue"; # Another machine uses nord-blue
};
```
Then rebuild: `sudo nixos-rebuild switch`
Each rice is imported twice:
1. **System-level**: `home/rices/${rice}/system.nix` imported in flake (desktop + stylix)
2. **Home-level**: `home/rices/${rice}` imported in `home/mun/default.nix` via specialArgs (app configs)
## Important Architecture Details
**Overlays:** Flake provides `pkgs.unstable.*` for accessing bleeding-edge packages from nixpkgs-unstable while staying on stable 25.11
**NixOwOs Integration:** Enabled in `home/mun/default.nix` for NixOS branding/theming (os-release customization, overlays)
**Machine Separation:** Host configs are intentionally minimal (hostname + hardware-configuration import + optional overrides). All shared system config lives in `system/`, all shared user config in `home/mun/`
**Rice Architecture:** Rices span both system and home-manager:
- `system.nix` in each rice configures desktop environment (X11 + i3wm) and stylix theming
- `default.nix` in each rice imports home-manager modules (terminal, editor, compositor, etc.)
- System-level desktop/stylix was moved from `system/` to per-rice to allow different DEs per rice
**Stylix:** System-level theming framework imported at flake level, configured in each rice's `system.nix` (base16 colors, fonts, cursor, opacity, wallpaper)
**mkSystem Helper:** The `mkSystem` function in flake.nix takes (hostname, rice) and:
1. Imports host config from `hosts/${hostname}/configuration.nix`
2. Imports base system modules from `system/`
3. Imports rice system config from `home/rices/${rice}/system.nix`
4. Passes rice name to home-manager via specialArgs for user-level rice import
**Available Rices:**
- `nord-blue` - Complete: alacritty, i3, nvim, helix, picom, fastfetch
- `original` - Complete: kitty, i3, polybar, rofi, dunst, neovim, nnn, picom
- `cosmic` - Minimal/incomplete: only fluxbox.nix (work in progress)
|