Skip to content
abereghiciPublic

About

My macOS dotfiles: Zsh, Neovim (LazyVim), Ghostty, tmux and herdr for AI coding agents, lazygit, mise and AeroSpace, all in Bereghici Dark and Light, following the macOS appearance.

Topics

Resources

Contributing

Security policy

Stars

7 stars

Watchers

1 watching

Forks

Repository files navigation

dotfiles: zsh, starship, git, delta, fzf, neovim and homebrew for macOS

~abereghici

CI License: MIT macOS

My macOS dotfiles: Zsh, Homebrew, Neovim (LazyVim), Ghostty, tmux and herdr for coding agents, lazygit, mise and AeroSpace. Every themed tool uses Bereghici Dark or Light and follows the macOS appearance. One script sets up a new Mac; the configs are symlinks back into this repository, so editing them here is editing them live.

Warning

These are my personal settings, and setup.sh changes your system (see what it changes). Fork the repository and review the code before running it, rather than installing it as is.

Contents

What's inside

Area Tools
Shell Zsh with aliases, fzf, zoxide, direnv and a Starship prompt
Terminal Ghostty, tmux and herdr on one prefix (keys)
Editor Neovim on LazyVim; VS Code settings and snippets with default keybindings
Git Git aliases, delta diffs and lazygit
Runtimes Node, Python, Go, Rust, Java, Bun, Maven and uv via mise
Theme Bereghici Dark/Light from abereghici/themes, switched by appearance (how)
macOS Defaults (notes), AeroSpace tiling and keyboard notes (ZSA Voyager, Romanian layout)
Apps Everything in the Brewfile, VS Code extensions included
Scripts bin/, including the projects picker for tmux and herdr and keychain for secrets

The repository is laid out by where things go: tilde/ is linked into ~, bin/ into ~/.local/bin, and the rest by setup/ (herdr/plugins/, keyboard/, lazygit/, vscode/, launchd/). tests/ checks the result.

Requirements

  • macOS 14 (Sonoma) or later; tested on macOS 26 on Apple silicon. The Homebrew paths for Intel Macs are handled but not tested.
  • An administrator account (setup.sh uses sudo).
  • Git, from the Xcode Command Line Tools (xcode-select --install); the Homebrew installer also offers them.

Install

git clone https://github.com/abereghici/dotfiles.git ~/dotfiles
~/dotfiles/setup.sh

It asks you to press Enter and for your password, then what to do with any file in the way and the local settings questions. Pass -y for no questions at all: every file in the way is backed up, and the local settings are skipped (run setup/local.sh later). Open a new terminal when it's done. Setting up a new Mac? See the checklist for what to do around it.

What setup.sh changes

In order, each step a script you can also run on its own:

  1. ~/.zshrc: moved to ~/.zshrc.backup if it's a real file (a timestamp is added when that backup exists).
  2. /etc/pam.d/sudo_local: created, if missing, so Touch ID can authorize sudo.
  3. setup/brew.sh: installs Homebrew if needed, runs brew update and brew upgrade, installs the Brewfile and runs brew cleanup.
  4. setup/symlinks.sh: links tilde/, bin/, the lazygit, lazydocker and VS Code configs and the keyboard layout. A file in the way is skipped, overwritten or backed up, as you choose (backed up with -y), and links left pointing at removed files are deleted. It also installs the appearance agent in ~/Library/LaunchAgents.
  5. setup/local.sh: asks for this machine's private settings and writes the *.local files, mode 600. Skipped with -y.
  6. setup/misc.sh: installs tpm and the tmux plugins, links the herdr plugins and installs herdr-reviewr, installs the mise runtimes and npm packages, clones (or updates) abereghici/themes into ~/.local/share/bereghici and runs its install.sh, then appearance sync.

setup/README.md describes each script in detail. A step that fails, such as one Brewfile entry or an offline clone, is reported and the rest goes on; re-running setup.sh is safe. The optional setup/macos.sh writes macOS defaults and is not part of setup.sh.

