A repository containing instructions and dotfiles for tools I use across multiple development machines.
The intended model is:
- one
mainbranch - shared tracked config
- OS-specific tracked overlays
- host-specific tracked overlays
- untracked local/private overrides
The repo now includes a layered bootstrap flow for symlinking managed files into a machine:
bin/bootstrap planbin/bootstrap statusbin/bootstrap apply
See docs/BOOTSTRAP.md for the manifest layout, backup behavior, and the shared/OS/host overlay model.
For CLI tool installation policy, see docs/MISE.md.
The repo is intended to keep one main branch that supports machine diversity
through overlays rather than long-lived machine branches.
The shell config is layered:
.zshenvis a quiet non-interactive baseline for local bins and the userssh-agentsocket.zprofileprepares login shells with themiseshim PATH before interactive startup.zshrcis a thin interactive loadershell/zshrc.sharedcontains the common interactive baselineshell/zshrc.macosorshell/zshrc.linuxcontains OS-specific setup, including interactivemise activateshell/zshrc.host.<hostname>is for tracked host-specific overrides~/.config/rspurgeon/local.zshis the untracked local include for secrets and machine-private pathslocal/local.zsh.exampleandlocal/git-config.local.exampleshow the intended local-only shape
The bootstrap manifests are also layered:
bootstrap/manifest.d/00-shared.tsvbootstrap/manifest.d/10-macos.tsvbootstrap/manifest.d/10-linux.tsvbootstrap/manifest.d/20-host-<hostname>.tsv
For a new machine or a major refactor migration, use this order:
- Clone the repo to
$HOME/dev/rspurgeon/dots - Install base OS packages and fonts
- Run
bin/setup-shellto ensurezsh, zsh plugins, and the login shell are configured - Install
oh-my-zsh - Run
bin/mise-sync install - Run
bin/setup-nvim - Run
bin/setup-tmux - Create local-only files as needed:
~/.config/rspurgeon/local.zsh~/.config/git/config.local
- Run
bin/bootstrap plan - Run
bin/bootstrap apply - On Omarchy Linux desktops, run
bin/setup-omarchy-browser-defaultsafter installing Firefox and Chromium - Open a new shell and verify the machine with:
bin/bootstrap statusbin/mise-sync status
Use this rule of thumb when deciding where config belongs:
- Shared defaults used on most machines belong in shared tracked config.
- OS-specific behavior belongs in
shell/zshrc.<os>orbootstrap/manifest.d/10-<os>.tsv. - Role-specific behavior belongs in
shell/zshrc.profile.<profile>or manifest selectors likeprofile:workandprofile:desktop. - Stable host-specific behavior is reserved for physical-machine details such as monitor layout under
.config/hypr/hosts/<hostname>/. - Secrets, private tokens, personal aliases, and machine-private paths belong in untracked local files.
Examples of local-only files:
~/.config/rspurgeon/local.zsh~/.config/git/config.local
Do not use long-lived machine branches for normal setup. Prefer extending the
overlay model on main.
I use the zsh shell which is the default on macOS Monterey, the current OS of choice. The brew install commands below could be replaced with a Brewfile solutions, I just haven't take the time yet.
Clone this repo
git clone git@github.com:rspurgeon/dots.git $HOME/dev/rspurgeon/
Install the xcode command line tools
xcode-select –install
Install Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Install fonts
brew tap homebrew/cask-fonts brew search '/font-.*-nerd-font/' | awk '{ print $1 }' | xargs -I{} brew install --cask {} || true- https://github.com/rspurgeon/nerd-fonts#patched-fonts
Install JetBrains Mono Nerd Font
- Use your platform package manager or install from the Nerd Fonts project
- The active Ghostty, Neovim GUI, and iTerm2 configs use
JetBrainsMono Nerd Font Mono
Install various tools
brew install wget zsh-syntax-highlighting
Install shared CLI tools from the repo-managed mise config
bin/mise-sync install
Install iTerm2
- Once installed, import the profile in
$HOME/dev/rspurgeon/dots/iterm2-default-profile.jsonand switch to iTerm
Install NeoVim
brew install neovim
Install NeoVim Packer
bin/setup-nvim- Then run
nvim +PackerSync
Install nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
Install pyenv
brew install openssl readline sqlite3 xz zlib pyenv pyenv-virtualenvpyenv install 3.8.13pyenv global 3.8.13
Install sdkman
curl -s "https://get.sdkman.io" | bashsource "$HOME/.sdkman/bin/sdkman-init.sh"sdk install java 11.0.14-zulu
Install oh-my-zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Install Starship
Install zsh-autosuggestions
bin/setup-shell- The shell setup script installs the plugin into
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestionswhen needed.
Install zsh-syntax-highlighting
bin/setup-shell- The shell setup script installs the plugin into
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlightingwhen needed.
Install tmux
brew install tmux
Install .tmux, which is a nice base tmux configuration
bin/setup-tmux- This installs the gpakosz base config at
~/dev/gpakosz/.tmux, links~/.tmux.conf, installs TPM, and prepares tmux plugins
Install tmuxinator
brew install tmuxinator
Install tmux plugins
bin/setup-tmux- If tmux is already running, the script reloads the base and local config and installs TPM plugins
- Otherwise start tmux and run
~/.tmux/plugins/tpm/bin/install_plugins, or pressprefix + I
Install powerline status bar, which I use in vim and tmux
pip install powerline-status
Enable the environment by creating symbolic links to the dotfiles in this repository
bin/bootstrap planbin/bootstrap apply- Managed paths currently include
.zshenv,.zprofile,.zshrc,.vimrc,.tmux.conf.local,.config/alacritty,.config/git/config,.config/nvim,.config/powerline,.config/starship.toml,.config/starship-simple.toml,.config/tmux-powerline,.config/tmux-powerline-segments,.config/ghostty,.local/bin/pitch,.local/bin/pitch-mcp, and the iTerm2 dynamic profile on macOS miseis handled bybin/mise-sync, which copiesmise/config.tomlinto~/.config/mise/config.tomlinstead of symlinking it- Alacritty is the primary cross-machine terminal. Treat
.config/alacritty/alacritty.tomlas the authoritative source for terminal font size and related defaults;.config/ghosttyis retained as a secondary config
Some Linux hosts may also have host-specific tracked entries such as:
- Hyprland config in
.config/hypr - Waybar config in
.config/waybar - host-specific helper configs like
.config/pitch,.config/codex/guest, ornono/profiles - host-specific theme assets under
.config/omarchy/themes/...
These should normally be introduced through bootstrap/manifest.d/20-host-<hostname>.tsv.
For systemd --user units on Linux:
- Keep the tracked unit file contents in the repo under
.config/systemd/user/*.serviceand*.timer. - Reload and activate them with
systemctl --user daemon-reloadand the appropriateenableorstartcommands. - Avoid assuming repo-managed
*.wantssymlinks belong in Git or bootstrap manifests unless you have verified that behavior on the target host.
For Omarchy browser defaults on Linux desktops:
- Use
bin/setup-omarchy-browser-defaultsto keep Firefox as the normal XDG browser while Omarchy web app launchers continue to use Chromium's--appmode. - Do not commit
~/.config/mimeapps.list; desktop tools rewrite it as user state.
Install exa for better file listing
brew install exa
Install fzf for powerful search
brew install fzf- Install shell integrations with
/opt/homebrew/opt/fzf/install
Install ag, the silver searcher
brew install the_silver_searcher
Install kubectl
brew install kubectl