💻 ghostty, neovim, zsh, tmux, starship, lazygit, homebrew — my whole world
All shell commands manage globally installed packages (Homebrew, npm, pipx, cargo, mas).
The repo lives at ~/dotfiles/ and uses GNU stow to symlink each package into $HOME — $HOME itself is not a git working tree.
xcode-select --install # one-time, GUI prompt
git clone https://github.com/IvanWng97/dotfiles.git ~/dotfiles
cd ~/dotfiles && make bootstrapmake bootstrap installs Homebrew + stow, backs up any conflicting files in $HOME to ~/.dotfiles-pre-stow-<timestamp>/, stows the dotfile packages, and runs make install. Pass SKIP_INSTALL=1 to skip the package install step.
| Command | What it does |
|---|---|
make bootstrap |
Fresh-machine setup: brew + stow + symlinks + make install. Idempotent. |
make install |
Installs everything from Backup/Brewfile, Npmfile, Pipfile, Cargofile, Fishfile, plus tpm + plugins. |
make install-links |
Re-run stow to (re)create symlinks under $HOME. |
make uninstall-links |
Remove the symlinks (configs stay safe in ~/dotfiles/). |
make relink |
uninstall-links then install-links — useful after adding a new file to a package. |
make symlinks-check |
Verify every package file has a matching, correctly-resolved symlink in $HOME; reports orphans too. Exits non-zero on issues. |
make doctor |
Run every health check at once: zsh syntax on each script, symlinks-check, Brewfile parses, git working tree clean. |
make update |
Upgrades brew/npm/pipx/cargo/mas/tmux packages and re-dumps Backup/Brewfile so it matches reality. |
make backup |
Re-dumps every package list into Backup/ for committing. |
All five scripts (bootstrap, install, update, backup, check-links) live in scripts/ and share a small set of helpers (set -euo pipefail, colored output, per-tool guards).
Each tool gets its own top-level package. All packages stow into $HOME; each one carries the right .config/, .aria2/, etc. structure inside it so stow puts files in the correct XDG location.
~/dotfiles/
alacritty/.config/alacritty/...
fish/.config/fish/...
nvim/.config/nvim/...
... ← 13 XDG packages
aria2/.aria2/aria2.conf
claude/.claude/settings.json
bash/.bashrc
czrc/.czrc
vim/.vimrc vim/.ideavimrc
zsh/.zshrc
The Makefile auto-discovers packages (every top-level dir except scripts/, Backup/, .github/, .git/) and runs a single stow -v -t ~ <packages...> call. Run make print-packages to see the current list.
Scripts under scripts/ are written in zsh (#!/usr/bin/env zsh); the lint workflow runs zsh -n on each to catch syntax errors.
The same checks the CI runs (gitleaks, actionlint, zsh -n, plus trailing-whitespace / EOF / YAML / merge-conflict) are available as pre-commit hooks. Opt-in per clone:
brew install pre-commit
pre-commit installZsh is the daily driver — kept lean, with eza/zoxide/fzf/bat/starship glue.
Starship handles the prompt — see config.toml.
| Vim | Neovim | |
|---|---|---|
| Main Configuration File | ~/.vimrc |
~/.config/nvim/init.lua |
| Configuration directory | ~/.vim |
~/.config/nvim |
Helix is also set up for quick edits.
Tmux config lives in tmux.conf. Prefix is C-Space; C-h/j/k/l navigates panes (vim-aware), M-h/j/k/l resizes them. Zellij is configured as an alternative.
Configs for Ghostty, Kitty, and Alacritty — Ghostty is the daily driver.
lazygit, tealdeer, lf, xplr, helix.
Everything is Dracula!
JetBrains Mono Nerd Font — installed via the font-jetbrains-mono-nerd-font cask in Backup/Brewfile.
👤 Ivan — @IvanWng97
MIT — feel free to fork, copy, and rip out whatever's useful.
Give a ⭐️ if this project helped you!
