Runs on macOS and Pop!_OS (COSMIC). Platform-specific pieces — casks, Hermes, macOS defaults, COSMIC shortcuts — are selected automatically.
- Ghostty — terminal, Monaco on a Tomorrow Night Bright palette
- fish — login shell, custom prompt, atuin history search on
Ctrl+R - Neovim + Neovide — AstroNvim-based config, macOS-style Cmd/Option keybindings, treesitter parsers prebuilt
- Zed — settings and keymap
- Claude Code — global instructions, theme, status line
- Hermes — window manager, installed from its GitHub releases
- k9s, git — views, gitconfig, global gitignore
Homebrew packages are split: brew/Brewfile is shared, brew/Brewfile.macos
holds the casks (Linuxbrew has no cask support), and brew/Brewfile.linux is
for Pop!_OS additions. On Pop!_OS the script installs CLI tools only — GUI apps
come from apt, flatpak, or the Pop!_Shop.
On macOS, install the Xcode command line tools:
xcode-select --installOn Pop!_OS, install the Homebrew prerequisites:
sudo apt install build-essential procps curl file gitCreate an SSH key and add it to GitHub at https://github.com/settings/keys:
ssh-keygen -t ed25519 -C "erick.yellott@gmail.com"
echo "AddKeysToAgent yes" >> ~/.ssh/config
echo "IdentityFile ~/.ssh/id_ed25519" >> ~/.ssh/config
ssh-addClone the repo:
mkdir -p ~/Code
git clone git@github.com:erickyellott/dotfiles.git ~/Code/dotfilesWork and personal machines differ in two places: the git email, and the Nuon fish config. Which one a machine is comes from an untracked file:
mkdir -p ~/.config/dotfiles
echo work > ~/.config/dotfiles/profile # or: personalAbsent, it defaults to personal — which is just the committed config, since
the personal email lives in git/gitconfig directly. On work the script links
git/gitconfig.work over it and adds the fish/work/ files; switching back to
personal removes both again.
cd ~/Code/dotfiles
./install.shIt installs Homebrew and the Brewfiles for the current platform, symlinks every
config, makes fish the login shell, and builds the treesitter parsers. On macOS
it also installs Hermes and sets a few system defaults. It is safe to
re-run at any time — anything already correct is left alone, and anything real
in the way is backed up to <name>.bak.<timestamp> first.
./install.sh --dry-run # print what would change, change nothing
./install.sh --links-only # just the symlinks; skip brew, shell, apps-
Alfred — load preferences from iCloud
-
atuin — import existing shell history once, then open a new shell:
atuin import auto
-
Claude Code — add to
~/.claude/settings.json, which is not symlinked because it holds machine-specific hooks and plugin state:{ "theme": "custom:tomorrow-night-bright", "statusLine": { "type": "command", "command": "bash ~/.claude/statusline-command.sh" } }The status line shows the model, directory, and a filling bar for context and quota usage with the percentage printed inside it (green under 50%, yellow to 80%, red above). API-key sessions have no quota, so they show accrued cost instead.


