Install homebrew and run brew bundle:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew bundleCreate ssh key:
ssh-keygen -t ed25519 -C "erick.yellott@gmail.com"
echo "AddKeysToAgent yes" >> ~/.ssh/config
echo "IdentityFile ~/.ssh/id_ed25519" >> ~/.ssh/config
ssh-addAdd the key to GitHub: https://github.com/settings/keys
Make Code directory:
mkdir -p ~/CodeClone this repo:
cd ~/Code
git clone git@github.com:erickyellott/dotfiles.git
Link gitconfigs:
ln -s "$HOME/Code/dotfiles/gitconfig" "$HOME/.gitconfig"
ln -s "$HOME/Code/dotfiles/gitignore" "$HOME/.gitignore"Silence last login terminal message:
touch ~/.hushloginFish is installed by brew bundle. Make it the login shell:
echo /opt/homebrew/bin/fish | sudo tee -a /etc/shells
chsh -s /opt/homebrew/bin/fishLink the config, prompt, and theme:
mkdir -p ~/.config/fish/conf.d ~/.config/fish/functions
ln -sf "$HOME/Code/dotfiles/fish/config.fish" "$HOME/.config/fish/config.fish"
ln -sf "$HOME/Code/dotfiles/fish/conf.d/fish_frozen_theme.fish" \
"$HOME/.config/fish/conf.d/fish_frozen_theme.fish"
ln -sf "$HOME/Code/dotfiles/fish/functions/fish_prompt.fish" \
"$HOME/.config/fish/functions/fish_prompt.fish"
ln -sf "$HOME/Code/dotfiles/fish/functions/fish_right_prompt.fish" \
"$HOME/.config/fish/functions/fish_right_prompt.fish"config.fish runs eval (/opt/homebrew/bin/brew shellenv) — on Apple Silicon
Homebrew lives in /opt/homebrew, which is not on the default PATH.
~/.config/fish/fish_variables is not tracked; fish rewrites it whenever a
universal variable changes. Anything worth keeping goes in config.fish instead
— a global there shadows a universal of the same name.
Atuin replaces shell history with a searchable SQLite database. It is installed
by brew bundle.
Link the config and the fish integration:
mkdir -p ~/.config/atuin ~/.config/fish/conf.d
ln -sf "$HOME/Code/dotfiles/atuin/config.toml" "$HOME/.config/atuin/config.toml"
ln -sf "$HOME/Code/dotfiles/fish/conf.d/atuin.fish" \
"$HOME/.config/fish/conf.d/atuin.fish"Import existing shell history once, then open a new shell:
atuin import autoThe init runs with --disable-up-arrow, so Ctrl+R opens atuin's search and
the up arrow keeps fish's native prefix search. The init also binds bare ? to
atuin's AI search.
enter_accept = true means Enter in the search UI runs the command
immediately; Tab puts it on the prompt to edit instead.
The history database in ~/.local/share/atuin is not tracked — it is machine
state, and key in that directory is the sync encryption key. Back that key up
somewhere private if you ever enable sync; without it, synced history cannot be
decrypted on another machine.
Link the global instructions and the Tomorrow Night Bright theme:
mkdir -p "$HOME/.claude/themes"
ln -sf "$HOME/Code/dotfiles/claude/CLAUDE.md" "$HOME/.claude/CLAUDE.md"
ln -sf "$HOME/Code/dotfiles/claude/tomorrow-night-bright.json" \
"$HOME/.claude/themes/tomorrow-night-bright.json"Then pick the theme with /config, or set it directly in
~/.claude/settings.json:
{ "theme": "custom:tomorrow-night-bright" }Link the status line script (shows model, directory, context usage, and either 5h/7d rate-limit quota on a subscription or session cost on an API key):
ln -sf "$HOME/Code/dotfiles/claude/statusline-command.sh" \
"$HOME/.claude/statusline-command.sh"Then point to it in ~/.claude/settings.json:
{
"statusLine": {
"type": "command",
"command": "bash ~/.claude/statusline-command.sh"
}
}settings.json itself is not symlinked — it holds machine-specific hooks and
plugin state.
neovim, neovide-app, gopls, and tree-sitter-cli are installed by
brew bundle.
Link the config, the lockfile, the fallback theme, and Neovide's font settings:
mkdir -p "$HOME/.config/nvim/colors" "$HOME/.config/neovide"
ln -sf "$HOME/Code/dotfiles/nvim/init.lua" "$HOME/.config/nvim/init.lua"
ln -sf "$HOME/Code/dotfiles/nvim/lazy-lock.json" \
"$HOME/.config/nvim/lazy-lock.json"
ln -sf "$HOME/Code/dotfiles/nvim/colors/Tomorrow-Night-Bright.vim" \
"$HOME/.config/nvim/colors/Tomorrow-Night-Bright.vim"
ln -sf "$HOME/Code/dotfiles/neovide/config.toml" \
"$HOME/.config/neovide/config.toml"Plugins install on first launch. Then build the treesitter parsers:
nvim --headless -c 'lua require("nvim-treesitter").install({"go","gomod","gosum","gotmpl","lua","vim","vimdoc","query","bash","json","yaml","toml","markdown","markdown_inline","hcl","terraform","dockerfile","typescript","tsx","javascript","css","html","python","sql","diff","gitcommit"}):wait(600000)' -c 'qa'Font size is set in neovide/config.toml and read at startup, so changing it
needs a full quit. To tune it live, :set guifont=Monaco:h11.
Link the config:
mkdir -p "$HOME/.config/ghostty"
ln -sfn "$HOME/Code/dotfiles/ghostty/config" "$HOME/.config/ghostty/config"Ghostty loads $XDG_CONFIG_HOME/ghostty/config (defaulting to ~/.config) and
then ~/Library/Application Support/com.mitchellh.ghostty/config, merging
both — the Application Support file does not replace the XDG one, it overrides
only the keys it sets. Keep that directory empty so this config is the whole
story; a stray file there wins silently and is easy to forget about.
Ghostty writes a template config to Application Support on first launch only when it finds no config anywhere, so the symlink above prevents it reappearing.
Cmd+Shift+, reloads the config, but some options — macos-titlebar-style
among them — only apply to new windows, so a full restart is sometimes needed.
Open "Tomorrow Night Bright.itermcolors"
Tell iTerm to load your preferences from iCloud.
Tell alfred to load your preferences from iCloud.
defaults write com.apple.screencapture show-thumbnail -bool NO
killall SystemUIServer



