Every new Mac starts the same way. You open System Settings. You turn on dark mode. You move the dock. You make the icons smaller. You turn off smart quotes. You spend an hour in Finder preferences. You download Chrome, then Slack, then Spotify, then twenty other apps. You configure git. You set up SSH keys. You try to remember what shell plugins you had.
A week later you're almost back to where you were. Almost.
This repo is the fix. My entire Mac — every app, every system preference, every dev tool, every shell config — declared in Nix and managed by nixmac.
Nix is a declarative system: you describe what you want, and it builds exactly that, every time. nixmac is a macOS app that sits on top of it — lets me evolve my config with natural language ("add Figma to my apps"), validates every change, and applies it. When I want something different, I describe it and nixmac writes the Nix.
New Mac? git clone, open nixmac, done. Every app, every preference, every tool — back in minutes, not days.
| What | Examples | |
|---|---|---|
| System | macOS preferences as code | Dark mode, dock on the left, no smart quotes, screenshots to ~/Screenshots |
| Home Manager | Dev environment as code | Git with 1Password commit signing, zsh, tmux, direnv |
| Homebrew | Brews + casks | Chrome, Slack, Cursor, Obsidian, 1Password, Warp |
| .nixmac/ | Reserved modules | Core config that stays locked down |
The Homebrew list in flake-modules/darwin.nix reflects my actual machine. Trim or replace via nixmac (natural language) or by editing the file directly.
system.defaults.NSGlobalDomain.KeyRepeat = 2;One line. Applied on every machine, forever.
Prerequisite: This repo is tuned for Determinate Nix. Vanilla Nix may require small tweaks.
Already on nix-darwin:
git clone <this-repo> ~/.darwin- Edit
users/default.nix— fill in your username, full name, email, home directory, and optionally a git signing key (see comment in the file). - In
flake-modules/darwin.nix— rename the"My-MacBook-Pro"attribute key to your hostname (scutil --get LocalHostName). Update the matchinghostname = "My-MacBook-Pro";lines. - In
flake-modules/packages.nix— rename"My-MacBook-Pro"in thecachix-deploy-specagents block (or delete the block if you don't use Cachix). - Install nixmac and open it — it picks up
~/.darwinautomatically.
New to Nix:
- Install Determinate Nix (one command).
- Install nixmac — it can help you get nix-darwin set up.
- Clone this repo to
~/.darwinand follow the steps above, or start fresh from nixmac's built-in templates. - Open nixmac and ask for your first change in plain English.
.
├── flake.nix # entry point
├── flake-modules/darwin.nix # the whole config — start here
├── users/default.nix # user profile (edit me)
├── .nixmac/ # nixmac app integration
└── rebuild.sh # CLI fallback
MIT. See LICENSE.
nixmac — your Mac, declared in Nix, evolved by AI.