My personal dotfiles for macOS.
- System Management: Nix-Darwin (declarative macOS settings + packages)
- Package Management: Homebrew (managed via Nix-Darwin)
- Dotfiles Management: Chezmoi
- Secrets Management: Bitwarden via rbw (hash-based caching)
- Language/Environment Management: Mise
- Window Management: Aerospace (tiling WM), Sketchybar (status bar)
- File Manager: Yazi
- Terminal: Ghostty
- Shell: Zsh with Starship prompt (transient), Atuin (shell history)
- Editor: Neovim (LazyVim)
- Multiplexer: Tmux with Sesh session management
- Version Control: Git worktrees with Treekanga CLI, Delta pager, Lazygit TUI
- Keyboard: Kanata (laptop remapping), custom zmk layouts for Glove80 & Corne (external keyboards)
Click to expand bootstrap instructions
Installs Nix package manager, nix-darwin system configuration, and Homebrew packages:
curl -fsSL https://raw.githubusercontent.com/gnohj/dotfiles/main/system-setup.sh | bashThis will:
- Install Nix package manager (Determinate Systems installer)
- Clone dotfiles repository via Chezmoi
- Install nix-darwin for declarative macOS configuration
- Install all packages defined in
~/.nix/(Nix packages + Homebrew apps)
Note: You'll be prompted for your password once at the start for sudo access.
Applies dotfiles and installs language runtimes via mise:
curl -fsSL https://raw.githubusercontent.com/gnohj/dotfiles/main/user-setup.sh | bash -s -- your_bitwarden_email@example.comThis will:
- Fetch GH SSH key from Bitwarden (requires master password)
- Apply all dotfiles via Chezmoi (
~/.config/,~/.zshrc, etc.) - Install language runtimes via mise (Node, Python, Go, Rust, etc.)
- Set up environment secrets from Bitwarden (API keys, tokens)
- Set up shell configuration
Click to expand update instructions
This setup uses a hybrid approach for reproducibility:
-
Nix packages (CLI dev tools): Pinned via
flake.lock- β Reproducible across machines and time
- β Same versions until you explicitly update
-
Homebrew packages (macOS apps + utilities): Floating versions
β οΈ Gets latest from Homebrew on install/updateβ οΈ Not reproducible, but always up-to-date
Uses existing pinned versions from flake.lock:
darwin-rebuild switch --flake ~/.nixUpdates flake.lock to newest nixpkgs snapshot:
# Update all flake inputs (nixpkgs + nix-darwin)
nix flake update ~/.nix
darwin-rebuild switch --flake ~/.nix
# Or update only nixpkgs
nix flake update ~/.nix nixpkgs
darwin-rebuild switch --flake ~/.nixCurrently onActivation.upgrade = false, so manual updates:
# Update specific package
brew upgrade ghostty
brew upgrade --cask brave-browser
# Update all packages
brew upgrade
brew upgrade --caskClean up old generations:
nix-collect-garbage -dApply latest dotfiles:
chezmoi applyUpdate from remote and apply:
chezmoi updateRefresh secrets from Bitwarden:
Secrets are automatically refreshed when the secret list changes. To force a refresh after changing a password value:
rbw sync && chezmoi apply --forceList outdated languages:
mise outdatedInstall/update all languages from config:
mise installUpgrade a specific language runtime:
mise upgrade node@20.2.0
mise upgrade pythonUpgrade all language runtimes to latest versions:
mise upgradeList outdated apps:
mas outdatedUpgrade all App Store apps:
mas upgradeUpgrade a specific app:
mas upgrade <app-id>