Dotfiles for macOS


Storing all your configs in a single place makes changing between Macs a breeze. In this article I'll explain how I store my dotfiles for easy version control and some of the tools I use. For now it's the bare necessities but it gets the job done.
My dotfiles can be found here (feel free to fork it!)

Symlinking with GNU Stow

Stow is a neat little program that creates symlinks to my home directory from ~/.dotfiles by structuring files the same way you would in your home directory:

~ /.dotfiles/
  - zsh/.zshrc
  - nvim/.config/nvim

As you can see the directory names (zsh, nvim) are just used to help you organize your dotfiles, while the content inside is what will get symlinked to your ~ directory.
An example:
Zsh saves it's config directly under your home dir, ~/.zshrc, while nvim saves its config under ~/.config/nvim which is why we use .config as the second part of the path.

After running stow zsh && stow nvim ~ will have these symlinks:

~ /
 - .zshrc
 - .config/nvim

This way one can easily edit and version control dotfiles in the ~/.dotfiles/ directory.

Homebrew and Brewfile

To manage my packages I use Homebrew. All installed packages can be stored in a Brewfile, a file with all your brew packages listed. The command brew bundle dump --describe will create a Brewfile. The describe flag adds a short comment over each line describing what the package does.
Then run brew bundle to install all packages.
By having a .Brewfile in your ~ directory it will be used as a global file, which is convenient so you can run bundle or bundle dump anywhere with the --global flag.

Some apps I have in my Brewfile and recommend are:

  • Rectangle, my favorite window manager for macOS
  • iTerm, terminal emulator

Visual Studio Code

For VS Code it seems like the easiest option simply is to use the Settings Sync feature in VS Code. I would prefer a config file that you could dump all settings and extensions into, but couldn't find an easy way to do this.

Setup script

In the README I have a simple script you can run from a brand new Mac:

# Installs git
xcode-select --install
git clone ~/.dotfiles
cd ~/.dotfiles; source

Here is the script, which installs all Brew packages as well as ohmyzsh:

#!/usr/bin/env zsh

echo ">>>>>Installing homebrew"
/bin/bash -c "$(curl -fsSL" </dev/null ## /dev/null skips pressing enter for the installation
brew bundle --file=~/.dotfiles/homebrew/.Brewfile

sh -c "$(curl -fsSL"

Future endeavours

As my time was fairly limited when setting this up I still have some things left I want to look into:

  • Create a simple script to run stow on all my directories in the setup script
  • Native MacOS settings
  • iTerm settings