Compare commits
2 Commits
main
...
4029eae7aa
| Author | SHA1 | Date | |
|---|---|---|---|
| 4029eae7aa | |||
| 022e5b17a0 |
159
CLAUDE.md
Normal file
159
CLAUDE.md
Normal file
@@ -0,0 +1,159 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with
|
||||
code in this repository.
|
||||
|
||||
## Overview
|
||||
|
||||
This is a NixOS flake-based configuration repository managing both system
|
||||
configurations (NixOS) and user environments (home-manager). The repository
|
||||
follows a modular architecture with separate host configurations for physical
|
||||
machines, VMs, and standalone home-manager setups.
|
||||
|
||||
## Essential Commands
|
||||
|
||||
### Building and Testing
|
||||
|
||||
```bash
|
||||
# Build a NixOS system configuration
|
||||
nix build -L '.#nixosConfigurations.<hostname>.config.system.build.toplevel'
|
||||
|
||||
# Build and run a VM with disko
|
||||
nix build -L '.#nixosConfigurations.vm.config.system.build.vmWithDisko'
|
||||
./result/bin/disko-vm
|
||||
|
||||
# Build home-manager configuration
|
||||
nix build -L '.#homeConfigurations.work.activationPackage'
|
||||
|
||||
# Build the custom neovim package
|
||||
nix build -L '.#nvim.packages.x86_64-linux.nvim'
|
||||
```
|
||||
|
||||
### Development
|
||||
|
||||
```bash
|
||||
# Update flake inputs
|
||||
nix flake update
|
||||
|
||||
# Check flake for errors
|
||||
nix flake check
|
||||
|
||||
# Show flake outputs
|
||||
nix flake show
|
||||
|
||||
# Enter development shell for neovim
|
||||
cd dots/.config/nvim && nix develop
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
### Repository Structure
|
||||
|
||||
The repository is organized into distinct layers:
|
||||
|
||||
- **`flake.nix`**: Root flake defining inputs and outputs. Uses `utils.dirNames` to automatically discover host directories.
|
||||
- **`hosts/`**: NixOS system configurations (andromache, astyanax, vm). Each host has its own directory with `default.nix` and hardware configuration.
|
||||
- **`home/`**: home-manager configurations, split into `hosts/` (per-host configs) and `modules/` (reusable user-level modules).
|
||||
- **`modules/`**: Reusable NixOS modules for system-level configuration (audio, networking, fonts, etc.).
|
||||
- **`dots/`**: Dotfiles and configurations, including a complete neovim flake at `dots/.config/nvim/`.
|
||||
- **`utils/`**: Helper functions like `dirNames` for discovering directories.
|
||||
|
||||
### Key Architectural Patterns
|
||||
|
||||
**Host Discovery**: The flake uses `lib.genAttrs hostDirNames` to automatically
|
||||
generate `nixosConfigurations` from directories in `hosts/`. Adding a new host
|
||||
only requires creating a directory with a `default.nix`.
|
||||
|
||||
**Secrets Management**: Uses sops-nix with age encryption. Secrets are stored
|
||||
in a separate private repository (`nix-secrets`) referenced as a flake input.
|
||||
The `modules/secrets/default.nix` module provides options and templates for
|
||||
injecting secrets into configurations.
|
||||
|
||||
**Disk Management**: Uses disko for declarative disk partitioning. The
|
||||
`modules/disko.zfs-encrypted-root.nix` module provides a reusable ZFS-on-root
|
||||
setup with encryption, taking a `device` parameter.
|
||||
|
||||
**Neovim as Flake**: The neovim configuration at `dots/.config/nvim/` is a
|
||||
standalone flake using nixCats. It's referenced as a flake input in the root
|
||||
and included in system packages. This allows independent development and
|
||||
version control.
|
||||
|
||||
**Home Manager Integration**: Each NixOS host can include home-manager
|
||||
configuration through `home-manager.users.<username>`, which imports from
|
||||
`home/hosts/<hostname>`. Standalone home-manager configurations (like `work`)
|
||||
are also available for non-NixOS systems.
|
||||
|
||||
**Module Parameterization**: Modules like `networking.nix` and
|
||||
`secrets/default.nix` accept parameters and expose options, making them
|
||||
reusable across hosts with different settings.
|
||||
|
||||
### Input Dependencies
|
||||
|
||||
- **nixpkgs**: Main package source (nixos-unstable)
|
||||
- **nixos-hardware**: Hardware-specific configurations
|
||||
- **disko**: Declarative disk partitioning
|
||||
- **sops-nix**: Secrets management with age/sops
|
||||
- **nix-secrets**: Private repository with encrypted secrets (git+ssh)
|
||||
- **home-manager**: User environment management
|
||||
- **nixgl**: OpenGL wrapper for non-NixOS systems
|
||||
- **firefox-addons**: Firefox extension packages
|
||||
- **nvim**: Local flake at `dots/.config/nvim/`
|
||||
|
||||
## Working with Hosts
|
||||
|
||||
### Adding a New NixOS Host
|
||||
|
||||
1. Create a new directory in `hosts/<hostname>/`
|
||||
2. Add `default.nix` with imports and host-specific configuration
|
||||
3. Add `hard.nix` for hardware configuration (generated by nixos-generate-config)
|
||||
4. The host will automatically be discovered by the flake
|
||||
|
||||
### Adding a New Home Manager Host
|
||||
|
||||
1. Create directory in `home/hosts/<hostname>/`
|
||||
2. Add `default.nix` importing desired modules from `home/modules/`
|
||||
3. For standalone (non-NixOS) configs, add entry to `homeConfigurations` in root `flake.nix`
|
||||
|
||||
## Secrets Workflow
|
||||
|
||||
Secrets are managed with sops-nix and stored in the private `nix-secrets` repository:
|
||||
|
||||
1. Secrets are encrypted with age using keys at `~/.config/sops/age/keys.txt`
|
||||
2. The `modules/secrets/default.nix` module reads from `${nix-secrets}/secrets.yaml`
|
||||
3. Secrets are exposed as files in `/run/secrets/` with proper ownership
|
||||
4. Templates can combine multiple secrets (see taskwarrior sync configuration)
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Import Patterns
|
||||
|
||||
Modules use different import patterns based on their needs:
|
||||
|
||||
```nix
|
||||
# Simple module (no parameters)
|
||||
imports = [ ../../modules/audio.nix ];
|
||||
|
||||
# Parameterized module (function call)
|
||||
imports = [ (import ../../modules/networking.nix { hostName = "andromache"; }) ];
|
||||
|
||||
# Module with all parameters
|
||||
imports = [
|
||||
(import ../../modules/secrets {
|
||||
inherit lib inputs config;
|
||||
})
|
||||
];
|
||||
```
|
||||
|
||||
### Special Args
|
||||
|
||||
- `inputs`: Flake inputs, passed as `specialArgs` to NixOS and `extraSpecialArgs` to home-manager
|
||||
- `lib`, `config`, `pkgs`: Standard NixOS/home-manager module arguments
|
||||
|
||||
### Username Handling
|
||||
|
||||
Each host defines a `username` variable (either "h" or "hektor") used for:
|
||||
|
||||
- User creation in NixOS
|
||||
- Home directory paths
|
||||
- Secrets ownership
|
||||
- Home-manager configuration
|
||||
12
dots/.config/nvim/snips/typescriptreact.lua
Normal file
12
dots/.config/nvim/snips/typescriptreact.lua
Normal file
@@ -0,0 +1,12 @@
|
||||
local ls = require("luasnip")
|
||||
local s = ls.snippet
|
||||
local t = ls.text_node
|
||||
local i = ls.insert_node
|
||||
|
||||
return {
|
||||
s("preJ", {
|
||||
t("<pre>{JSON.stringify("),
|
||||
i(1, "object"), -- first tab stop
|
||||
t(", null, 2)}</pre>"),
|
||||
}),
|
||||
}
|
||||
Reference in New Issue
Block a user