# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Build Commands ```bash # Rebuild and switch to new configuration (desktop x86_64) sudo nixos-rebuild switch --flake ~/.config/nixos/#hakase # Rebuild MacBook configuration (aarch64) sudo nixos-rebuild switch --flake ~/.config/nixos/#macbook # Dry-run build to check for errors without applying sudo nixos-rebuild build --flake ~/.config/nixos/#hakase # Manage SOPS secrets nix-shell -p sops --run "sops secrets/secrets.yaml" nix-shell -p sops --run "sops updatekeys secrets/secrets.yaml" ``` ## Architecture Overview This is a modular, flake-based NixOS configuration supporting two hosts: `hakase` (x86_64 desktop) and `macbook` (aarch64 Apple Silicon). ### Key Entry Points - `flake.nix` - Declares inputs and creates both NixOS configurations (hakase, macbook) - `config.nix` - Central configuration values separated by host (hakase, macbook keys) - `hosts/{hakase,macbook}/configuration.nix` - Host-level entry points importing system modules - `home/hakase.nix` - Home Manager entry point for user environment (referenced from flake) ### Module Organization **Three-tier system:** 1. **System modules** (`modules/nixos/`) - NixOS-level settings (boot, kernel, services, hardware) 2. **Home Manager modules** (`modules/home/`) - User-level environment and applications 3. **Application configs** (`apps/`) - Per-application configuration directories with `default.nix` files Examples: - `apps/hyprland/default.nix` + `apps/hyprland/hypr/*.nix` - Hyprland compositor config - `apps/firefox/default.nix` - Browser with bookmarks and theming - `apps/ghostty/default.nix` - Terminal emulator - `apps/neovim/default.nix` - Editor (via nixovim external flake) ### Configuration Flow ``` flake.nix (outputs) ├─ hakase (x86_64-linux) │ ├─ hosts/hakase/configuration.nix │ │ └─ modules/nixos/default.nix (imports system modules) │ └─ home-manager │ └─ home/hakase.nix │ └─ modules/home/* (imports Home Manager modules) │ └─ apps/* (application configurations) │ └─ macbook (aarch64-linux) ├─ hosts/macbook/configuration.nix │ └─ modules/nixos/default.nix └─ Similar home-manager structure config.nix provides myConfig via specialArgs to both configurations ``` ### Configuration Structure (config.nix) The `config.nix` file defines host-specific configuration under `hakase` and `macbook` keys. Common values include: ```nix myConfig = { nixos = { username, hostname, timezone } git = { username, email, defaultBranch } theme = { mode } # "dark" or "light" terminal = { default, font, aliases } font = { monospace, monospaceScript, sans } hyprland = { monitors, wallpaper, kb_options } firefox = { bookmarks, newtabpage } # ... more app-specific configs } ``` To add a host-specific override, define it in the host's `myConfig` section in `config.nix`. The flake passes `allConfig.{hostname}` as specialArgs, so modules access the correct host configuration. ### Module Pattern Modules receive standard NixOS parameters plus custom ones: ```nix { pkgs, config, lib, myConfig, inputs, system, ... }: ``` **Key patterns:** - Access host config: `myConfig.nixos.username`, `myConfig.terminal.default` - Use host-specific packages: `pkgs.unstable` (from nixpkgs), `inputs.neovim` (from flake inputs) - Reference other modules via `config` (e.g., `config.home.homeDirectory`) - Conditional logic: Check `system` or `myConfig` values ### Secrets Management SOPS-encrypted secrets stored in `secrets/secrets.yaml`. Age key at `~/.config/sops/age/keys.txt`. In modules, reference secrets via: ```nix config.sops.secrets.secret_name.path ``` ## Key Technologies - **Hyprland** with UWSM (systemd user session management) - **Matugen** for automatic system-wide theming from wallpaper colors - **Home Manager** for user environment and program configuration - **nixovim** external flake for Neovim configuration (treesitter disabled due to read-only NixOS constraints) - **SOPS-Nix** for secrets encryption - **CachyOS kernel** on hakase (x86_64), **Asahi Linux** on macbook (aarch64) ## Git Commit Convention Use conventional commits with scope: `feat(scope):`, `fix(scope):`, `refactor:`, `add:`, `remove:`, `cleanup:` Common scopes: `nixos`, `home`, `apps`, `config`, `modules`, `hyprland`, `firefox`, etc.