# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Architecture: Dendritic Pattern This config uses the **[den](https://github.com/vic/den)** framework with the **dendritic pattern** — configurations are composed from reusable *aspects* rather than per-host files. Key concepts: - **Aspects** (`den.aspects.`) — named, composable feature modules. Each aspect can define `nixos` (system config) and/or `homeManager` (user config) blocks. - **Hosts** (`den.hosts.x86_64-linux.`) — defined in `modules/den.nix`, each assigned an aspect that lists its includes. - **`import-tree`** — automatically imports all `.nix` files under `modules/`, so adding a new file is enough to register it. - **`flake-aspects`** — wires the den module system into the flake output. Host→aspect mapping (from `modules/den.nix`): - `desktop` — gaming + dev + creative, Nvidia GPU - `notebook` — portable dev + creative, Intel GPU - `work` — portable dev only, no gaming/creative ## Module layout ``` modules/ den.nix # host declarations and aspect composition output.nix # exposes flake.nixosConfigurations option identity.nix # local.identity options (username, email, SSH key) core.nix # base: nix settings, caches, locale, base packages services.nix # shared system services wayland.nix # Wayland env vars niri.nix # niri compositor + quickshell bar + display tools dev.nix # dev tools, LSPs, Docker, JDKs (system-level) portable.nix # power management, TLP, firewall desktop.nix # desktop-specific hardware/packages notebook.nix # notebook-specific packages work.nix # work-specific packages secrets.nix # sops-nix integration _hardware/ # per-host hardware-configuration.nix files _home/ # home-manager modules (imported by den.aspects.zoty) default.nix # zsh, direnv, common home packages (firefox, kitty, claude-code) niri.nix # niri home config git.nix # git identity theme.nix # GTK/icon theme cursor.nix # cursor theme dolphin.nix # file manager xdg-dirs.nix # XDG directory overrides quickshell/ # QML bar widgets (quickshell + qml-niri) ``` ## Common commands ```bash just switch # rebuild + switch (uses current hostname) just switch desktop # target a specific host just build # build only, don't switch just test # apply temporarily (reverts on next boot) just diff # show what changed vs running system just check # evaluate flake for errors just update # update all flake inputs just update-input nixpkgs # update a single input just gc # garbage collect (>7 days old) just repl # nix repl with flake loaded just secrets # edit SOPS-encrypted secrets just iso # build installer ISO ``` ## Inputs | Input | Channel | Role | |---|---|---| | `nixpkgs` | nixos-25.11 | stable packages | | `nixpkgs-unstable` | nixos-unstable | neovim, JDKs, some dev tools | | `home-manager` | release-25.11 | user environment | | `sops-nix` | — | secret decryption at boot | | `niri-flake` | — | niri compositor | | `disko` | — | declarative disk partitioning | | `claude-code` | sadjow/claude-code-nix | claude-code CLI | | `qml-niri` | imiric/qml-niri | quickshell niri integration | ## Secrets (SOPS + age) - Encrypted in `secrets/secrets.yaml`, decrypted at boot by sops-nix. - Age key must exist at `/etc/sops/age/keys.txt` before first deploy. - New secrets: add to `just secrets`, then declare in `modules/secrets.nix`. - New host key: add public key to `.sops.yaml`, then run `sops updatekeys secrets/secrets.yaml`. ## Adding a new host 1. Copy hardware config to `modules/_hardware/-hardware.nix`. 2. Add `den.hosts.x86_64-linux.` in `modules/den.nix`. 3. Define a `den.aspects.` with the desired `includes` list. ## Identity Global identity (username, full name, email, SSH key) is declared as NixOS options in `modules/identity.nix` and passed to home-manager modules via `specialArgs`. Override `local.identity.*` options in a host aspect when needed.