Personal macOS workstation configuration, declared as a Nix flake and applied with nix-darwin + home-manager.
- macOS (this configuration only supports
aarch64-darwin) - 1Password for Mac, with Settings > Developer > Integrate with 1Password CLI enabled
Everything else, including Nix itself, is installed by setup.sh.
./setup.sh [username]username defaults to the current macOS user. The script:
- Verifies 1Password for Mac is installed
- Writes machine-local identity files under
machine-local/(gitignored) - Installs Nix via Lix if it isn't already present
- Runs
darwin-rebuild switchagainst this flake
Re-run ./setup.sh any time to reapply the configuration after editing it.
- macOS defaults (
darwin.nix) — Dock, Finder, trackpad, menu bar clock, Touch ID forsudo, scheduled Nix GC/store optimisation - Shell & tools (
modules/) — zsh, tmux, WezTerm, git (aliases, delta, per-workspace identities), fzf/ripgrep/direnv, Ruby, opencode, and Claude Code settings/hooks - Workspace identities (
modules/workspaces) — per-directory Git identity and sallyport-managed environment variables, driven bymachine-local/identities.nix - A few of my own tools, pulled in as flake inputs: xckit, closest, tmuxist, sallyport
flake.nix # inputs (nixpkgs, nix-darwin, home-manager, ...) and outputs
darwin.nix # system-level (nix-darwin) configuration
home-manager.nix # top-level home-manager configuration
modules/ # one directory per home-manager module
machine-local/ # gitignored; machine-specific identity, created by setup.sh
Pushes are linted with shellcheck, actionlint, zizmor, and statix — see .github/workflows/lint.yaml.