diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..424fced --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,110 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Repository Overview + +This is a NixOS configuration repository using flakes, managing multiple machines and home-manager configurations. The repository follows a modular architecture with reusable "roles" that can be composed for different machines. + +## Architecture + +### Flake Structure +- **flake.nix**: Main entry point defining inputs (nixpkgs, home-manager, plasma-manager, etc.) and outputs for multiple NixOS configurations +- **Machines**: `nix-book`, `boxy`, `wixos` (WSL configuration) +- **Home configurations**: Standalone home-manager configuration for user `johno` + +### Directory Structure +- `machines/`: Machine-specific configurations with hardware-configuration.nix +- `roles/`: Modular system configurations (audio, bluetooth, desktop, users, etc.) +- `home/`: Home Manager configurations and user-specific modules +- `home/modules/`: User environment modules (emacs, i3+sway, plasma-manager, tmux) +- `packages/`: Custom package definitions + +### Role-Based Configuration System +The repository uses a custom "roles" system where each role is a NixOS module with enable options: +- `roles.desktop`: Desktop environment with sub-options for X11, Wayland, KDE, gaming, SDDM +- `roles.audio`: Audio configuration +- `roles.bluetooth`: Bluetooth support +- `roles.users`: User account management +- `roles.virtualisation`: Virtualization setup +- `roles.kodi`: Kodi media center + +Example role usage in machine configuration: +```nix +roles = { + audio.enable = true; + desktop = { + enable = true; + gaming = true; + kde = true; + wayland = true; + }; + users.enable = true; +}; +``` + +## Common Commands + +### Building and Switching Configurations +```bash +# Build and switch to a specific machine configuration +sudo nixos-rebuild switch --flake .# + +# Build without switching +nixos-rebuild build --flake .# + +# Build home-manager configuration only +home-manager switch --flake .#johno +``` + +### Available Machine Configurations +- `nix-book`: Uses `home/home-nix-book.nix` +- `boxy`: Gaming desktop with AMD GPU, uses `home/home.nix` +- `wixos`: WSL configuration, uses `home/home.nix` + +### Flake Operations +```bash +# Update flake inputs +nix flake update + +# Check flake +nix flake check + +# Show flake info +nix flake show +``` + +### Bootstrap New Machine +Use the provided bootstrap script: +```bash +sudo ./bootstrap.sh +``` +This script pulls from the remote git repository and applies the configuration. + +## Development Workflow + +### Adding New Machines +1. Create new directory in `machines//` +2. Add `configuration.nix` with role assignments +3. Include hardware-configuration.nix (generated by nixos-generate-config) +4. Add nixosConfiguration to flake.nix outputs + +### Adding New Roles +1. Create directory in `roles//` +2. Create `default.nix` with module definition using mkEnableOption +3. Add role import to `roles/default.nix` +4. Configure role options in machine configurations + +### Home Manager Modules +- Located in `home/modules/` +- Each module has its own `default.nix` +- Imported in main home configuration files + +## Key Configuration Details + +- **Experimental features**: nix-command and flakes are enabled +- **User**: Primary user is `johno` with trusted-user privileges +- **Locale**: en_US.UTF-8, America/Los_Angeles timezone +- **SSH**: OpenSSH enabled on all configurations +- **Garbage collection**: Automatic, deletes older than 10 days +- **Unfree packages**: Allowed globally \ No newline at end of file