This commit is contained in:
2025-11-15 23:17:12 +08:00
parent 6f3ea7bb47
commit 389e780660
18 changed files with 1597 additions and 90 deletions
+4
View File
@@ -0,0 +1,4 @@
# Automatically load nix flake devShell when entering this directory
# Requires direnv to be installed and hooked into your shell
use flake
+24
View File
@@ -0,0 +1,24 @@
# Nix build results
result
result-*
# Direnv
.direnv/
.envrc.cache
# Editor files
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store
# Backup files
*.backup
*.bak
# Hardware configuration (may contain sensitive info)
# Uncomment if you don't want to commit it:
# nixos/hardware-configuration.nix
+296
View File
@@ -0,0 +1,296 @@
# Installation Guide
## First-Time Setup
### On macOS
#### 1. Install Nix (if not already installed)
```bash
sh <(curl -L https://nixos.org/nix/install)
```
#### 2. Enable Flakes
Create or edit `~/.config/nix/nix.conf`:
```bash
mkdir -p ~/.config/nix
cat <<EOF > ~/.config/nix/nix.conf
experimental-features = nix-command flakes
EOF
```
Restart your terminal or run:
```bash
. /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
```
#### 3. Configure Your System
Edit the following files:
**In `flake.nix`:**
- Line 82-97: Replace `your-hostname` with your actual hostname (run `hostname` to find it)
- Line 94: Replace `your-username` with your actual username (run `whoami`)
**In `darwin/configuration.nix`:**
- Line 33-34: Set your hostname
- Line 45: Set your architecture:
- Apple Silicon (M1/M2/M3): `"aarch64-darwin"`
- Intel: `"x86_64-darwin"`
- Line 48-51: Set your username
**In `home-manager/home.nix`:**
- Line 30: Set your username
**In `home-manager/development.nix`** (optional):
- Uncomment lines for your git name and email
#### 4. Build and Apply
```bash
# Build the darwin configuration (first time)
nix build .#darwinConfigurations.YOUR-HOSTNAME.system --extra-experimental-features "nix-command flakes"
# Apply it
./result/sw/bin/darwin-rebuild switch --flake .#YOUR-HOSTNAME
```
After the first successful build, you can use:
```bash
darwin-rebuild switch --flake .#YOUR-HOSTNAME
```
#### 5. Reload Your Shell
Close and reopen your terminal, or source your shell config:
```bash
# For zsh:
source ~/.zshrc
# For fish:
source ~/.config/fish/config.fish
# For bash:
source ~/.bashrc
```
### On NixOS
#### 1. Clone This Repository
```bash
# As root or with sudo
cd /etc/nixos
git clone <your-repo-url> .
# Or copy your files to /etc/nixos
```
#### 2. Configure Your System
Edit the following files:
**In `flake.nix`:**
- Line 59-75: Replace `your-hostname` with your actual hostname
- Line 72: Replace `your-username` with your actual username
**In `nixos/configuration.nix`:**
- Line 38: Set your hostname
- Line 43-54: Configure your user account
- Uncomment line 47-51 if you want to set an initial password
**In `home-manager/home.nix`:**
- Line 30: Set your username
**In `home-manager/development.nix`** (optional):
- Uncomment lines for your git name and email
#### 3. Generate Hardware Configuration
If you haven't already:
```bash
sudo nixos-generate-config --show-hardware-config > nixos/hardware-configuration.nix
```
#### 4. Build and Apply
```bash
sudo nixos-rebuild switch --flake .#YOUR-HOSTNAME
```
#### 5. Reboot (optional but recommended)
```bash
sudo reboot
```
## Updating Your Configuration
### Update Flake Inputs (packages)
```bash
nix flake update
```
Then rebuild:
```bash
# macOS:
darwin-rebuild switch --flake .#YOUR-HOSTNAME
# NixOS:
sudo nixos-rebuild switch --flake .#YOUR-HOSTNAME
```
### Making Configuration Changes
1. Edit the relevant configuration files
2. Rebuild and switch:
```bash
# macOS:
darwin-rebuild switch --flake .
# NixOS:
sudo nixos-rebuild switch --flake .
```
### Testing Changes Before Applying
```bash
# macOS:
darwin-rebuild build --flake .
# NixOS:
sudo nixos-rebuild build --flake .
```
If the build succeeds, you can then apply with `switch`.
## Common Customizations
### Add User Packages
Edit `home-manager/common.nix`, `home-manager/development.nix`, or the platform-specific files:
```nix
home.packages = with pkgs; [
firefox
vscode
ripgrep
];
```
### Enable a Program
Most programs can be enabled via home-manager options:
```nix
programs.firefox.enable = true;
programs.git = {
enable = true;
userName = "Your Name";
userEmail = "you@example.com";
};
```
### Add System Packages
Edit `common.nix` or the platform-specific configuration:
```nix
environment.systemPackages = with pkgs; [
vim
wget
curl
];
```
### Customize Shell
Edit `home-manager/shell.nix` to configure bash, zsh, fish, or starship prompt.
### macOS System Defaults
Edit `darwin/configuration.nix` to customize macOS behavior (Dock, Finder, keyboard, etc.).
## Troubleshooting
### Build Fails with "experimental Nix feature 'flakes' is disabled"
Make sure you've enabled flakes in `~/.config/nix/nix.conf`:
```
experimental-features = nix-command flakes
```
### "error: collision between..."
This means two packages are trying to install the same files. Check for:
- Duplicate packages in system and home-manager configs
- Conflicting package versions
### macOS: "Could not find nix-darwin"
On first install, you need to build with the full path:
```bash
nix build .#darwinConfigurations.YOUR-HOSTNAME.system
./result/sw/bin/darwin-rebuild switch --flake .
```
### Home Manager File Conflicts
If home-manager tries to manage files that already exist, back them up:
```bash
# Create backups of existing files
for file in ~/.bashrc ~/.zshrc ~/.config/fish/config.fish; do
[ -f "$file" ] && mv "$file" "$file.backup"
done
```
Or use the backup flag:
```bash
home-manager switch --flake . --backup-extension .backup
```
### Can't Find Your Hostname
```bash
# macOS and Linux:
hostname
# If it's not what you expect, you can change it:
# macOS (temporarily):
sudo scutil --set HostName your-new-hostname
# NixOS: Set in configuration.nix
```
### Rollback to Previous Generation
If a new configuration breaks something:
```bash
# macOS:
darwin-rebuild --rollback
# NixOS:
sudo nixos-rebuild --rollback
```
## Next Steps
After installation:
1. **Customize your configuration** - Edit the home-manager modules to suit your workflow
2. **Add your development tools** - Uncomment languages/tools you need in `development.nix`
3. **Configure Git** - Set your name and email in `development.nix`
4. **Set up shell** - Choose your preferred shell and customize in `shell.nix`
5. **Explore options** - Check out [Home Manager options](https://nix-community.github.io/home-manager/options.html)
## Getting Help
- [NixOS Discourse](https://discourse.nixos.org/)
- [Nix Discord](https://discord.gg/RbvHtGa)
- [r/NixOS](https://www.reddit.com/r/NixOS/)
- [Nix Documentation](https://nixos.org/learn.html)
+70
View File
@@ -0,0 +1,70 @@
.PHONY: help darwin-build darwin-switch nixos-build nixos-switch home-build home-switch update clean fmt check
# Default target
help:
@echo "Available targets:"
@echo " make darwin-build - Build darwin configuration (macOS)"
@echo " make darwin-switch - Build and activate darwin configuration"
@echo " make nixos-build - Build NixOS configuration (Linux)"
@echo " make nixos-switch - Build and activate NixOS configuration"
@echo " make home-build - Build home-manager configuration (standalone)"
@echo " make home-switch - Build and activate home-manager configuration"
@echo " make update - Update flake inputs"
@echo " make fmt - Format nix files"
@echo " make check - Check flake"
@echo " make clean - Clean build artifacts and old generations"
@echo ""
@echo "Note: Set HOSTNAME variable to use a specific host, e.g.:"
@echo " make darwin-switch HOSTNAME=macbook"
# Auto-detect hostname
HOSTNAME ?= $(shell hostname | cut -d. -f1)
USERNAME ?= $(shell whoami)
# macOS targets
darwin-build:
nix build .#darwinConfigurations.$(HOSTNAME).system
darwin-switch:
darwin-rebuild switch --flake .#$(HOSTNAME)
# NixOS targets
nixos-build:
nixos-rebuild build --flake .#$(HOSTNAME)
nixos-switch:
sudo nixos-rebuild switch --flake .#$(HOSTNAME)
# Home Manager targets (standalone)
home-build:
home-manager build --flake .#$(USERNAME)@$(HOSTNAME)
home-switch:
home-manager switch --flake .#$(USERNAME)@$(HOSTNAME)
# Maintenance
update:
nix flake update
fmt:
nix fmt
check:
nix flake check
clean:
@echo "Cleaning old generations..."
@if [ "$$(uname)" = "Darwin" ]; then \
nix-collect-garbage -d; \
darwin-rebuild --list-generations | tail -5; \
else \
sudo nix-collect-garbage -d; \
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | tail -5; \
fi
# Git helpers (optional)
.PHONY: commit-update
commit-update:
git add flake.lock
git commit -m "chore: update flake inputs"
+260
View File
@@ -0,0 +1,260 @@
# Quick Start Guide
## TL;DR
### macOS Setup (3 steps)
```bash
# 1. Configure your info
export USERNAME="your-username"
export HOSTNAME="your-hostname"
# Edit these files and replace placeholders:
# - flake.nix (line 82-94)
# - darwin/configuration.nix (lines 33, 45, 48)
# - home-manager/home.nix (line 30)
# 2. Build (first time only)
nix build .#darwinConfigurations.$HOSTNAME.system --extra-experimental-features "nix-command flakes"
./result/sw/bin/darwin-rebuild switch --flake .#$HOSTNAME
# 3. Apply (after first time)
darwin-rebuild switch --flake .
```
### Linux/NixOS Setup (2 steps)
```bash
# 1. Configure your info
# Edit flake.nix, nixos/configuration.nix, home-manager/home.nix
# Replace placeholders with your username and hostname
# 2. Apply
sudo nixos-rebuild switch --flake .#your-hostname
```
---
## What You Get
### ✅ Cross-Platform Support
- Same config works on macOS (via nix-darwin) and Linux (NixOS)
- Automatic platform detection
- Shared home-manager configuration
### ✅ Modular Home Manager
Your user environment is organized into:
- **common.nix** - Basic tools (git, ripgrep, etc.)
- **development.nix** - Dev tools (gh, lazygit, direnv)
- **shell.nix** - Shell config (bash/zsh/fish + starship prompt)
- **terminal.nix** - Terminal apps (tmux, neovim, alacritty)
- **linux.nix** - Linux-specific GUI apps
- **darwin.nix** - macOS-specific integrations
### ✅ Great Defaults
- Modern CLI tools (ripgrep, fd, bat, eza, zoxide, fzf)
- Starship prompt with git integration
- Syntax highlighting and autosuggestion
- Git aliases and better defaults
- macOS system preferences (dock, finder, keyboard)
- Automatic garbage collection
- Nix flakes enabled
### ✅ Easy Maintenance
```bash
# Update everything
make update && make darwin-switch # or make nixos-switch
# Format code
make fmt
# Clean old generations
make clean
```
---
## File Structure Quick Reference
```
├── flake.nix ← Define all your systems here
├── common.nix ← Shared Nix settings
├── darwin/ ← macOS system config
│ └── configuration.nix
├── nixos/ ← Linux system config
│ └── configuration.nix
└── home-manager/ ← Your user environment (SHARED!)
├── home.nix ← Main entry point
├── common.nix ← Base config
├── development.nix ← Dev tools
├── shell.nix ← Shell setup
├── terminal.nix ← Terminal apps
├── linux.nix ← Linux-only
└── darwin.nix ← macOS-only
```
---
## Common Tasks
### Add a Package
**User package** (recommended):
```nix
# home-manager/common.nix
home.packages = with pkgs; [
firefox
your-package-here
];
```
**System package**:
```nix
# common.nix or darwin/configuration.nix or nixos/configuration.nix
environment.systemPackages = with pkgs; [
your-package-here
];
```
### Enable a Program
```nix
# In any home-manager/*.nix file
programs.firefox.enable = true;
programs.vscode = {
enable = true;
extensions = with pkgs.vscode-extensions; [
bbenoist.nix
];
};
```
### Platform-Specific Packages
```nix
# In home-manager/common.nix or development.nix
home.packages = with pkgs; [
# Shared
ripgrep
fd
] ++ lib.optionals stdenv.isDarwin [
# macOS only
] ++ lib.optionals stdenv.isLinux [
# Linux only
];
```
### Change Shell
```nix
# In home-manager/shell.nix, set enable = true for your preferred shell:
programs.fish.enable = true; # Fish (recommended)
programs.zsh.enable = true; # Zsh
programs.bash.enable = true; # Bash
```
Then on macOS, set in `darwin/configuration.nix`:
```nix
programs.fish.enable = true; # or zsh/bash
```
On NixOS, set in `nixos/configuration.nix`:
```nix
users.users.your-username.shell = pkgs.fish; # or zsh/bash
```
### Add SSH Keys
macOS:
```nix
# darwin/configuration.nix
users.users.your-username = {
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAA... your-key"
];
};
```
NixOS:
```nix
# nixos/configuration.nix
users.users.your-username = {
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAA... your-key"
];
};
```
### Multiple Machines
Add entries in `flake.nix`:
```nix
darwinConfigurations = {
macbook = darwin.lib.darwinSystem { ... };
mac-mini = darwin.lib.darwinSystem { ... };
};
nixosConfigurations = {
desktop = nixpkgs.lib.nixosSystem { ... };
laptop = nixpkgs.lib.nixosSystem { ... };
};
```
Then build with:
```bash
darwin-rebuild switch --flake .#macbook
# or
sudo nixos-rebuild switch --flake .#desktop
```
---
## Troubleshooting One-Liners
```bash
# Check flake is valid
nix flake check
# Show flake outputs
nix flake show
# Build without switching (test)
darwin-rebuild build --flake . # macOS
sudo nixos-rebuild build --flake . # Linux
# Rollback
darwin-rebuild --rollback # macOS
sudo nixos-rebuild --rollback # Linux
# Force rebuild
darwin-rebuild switch --flake . --recreate-lock-file
# View current generation
darwin-rebuild --list-generations # macOS
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system # Linux
```
---
## Next Steps
1. ⚙️ **Customize `home-manager/development.nix`** - Add your dev tools
2. 🎨 **Tweak `home-manager/shell.nix`** - Customize your prompt and aliases
3. 🖥️ **Adjust `darwin/configuration.nix`** - Set macOS preferences
4. 📦 **Add packages** - Browse [search.nixos.org](https://search.nixos.org)
5. 🔧 **Create modules** - Extract common patterns into `modules/home-manager/`
---
## Help & Resources
- 📖 [Full README](./README.md) - Complete documentation
- 🚀 [INSTALL.md](./INSTALL.md) - Detailed installation guide
- 🔍 [NixOS Search](https://search.nixos.org) - Find packages and options
- 💬 [NixOS Discourse](https://discourse.nixos.org) - Community forum
- 🎮 [Nix Discord](https://discord.gg/RbvHtGa) - Real-time chat
+249
View File
@@ -0,0 +1,249 @@
# Cross-Platform Nix Configuration
A modular Nix configuration that works on both macOS (via nix-darwin) and Linux (NixOS), with maximum config sharing through home-manager.
## Structure
```
├── flake.nix # Main flake configuration
├── common.nix # Shared system-level config (NixOS & nix-darwin)
├── darwin/ # macOS system configuration
│ └── configuration.nix
├── nixos/ # NixOS system configuration
│ ├── configuration.nix
│ └── hardware-configuration.nix
├── home-manager/ # User environment (shared across platforms)
│ ├── home.nix # Main home-manager config
│ ├── common.nix # Base configuration
│ ├── development.nix # Development tools
│ ├── shell.nix # Shell configuration
│ ├── terminal.nix # Terminal apps & utilities
│ ├── linux.nix # Linux-specific overrides
│ └── darwin.nix # macOS-specific overrides
├── modules/
│ ├── home-manager/ # Shared home-manager modules
│ ├── nixos/ # NixOS-specific modules
│ └── darwin/ # nix-darwin-specific modules
├── overlays/ # Package overlays
│ └── default.nix
└── pkgs/ # Custom packages
└── default.nix
```
## Getting Started
### Prerequisites
**On macOS:**
1. Install Nix: `sh <(curl -L https://nixos.org/nix/install)`
2. Enable flakes by adding to `~/.config/nix/nix.conf`:
```
experimental-features = nix-command flakes
```
**On NixOS:**
Flakes should be enabled via this configuration.
### Configuration Steps
1. **Update your username and hostname:**
- In `flake.nix`: Replace `your-username` and `your-hostname` in the configurations
- In `home-manager/home.nix`: Update the username
- In `darwin/configuration.nix` or `nixos/configuration.nix`: Update hostname and user settings
2. **Set your architecture** (macOS):
- In `darwin/configuration.nix`, set `nixpkgs.hostPlatform` to either:
- `"aarch64-darwin"` (Apple Silicon)
- `"x86_64-darwin"` (Intel)
3. **Configure Git identity** (optional):
- In `home-manager/development.nix`, uncomment and set:
```nix
userName = "Your Name";
userEmail = "your.email@example.com";
```
### Building & Activating
**On macOS (first time):**
```bash
# Build the darwin configuration
nix build .#darwinConfigurations.your-hostname.system
# Activate it
./result/sw/bin/darwin-rebuild switch --flake .#your-hostname
```
**On macOS (subsequent builds):**
```bash
darwin-rebuild switch --flake .#your-hostname
```
**On NixOS:**
```bash
sudo nixos-rebuild switch --flake .#your-hostname
```
**Standalone home-manager** (if not using system integration):
```bash
home-manager switch --flake .#your-username@your-hostname
```
## Key Features
### Platform-Aware Configuration
The configuration automatically detects the platform using `pkgs.stdenv.isDarwin` and `pkgs.stdenv.isLinux`:
- Home directory: Automatically uses `/Users/` on macOS, `/home/` on Linux
- Platform-specific packages and services are conditionally enabled
- Shared configuration in `common.nix` for consistent experience
### Modular Home-Manager
Your user environment is split into logical modules:
- **common.nix**: Basic tools everyone needs (git, ripgrep, etc.)
- **development.nix**: Development tools (languages, IDEs, etc.)
- **shell.nix**: Shell configuration (bash, zsh, fish, starship)
- **terminal.nix**: Terminal applications (tmux, neovim, alacritty)
- **linux.nix**: Linux-specific GUI apps and services
- **darwin.nix**: macOS-specific apps and integrations
### Shared System Configuration
`common.nix` is imported by both NixOS and nix-darwin configurations, providing:
- Unified Nix settings (flakes, garbage collection, etc.)
- Shared package overlays
- Consistent nixpkgs configuration
### Easy to Extend
- Add new home-manager modules in `modules/home-manager/`
- Add platform-specific modules in `modules/nixos/` or `modules/darwin/`
- Add custom packages in `pkgs/`
- Add overlays in `overlays/`
## Customization Tips
### Adding Packages
**User packages** (home-manager):
Add to the appropriate module:
- `home-manager/common.nix` for shared packages
- `home-manager/linux.nix` for Linux-only
- `home-manager/darwin.nix` for macOS-only
- `home-manager/development.nix` for dev tools
**System packages**:
Add to `common.nix` for shared system packages, or to the platform-specific config.
### Enabling Programs
Most programs can be enabled via home-manager:
```nix
programs.firefox.enable = true;
programs.vscode.enable = true;
```
Check [home-manager options](https://nix-community.github.io/home-manager/options.html) for available programs.
### Multiple Machines
Add more configurations in `flake.nix`:
```nix
darwinConfigurations = {
macbook = darwin.lib.darwinSystem { ... };
mac-mini = darwin.lib.darwinSystem { ... };
};
nixosConfigurations = {
desktop = nixpkgs.lib.nixosSystem { ... };
laptop = nixpkgs.lib.nixosSystem { ... };
};
```
### macOS System Defaults
The darwin configuration includes sensible defaults for macOS. Customize in `darwin/configuration.nix`:
- Dock behavior
- Finder settings
- Keyboard settings
- Global domain defaults
## Maintenance
**Update flake inputs:**
```bash
nix flake update
```
**Garbage collect old generations:**
```bash
# This happens automatically every 7 days, but you can run manually:
nix-collect-garbage -d
# On NixOS:
sudo nix-collect-garbage -d
```
**View generations:**
```bash
# On macOS:
darwin-rebuild --list-generations
# On NixOS:
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
```
**Rollback to previous generation:**
```bash
# On macOS:
darwin-rebuild --rollback
# On NixOS:
sudo nixos-rebuild --rollback
```
## Resources
- [Nix Documentation](https://nixos.org/manual/nix/stable/)
- [NixOS Options Search](https://search.nixos.org/options)
- [Home Manager Options](https://nix-community.github.io/home-manager/options.html)
- [nix-darwin Options](https://daiderd.com/nix-darwin/manual/index.html)
- [Nix Language Basics](https://nixos.org/manual/nix/stable/language/)
## Troubleshooting
**"error: experimental Nix feature 'flakes' is disabled"**
- Enable flakes in your nix configuration
**Build fails on macOS**
- Ensure nix-darwin is properly installed
- Check that your architecture is set correctly in `darwin/configuration.nix`
**Home manager conflicts**
- If you have existing dotfiles, back them up before applying home-manager
- Use `home-manager switch --backup-extension .backup` to preserve existing files
**"collision between" errors**
- Usually means packages are providing the same files
- Check for duplicate package installations in system vs home-manager
## Contributing
Feel free to customize this configuration to your needs! The modular structure makes it easy to:
- Add new feature modules
- Share modules between machines
- Contribute modules back to the community
+63
View File
@@ -0,0 +1,63 @@
# Shared system-level configuration for both NixOS and nix-darwin
# Import this in both nixos/configuration.nix and darwin/configuration.nix
{
inputs,
lib,
config,
pkgs,
...
}: {
# Shared Nix configuration
nix = let
flakeInputs = lib.filterAttrs (_: lib.isType "flake") inputs;
in {
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
# Opinionated: disable global registry
flake-registry = "";
# Deduplicate and optimize nix store
auto-optimise-store = true;
# Trusted users (useful for remote builds)
# trusted-users = [ "root" "@wheel" ];
# Workaround for https://github.com/NixOS/nix/issues/9574
nix-path = config.nix.nixPath;
};
# Garbage collection
gc = {
automatic = true;
options = "--delete-older-than 7d";
};
# Opinionated: make flake registry and nix path match flake inputs
registry = lib.mapAttrs (_: flake: {inherit flake;}) flakeInputs;
nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs;
};
# Shared nixpkgs configuration
nixpkgs = {
overlays = [
inputs.self.overlays.additions
inputs.self.overlays.modifications
inputs.self.overlays.unstable-packages
];
config = {
allowUnfree = true;
};
};
# Shared environment packages
environment.systemPackages = with pkgs; [
vim
git
curl
wget
];
}
+89
View File
@@ -0,0 +1,89 @@
# This is your nix-darwin configuration for macOS
# Use this to configure your macOS system environment
{
inputs,
lib,
config,
pkgs,
...
}: {
# You can import other darwin modules here
imports = [
# Shared configuration between NixOS and nix-darwin
../common.nix
# If you want to use modules your own flake exports (from modules/darwin):
# inputs.self.darwinModules.example
# You can also split up your configuration and import pieces of it here:
# ./brew.nix
# ./defaults.nix
];
# macOS-specific Nix settings (common.nix has the shared ones)
# Any darwin-specific nix configuration can go here
# Auto upgrade nix package and the daemon service
services.nix-daemon.enable = true;
# Necessary for using flakes on this system
nix.package = pkgs.nix;
# TODO: Set your hostname
networking.hostName = "your-hostname";
networking.computerName = "your-hostname";
# Create /etc/zshrc that loads the nix-darwin environment
programs.zsh.enable = true;
programs.fish.enable = true;
# Used for backwards compatibility, please read the changelog before changing
# $ darwin-rebuild changelog
system.stateVersion = 4;
# The platform the configuration will be used on
nixpkgs.hostPlatform = "aarch64-darwin"; # or "x86_64-darwin"
# TODO: Configure your system-wide user settings (groups, etc)
users.users.your-username = {
name = "your-username";
home = "/Users/your-username";
};
# System-wide packages
environment.systemPackages = with pkgs; [
vim
];
# macOS system defaults
system.defaults = {
dock = {
autohide = true;
orientation = "bottom";
showhidden = true;
mru-spaces = false;
};
finder = {
AppleShowAllExtensions = true;
FXEnableExtensionChangeWarning = false;
_FXShowPosixPathInTitle = true;
};
NSGlobalDomain = {
AppleShowAllExtensions = true;
InitialKeyRepeat = 14;
KeyRepeat = 1;
};
};
# Keyboard and trackpad settings
system.keyboard = {
enableKeyMapping = true;
remapCapsLockToControl = true;
};
# Security
security.pam.enableSudoTouchIdAuth = true;
}
+34 -2
View File
@@ -22,6 +22,7 @@
self,
nixpkgs,
home-manager,
darwin,
...
} @ inputs: let
# Supported systems for your flake packages, shell, etc.
@@ -61,17 +62,48 @@
modules = [
# > Our main nixos configuration file <
./nixos/configuration.nix
# Integrate home-manager as a NixOS module
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = {inherit inputs;};
# FIXME: Replace with your username
home-manager.users.your-username = import ./home-manager/home.nix;
}
];
};
};
# nix-darwin configuration entrypoint
# Available through 'darwin-rebuild switch --flake .#your-hostname'
darwinConfigurations = {
# FIXME replace with your hostname
your-hostname = darwin.lib.darwinSystem {
specialArgs = {inherit inputs;};
modules = [
# > Our main darwin configuration file <
./darwin/configuration.nix
# Integrate home-manager as a darwin module
home-manager.darwinModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = {inherit inputs;};
# FIXME: Replace with your username
home-manager.users.your-username = import ./home-manager/home.nix;
}
];
};
};
# Standalone home-manager configuration entrypoint
# Available through 'home-manager --flake .#your-username@your-hostname'
# Useful for systems where you don't have root access
homeConfigurations = {
# FIXME replace with your username@hostname
"your-username@your-hostname" = home-manager.lib.homeManagerConfiguration {
# Home-manager requires 'pkgs' instance
pkgs = nixpkgs.legacyPackages.x86_64-linux; # FIXME replace x86_64-linux with your architecure
pkgs = nixpkgs.legacyPackages.x86_64-linux; # FIXME: Set to your architecture
extraSpecialArgs = {inherit inputs;};
modules = [
# > Our main home-manager configuration file <
+59
View File
@@ -0,0 +1,59 @@
# Common configuration shared across all platforms
{
inputs,
lib,
config,
pkgs,
...
}: {
nixpkgs = {
# You can add overlays here
overlays = [
# Add overlays your own flake exports (from overlays and pkgs dir):
inputs.self.overlays.additions
inputs.self.overlays.modifications
inputs.self.overlays.unstable-packages
];
# Configure your nixpkgs instance
config = {
# Disable if you don't want unfree packages
allowUnfree = true;
};
};
# Enable home-manager
programs.home-manager.enable = true;
# Basic packages everyone should have
home.packages = with pkgs; [
# Archives
zip
unzip
# Utils
ripgrep # Better grep
fd # Better find
jq # JSON processor
yq-go # YAML processor
# System tools
htop
tree
wget
curl
];
# Basic git configuration
programs.git = {
enable = true;
extraConfig = {
init.defaultBranch = "main";
pull.rebase = true;
push.autoSetupRemote = true;
};
};
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
home.stateVersion = "24.05";
}
+54
View File
@@ -0,0 +1,54 @@
# macOS-specific home-manager configuration
{
inputs,
lib,
config,
pkgs,
...
}: lib.mkIf pkgs.stdenv.isDarwin {
# macOS-specific packages
home.packages = with pkgs; [
# macOS CLI tools
# m-cli # Swiss Army Knife for macOS
# GUI applications (if you want to manage them with nix)
# Note: Many prefer to use homebrew for GUI apps on macOS
];
# macOS-specific configurations
home.sessionVariables = {
# Fix for Nix on macOS
NIX_PATH = "nixpkgs=${inputs.nixpkgs}:darwin=${inputs.darwin}";
};
# Fish shell configuration for macOS
programs.fish = lib.mkIf config.programs.fish.enable {
shellInit = ''
# Add Homebrew to PATH if it exists
if test -d /opt/homebrew/bin
fish_add_path /opt/homebrew/bin
end
'';
};
# Zsh configuration for macOS
programs.zsh = lib.mkIf config.programs.zsh.enable {
initExtra = ''
# Add Homebrew to PATH if it exists
if [[ -d /opt/homebrew/bin ]]; then
eval "$(/opt/homebrew/bin/brew shellenv)"
fi
'';
};
# Bash configuration for macOS
programs.bash = lib.mkIf config.programs.bash.enable {
initExtra = ''
# Add Homebrew to PATH if it exists
if [[ -d /opt/homebrew/bin ]]; then
eval "$(/opt/homebrew/bin/brew shellenv)"
fi
'';
};
}
+76
View File
@@ -0,0 +1,76 @@
# Development tools and environment
{
inputs,
lib,
config,
pkgs,
...
}: {
home.packages = with pkgs; [
# Version control
git
gh # GitHub CLI
lazygit # Terminal UI for git
# Languages and runtimes (add what you need)
# python311
# nodejs_20
# go
# rustc
# cargo
# Build tools
gnumake
cmake
# Text editors / IDEs
# neovim
# vscode
# Docker and containers (Linux only, macOS uses Docker Desktop)
] ++ lib.optionals pkgs.stdenv.isLinux [
# docker
# docker-compose
];
# Git configuration for development
programs.git = {
enable = true;
# TODO: Configure your git identity
# userName = "Your Name";
# userEmail = "your.email@example.com";
extraConfig = {
core.editor = "vim";
merge.conflictstyle = "diff3";
diff.algorithm = "histogram";
};
# Git aliases
aliases = {
st = "status";
co = "checkout";
br = "branch";
ci = "commit";
unstage = "reset HEAD --";
last = "log -1 HEAD";
lg = "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit";
};
};
# GitHub CLI
programs.gh = {
enable = true;
settings = {
git_protocol = "ssh";
prompt = "enabled";
};
};
# Direnv for per-directory environments
programs.direnv = {
enable = true;
nix-direnv.enable = true;
};
}
+28 -47
View File
@@ -7,60 +7,41 @@
pkgs,
...
}: {
# You can import other home-manager modules here
# Import modular configurations
imports = [
# Base configuration shared across all platforms
./common.nix
# Feature modules
./development.nix
./shell.nix
./terminal.nix
# Platform-specific configurations
./linux.nix
./darwin.nix
# If you want to use modules your own flake exports (from modules/home-manager):
# inputs.self.homeManagerModules.example
# Or modules exported from other flakes (such as nix-colors):
# inputs.nix-colors.homeManagerModules.default
# You can also split up your configuration and import pieces of it here:
# ./nvim.nix
];
nixpkgs = {
# You can add overlays here
overlays = [
# Add overlays your own flake exports (from overlays and pkgs dir):
inputs.self.overlays.additions
inputs.self.overlays.modifications
inputs.self.overlays.unstable-packages
# You can also add overlays exported from other flakes:
# neovim-nightly-overlay.overlays.default
# Or define it inline, for example:
# (final: prev: {
# hi = final.hello.overrideAttrs (oldAttrs: {
# patches = [ ./change-hello-to-hi.patch ];
# });
# })
];
# Configure your nixpkgs instance
config = {
# Disable if you don't want unfree packages
allowUnfree = true;
};
};
# TODO: Set your username
home = {
username = "your-username";
homeDirectory = "/home/your-username";
username = lib.mkDefault "your-username";
homeDirectory = lib.mkDefault (
if pkgs.stdenv.isDarwin
then "/Users/${config.home.username}"
else "/home/${config.home.username}"
);
};
# Add stuff for your user as you see fit:
# programs.neovim.enable = true;
# home.packages = with pkgs; [ steam ];
# Enable home-manager and git
programs.home-manager.enable = true;
programs.git.enable = true;
# Nicely reload system units when changing configs
systemd.user.startServices = "sd-switch";
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
home.stateVersion = "23.05";
# Platform-aware session variables
home.sessionVariables = {
EDITOR = "nvim";
VISUAL = "nvim";
} // lib.optionalAttrs pkgs.stdenv.isDarwin {
# macOS-specific environment variables
} // lib.optionalAttrs pkgs.stdenv.isLinux {
# Linux-specific environment variables
};
}
+51
View File
@@ -0,0 +1,51 @@
# Linux-specific home-manager configuration
{
inputs,
lib,
config,
pkgs,
...
}: lib.mkIf pkgs.stdenv.isLinux {
# Linux-specific packages
home.packages = with pkgs; [
# GUI applications (if you use a desktop environment)
# firefox
# chromium
# Linux-specific CLI tools
# xclip
# xsel
];
# Systemd user services (Linux only)
systemd.user.startServices = "sd-switch";
# X11/Wayland specific configurations
# xsession.enable = true;
# wayland.windowManager.sway.enable = true;
# GTK theme configuration
gtk = {
enable = true;
# theme = {
# name = "Adwaita-dark";
# package = pkgs.gnome.gnome-themes-extra;
# };
};
# Qt theme configuration
qt = {
enable = true;
platformTheme.name = "gtk";
};
# Services
services = {
# Clipboard manager
# clipmenu.enable = true;
# Notification daemon
# dunst.enable = true;
};
}
+117
View File
@@ -0,0 +1,117 @@
# Shell configuration (bash, zsh, fish, etc.)
{
inputs,
lib,
config,
pkgs,
...
}: {
# Bash configuration
programs.bash = {
enable = true;
enableCompletion = true;
shellAliases = {
ll = "ls -la";
".." = "cd ..";
"..." = "cd ../..";
gs = "git status";
gd = "git diff";
};
};
# Zsh configuration
programs.zsh = {
enable = true;
enableCompletion = true;
autosuggestion.enable = true;
syntaxHighlighting.enable = true;
shellAliases = {
ll = "ls -la";
".." = "cd ..";
"..." = "cd ../..";
gs = "git status";
gd = "git diff";
nix-gc = "nix-collect-garbage -d";
};
history = {
size = 10000;
path = "${config.home.homeDirectory}/.zsh_history";
};
initExtra = ''
# Custom prompt or additional configuration
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_FIND_NO_DUPS
setopt HIST_REDUCE_BLANKS
'';
};
# Fish configuration
programs.fish = {
enable = true;
shellAliases = {
ll = "ls -la";
".." = "cd ..";
"..." = "cd ../..";
gs = "git status";
gd = "git diff";
};
functions = {
mkcd = "mkdir -p $argv[1]; and cd $argv[1]";
};
};
# Starship prompt (works with all shells)
programs.starship = {
enable = true;
settings = {
add_newline = true;
character = {
success_symbol = "[](bold green)";
error_symbol = "[](bold red)";
};
package.disabled = true;
};
};
# Zoxide (better cd)
programs.zoxide = {
enable = true;
enableBashIntegration = true;
enableZshIntegration = true;
enableFishIntegration = true;
};
# fzf (fuzzy finder)
programs.fzf = {
enable = true;
enableBashIntegration = true;
enableZshIntegration = true;
enableFishIntegration = true;
};
# Eza (modern ls replacement)
programs.eza = {
enable = true;
enableBashIntegration = true;
enableZshIntegration = true;
enableFishIntegration = true;
git = true;
icons = true;
};
# Bat (better cat)
programs.bat = {
enable = true;
config = {
theme = "TwoDark";
pager = "less -FR";
};
};
}
+110
View File
@@ -0,0 +1,110 @@
# Terminal applications and utilities
{
inputs,
lib,
config,
pkgs,
...
}: {
home.packages = with pkgs; [
# Modern CLI tools
ripgrep # Better grep
fd # Better find
sd # Better sed
du-dust # Better du
duf # Better df
procs # Better ps
bottom # Better top/htop
# File managers
# ranger
# nnn
# lf
# Multiplexers
# tmux
# zellij
];
# Tmux configuration
programs.tmux = {
enable = true;
terminal = "tmux-256color";
historyLimit = 10000;
baseIndex = 1;
keyMode = "vi";
mouse = true;
plugins = with pkgs.tmuxPlugins; [
sensible
yank
vim-tmux-navigator
];
extraConfig = ''
# Split panes using | and -
bind | split-window -h
bind - split-window -v
unbind '"'
unbind %
# Reload config
bind r source-file ~/.config/tmux/tmux.conf
# Easy pane switching
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
'';
};
# Neovim (optional, can be expanded)
programs.neovim = {
enable = true;
defaultEditor = true;
viAlias = true;
vimAlias = true;
extraConfig = ''
set number
set relativenumber
set expandtab
set tabstop=2
set shiftwidth=2
set smartindent
set clipboard=unnamedplus
'';
};
# Alacritty terminal emulator configuration
programs.alacritty = {
enable = true;
settings = {
window = {
padding = {
x = 10;
y = 10;
};
decorations = "full";
opacity = 0.95;
};
font = {
size = 13.0;
normal = {
family = "JetBrainsMono Nerd Font";
style = "Regular";
};
};
colors = {
primary = {
background = "0x1e1e1e";
foreground = "0xd4d4d4";
};
};
};
};
}
+7
View File
@@ -0,0 +1,7 @@
# Add your reusable nix-darwin modules to this directory, on their own file.
# These should be stuff you would like to share with others, not your personal configurations.
{
# List your module files here
# my-module = import ./my-module.nix;
}
+6 -41
View File
@@ -9,6 +9,9 @@
}: {
# You can import other NixOS modules here
imports = [
# Shared configuration between NixOS and nix-darwin
../common.nix
# If you want to use modules your own flake exports (from modules/nixos):
# inputs.self.nixosModules.example
@@ -23,48 +26,10 @@
./hardware-configuration.nix
];
nixpkgs = {
# You can add overlays here
overlays = [
# Add overlays your own flake exports (from overlays and pkgs dir):
inputs.self.overlays.additions
inputs.self.overlays.modifications
inputs.self.overlays.unstable-packages
# You can also add overlays exported from other flakes:
# neovim-nightly-overlay.overlays.default
# Or define it inline, for example:
# (final: prev: {
# hi = final.hello.overrideAttrs (oldAttrs: {
# patches = [ ./change-hello-to-hi.patch ];
# });
# })
];
# Configure your nixpkgs instance
config = {
# Disable if you don't want unfree packages
allowUnfree = true;
};
};
nix = let
flakeInputs = lib.filterAttrs (_: lib.isType "flake") inputs;
in {
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
# Opinionated: disable global registry
flake-registry = "";
# Workaround for https://github.com/NixOS/nix/issues/9574
nix-path = config.nix.nixPath;
};
# NixOS-specific Nix settings (common.nix has the shared ones)
nix = {
# Opinionated: disable channels
channel.enable = false;
# Opinionated: make flake registry and nix path match flake inputs
registry = lib.mapAttrs (_: flake: {inherit flake;}) flakeInputs;
nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs;
};
# FIXME: Add the rest of your current configuration
@@ -103,5 +68,5 @@
};
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
system.stateVersion = "23.05";
system.stateVersion = "24.05";
}