Personal dotfiles managed with GNU Stow.
- fish — the interactive shell; plugins declared in
fish_plugins(Fisher, Tide prompt, nvm.fish) - zsh — stays the login shell, so it only sets up PATH, nvm and pnpm for scripts and fallback sessions; machine-local values come from
~/.zshrc.local - nvim — Neovim config based on LazyVim
- tmux —
C-aprefix, vi-style copy mode withpbcopy, plugins managed by TPM - ghostty — Ghostty terminal config (tokyonight-night theme, transparent background with blur), and where fish is launched from
There is deliberately no git package: identity and URL rewrites differ per machine, so install.sh writes ~/.gitconfig once and never tracks it.
On a fresh macOS machine:
git clone https://github.com/AndyWang-505/dotfiles.git ~/dotfiles
cd ~/dotfiles
./install.shinstall.sh is idempotent — re-run it any time. It will:
- install Homebrew if missing, then everything in
Brewfile - create
~/.gitconfigand a~/.zshrc.localstub for values that must not be committed - move any pre-existing
.zshrc/.zprofileto*.pre-dotfiles, then stow every package - clone TPM and install the tmux plugins
- bootstrap Fisher, install the fish plugins, and create the
config-local.fishstub - install the LTS Node under
~/.nvm/versions/node, which both nvm.sh and nvm.fish read - run
nvim --headless "+Lazy! restore", which installs plugins at the commits pinned inlazy-lock.json
Then fill in your real values:
$EDITOR ~/.gitconfig # user.name, user.email
$EDITOR ~/.zshrc.local # JIRA_USER_EMAIL, JIRA_API_TOKEN, ...
$EDITOR ~/.config/fish/config-local.fish # the same, for fishEach package mirrors the target layout under $HOME, so stow nvim symlinks nvim/.config/nvim/ → ~/.config/nvim/.
Ghostty runs fish through its command setting, so the login shell can stay zsh. To change that too:
echo $(brew --prefix)/bin/fish | sudo tee -a /etc/shells
chsh -s $(brew --prefix)/bin/fishEverything is in the Brewfile and installed by install.sh. Listed here for reference:
- GNU Stow, git
- Neovim ≥ 0.10, plus fzf > 0.36, ripgrep and fd for its pickers
- tmux ≥ 3.2 (
terminal-featuresis used to declare truecolor) - fish
- JetBrainsMono Nerd Font, Ghostty
- gh, pnpm — referenced by the shell configs and the day-to-day workflow
Untracked on purpose, because this repo is public:
| File | Holds |
|---|---|
~/.gitconfig |
user.name / user.email, and URL rewrites that only exist because a given work repo cannot be cloned over SSH here |
~/.zshrc.local |
credentials and work-only environment (sourced at the end of .zshrc) |
~/.config/fish/config-local.fish |
the same escape hatch for fish |
nvim/.../lua/config/local.lua, nvim/.../lua/plugins/local/ |
editor config tied to one employer's repos (Nx keymaps, oxlint formatter) |