Local customizations

These optional files extend the dotfiles for one machine and are never checked in. setup/local.sh writes them from your answers; every question can be left empty, and a file that exists is kept (delete it to be asked again).

~/.zsh.local

Sourced by .zshrc after the path, env, aliases, keybindings and completion setup, and before the plugins and the prompt, so it can add to or override any of them. local.sh writes the Keychain secrets you name into it, storing their values in the Keychain, never in a file.

# Extra binaries for this machine only
[ -d "$HOME/.acme/bin" ] && PATH="$HOME/.acme/bin:$PATH"

# Secrets from the macOS Keychain (stored with `keychain set ACME_API_KEY`)
eval "$(keychain export ACME_API_KEY GITHUB_TOKEN)"

~/.gitconfig.local

Included at the end of ~/.gitconfig, so it can override or add to any setting. local.sh writes your name, email and GitHub username, the optional HTTPS-to-SSH rewrite for GitHub, and a separate identity for a work Git host: any repository whose remote is on that host includes ~/.gitconfig.work.

[user]
  name = "Your Name"
  email = "you@example.com"
[includeIf "hasconfig:remote.*.url:https://git.example.com/**"]
  path = ~/.gitconfig.work

~/.config/mise/config.local.toml

mise loads it alongside config.toml (see mise config ls), for tools you only need on this machine. ~/.config/mise links to tilde/.config/mise, so the file lives there, git-ignored.

[tools]
terraform = "latest"

~/.config/herdr/reviewr.local.toml

Settings for herdr-reviewr, such as a work GitLab host. herdr-reviewr-config merges it with reviewr.toml into reviewr's config; run it again after editing either.

gitlab_host = "git.example.com"

~/.macos.local

Personal settings for setup/macos.sh; each one is skipped when unset.

COMPUTERNAME='my-mac'
LOCALHOSTNAME='my-mac'
LANGUAGES=(en)
LOCALE='en_US'
TIMEZONE='Europe/London' # list: sudo systemsetup -listtimezones

Updating

cd ~/dotfiles
git pull
./setup.sh -y

-y skips the questions, which an update doesn't need. Every step is safe to run again: links already in place are skipped, and the Homebrew packages, mise tools and themes are brought up to date. Plugins already installed keep their version: update them with herdr plugin update and tpm's prefix U.

Uninstalling

~/dotfiles/setup/uninstall.sh -n # print what it would remove
~/dotfiles/setup/uninstall.sh

setup/uninstall.sh removes the links into this repository and into the themes, the appearance agent and the herdr plugins linked from here, lists the backups setup.sh made (restore them with mv), and asks before removing /etc/pam.d/sudo_local. Homebrew and its packages, the themes clone, the *.local files and any macOS defaults stay.

Troubleshooting

  • A command or setting is missing after setup: open a new terminal; the running one predates the links.
  • brew isn't found after installing Homebrew by hand: run eval "$(/opt/homebrew/bin/brew shellenv)", or open a new terminal.
  • Two quick ⌥Space presses open Claude's Quick Entry: Claude desktop opens it on a double tap of ⌥; set its shortcut to something else in its Settings.
  • ⌃ + arrows switch Spaces instead of resizing Neovim splits: turn off the Mission Control shortcuts.
  • A tool didn't switch theme with the appearance: run appearance sync (details).
  • Is everything in place? npm test runs the bats tests against this machine; they change nothing.

More docs

Contributing

Pull requests that fix bugs or add improvements without breaking changes are welcome. See CONTRIBUTING.md for the checks to run, and SECURITY.md to report a vulnerability privately.

License

MIT © Alexandru Bereghici

Credits

Ideas and structure from these repositories and articles:

About

My macOS dotfiles: Zsh, Neovim (LazyVim), Ghostty, tmux and herdr for AI coding agents, lazygit, mise and AeroSpace, all in Bereghici Dark and Light, following the macOS appearance.

Topics

Resources

Contributing

Security policy

Stars

7 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages