This commit is contained in:
Morten Olsen
2025-12-15 11:42:42 +01:00
committed by Morten Olsen
commit f42a092b60
21 changed files with 4695 additions and 0 deletions

265
README.md Normal file
View File

@@ -0,0 +1,265 @@
# Nix Home Manager Dotfiles
A declarative, reproducible dotfiles configuration using [Nix](https://nixos.org/), [nix-darwin](https://github.com/LnL7/nix-darwin), and [Home Manager](https://github.com/nix-community/home-manager). This setup supports two profiles: **personal** and **work**, allowing different configurations for different machines while sharing common settings.
## Overview
This repository manages:
- **Shell environment**: Zsh with Starship prompt, Atuin history, Zoxide navigation, FZF fuzzy finder
- **Development tools**: Neovim, Tmux, Git with delta, lazygit
- **CLI utilities**: Modern replacements (eza, bat, ripgrep, fd, delta)
- **Container tools**: Docker, Colima, Kubernetes (kubectl, helm, k9s)
- **macOS applications**: Managed via Homebrew casks through nix-darwin
- **SSH configuration**: 1Password SSH agent integration with profile-specific hosts
- **Git configuration**: Profile-specific signing keys and project-based configs
## Prerequisites
### 1. Install Nix
Install Nix with flakes support:
```bash
# Install Nix (multi-user installation recommended for macOS)
curl -L https://nixos.org/nix/install | sh
# Restart your shell or source the nix profile
. /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
```
### 2. Enable Flakes
Create or edit `~/.config/nix/nix.conf`:
```bash
mkdir -p ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
```
### 3. Install Homebrew (macOS)
Homebrew is required for GUI applications (casks):
```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
### 4. Install 1Password
This configuration uses 1Password for SSH key management. Install 1Password and enable:
- **SSH Agent**: Settings → Developer → SSH Agent
- **CLI Integration**: Settings → Developer → Command-Line Interface (CLI)
## Quick Start
### Personal Machine Setup
```bash
# Clone the repository
git clone <repository-url> ~/.dotfiles
cd ~/.dotfiles
# Build and activate the personal configuration
make switch-personal
```
### Work Machine Setup
```bash
# Clone the repository
git clone <repository-url> ~/.dotfiles
cd ~/.dotfiles
# Build and activate the work configuration
make switch-work
```
## Makefile Commands
The project includes a Makefile for convenient operations. Run `make help` to see all available commands.
### Testing/Validation
| Command | Description |
|---------|-------------|
| `make check` | Run nix flake check to validate the flake |
| `make show` | Display the flake outputs |
| `make dry-run-personal` | Dry-run build for personal configuration |
| `make dry-run-work` | Dry-run build for work configuration |
### Building/Applying
| Command | Description |
|---------|-------------|
| `make switch-personal` | Apply personal configuration with darwin-rebuild |
| `make switch-work` | Apply work configuration with darwin-rebuild |
| `make build-personal` | Build personal configuration without switching |
| `make build-work` | Build work configuration without switching |
### Maintenance
| Command | Description |
|---------|-------------|
| `make update` | Update all flake inputs |
| `make update-nixpkgs` | Update only nixpkgs input |
| `make gc` | Run garbage collection to free disk space |
| `make gc-old` | Delete old generations and run garbage collection |
### Development
| Command | Description |
|---------|-------------|
| `make fmt` | Format all Nix files using nixfmt |
| `make lint` | Run statix linter on Nix files |
## Project Structure
```
.
├── flake.nix # Main flake entry point
├── flake.lock # Locked dependency versions
├── Makefile # Convenient make targets
├── README.md # This file
├── home/ # Home Manager configurations
│ ├── default.nix # Shared home configuration
│ ├── personal.nix # Personal profile overrides
│ └── work.nix # Work profile overrides
├── hosts/ # Machine-specific nix-darwin configs
│ ├── personal/
│ │ └── default.nix # Personal machine darwin settings
│ └── work/
│ └── default.nix # Work machine darwin settings
├── modules/ # Reusable Nix modules
│ ├── darwin/
│ │ └── homebrew.nix # Homebrew cask management
│ │
│ └── home/ # Home Manager modules
│ ├── apps.nix # Application configs (aerospace, jellyfin-tui)
│ ├── git.nix # Git configuration
│ ├── git-files.nix # Project-specific git configs
│ ├── packages.nix # CLI packages via Nix
│ ├── shell.nix # Shell environment (zsh, starship, etc.)
│ ├── ssh.nix # SSH configuration
│ └── tmux.nix # Tmux configuration
└── docs/ # Documentation
├── migration-analysis.md # Original migration analysis
├── nix-architecture.md # Architecture design
└── usage.md # Detailed usage guide
```
## Customization
### Adding New Packages
#### Via Nix (Preferred for CLI tools)
Edit [`modules/home/packages.nix`](modules/home/packages.nix:13):
```nix
home.packages = with pkgs; [
# Add your package here
your-package
];
```
#### Via Homebrew (For GUI apps/casks)
Edit [`modules/darwin/homebrew.nix`](modules/darwin/homebrew.nix:21):
```nix
casks = {
shared = [
# Add casks for all machines
"your-app"
];
personal = [
# Add casks for personal machine only
"personal-only-app"
];
};
```
### Modifying Shell Configuration
Edit [`modules/home/shell.nix`](modules/home/shell.nix:1) to customize:
- Shell aliases
- Environment variables
- Zsh settings
- Starship prompt
- Atuin history settings
### Modifying Git Configuration
Edit [`modules/home/git.nix`](modules/home/git.nix:1) for global settings, or the profile files:
- [`home/personal.nix`](home/personal.nix:20) - Personal git settings
- [`home/work.nix`](home/work.nix:23) - Work git settings
### Adding SSH Hosts
Edit [`modules/home/ssh.nix`](modules/home/ssh.nix:83) to add new SSH host configurations.
## Profile Differences
| Feature | Personal | Work |
|---------|----------|------|
| **Git Email** | Personal email | Work email |
| **Git Signing Key** | Personal SSH key | Work SSH key |
| **SSH Hosts** | github-private, gitea | github-private, github-zeronorth, coder |
| **Homebrew Casks** | All + personal apps | Shared apps only |
| **Personal Apps** | darktable, signal, proton-*, steam | - |
| **Jellyfin TUI** | Enabled | Disabled |
## Troubleshooting
### Build Errors
```bash
# Check flake validity
make check
# Build with verbose output
darwin-rebuild switch --flake .#personal --show-trace
```
### Rollback
```bash
# List generations
darwin-rebuild --list-generations
# Rollback to previous
darwin-rebuild --rollback
```
### Clean Rebuild
```bash
# Remove result symlink and rebuild
rm -f result
make gc
make switch-personal
```
### Homebrew Issues
```bash
# If Homebrew packages fail to install
brew update
brew doctor
make switch-personal
```
## Documentation
- [`docs/usage.md`](docs/usage.md) - Detailed usage guide
- [`docs/nix-architecture.md`](docs/nix-architecture.md) - Architecture design and module documentation
- [`docs/migration-analysis.md`](docs/migration-analysis.md) - Original migration analysis
## License
This is a personal dotfiles repository. Feel free to use it as inspiration for your own configuration.