Clone into your home directory:
cd ~ && git clone https://github.com/mattdrose/dotfiles.git && cd dotfilesFor initial install, run:
bin/dotfilesSymlinks all dotfiles from the repo into your home directory. Existing files are backed up with a .old extension. Since files are symlinked (not copied), edits in ~ are reflected back in the repo.
Note:
.zshrcand.gitconfigare not symlinked. Instead,dotfileswrites a real file at~/.zshrc/~/.gitconfigthat sources or includes the repo version. This way, machine-specific tools (e.g.nvm, credential helpers) can append to those files without dirtying the repo.
Installs Homebrew (if needed) and all packages defined in the Brewfile, including modern CLI tools like ripgrep, fd, bat, fzf, and eza. Also installs nvm for Node.js version management.
Creates symlinks for app-specific configs (VS Code settings, Karabiner) into their expected locations.
Re-sources all dotfiles in the current shell, picking up any changes without replacing the shell process.
Configures macOS system defaults (Finder, Dock, keyboard, trackpad, etc.).
Configures macOS default app associations from ~/.duti using duti. Run dotfiles brew first to install duti, and run dotfiles first so .duti is symlinked into your home directory.
| File | Purpose |
|---|---|
.zshrc |
Entry point — sources all other dotfiles |
.path |
PATH modifications and tool initialization (Homebrew, nvm, pyenv, bun, etc.) |
.exports |
Environment variables (editor, locale, colors) |
.aliases |
Shell aliases |
.functions |
Shell helper functions |
.zsh |
Zsh-specific options (history, completion) |
.prompt |
Custom Zsh prompt with git status |
.gitconfig |
Git config with extensive aliases |
.editorconfig |
Editor formatting defaults |
.duti |
Default app associations applied by bin/dotfiles default-apps |
.tmux.conf |
Tmux configuration |
Brewfile |
Declarative Homebrew package list |
config/ |
App configs symlinked by bin/dotfiles symlinks |
commands/ |
Scripts invoked by bin/dotfiles <command> |
Create a ~/.extra file for machine-specific settings you don't want committed (it's gitignored). It will be sourced automatically if present.
Commit and tag signing are enabled by default in .gitconfig using SSH signing (gpg.format = ssh).
Use ~/.gitconfig to define your machine-local signing key, for example:
[user]
signingkey = ~/.ssh/id_ed25519_github_personal.pub