This repo uses GNU Stow to manage dotfiles as symlinks in your home directory and uses TPM to install tmux plugins declared in tmux/.config/tmux/tmux.conf.
Packages are processed in this install/restow order:
misezshstarshiptmuxnvimghosttybtopgitpsqlagents
For removal, the script runs the individual remove commands in reverse order.
- Clone this repo
- Run commands from the repo root
For a full setup on a new machine, run:
./run.sh installTo skip the automatic shell reload at the end:
./run.sh install --no-reload-shellThis installs system bootstrap packages (jq and stow) if needed, installs mise if needed, stows the mise config, runs mise install, stows the remaining packages (zsh, starship, tmux, nvim, ghostty, btop, git, psql, and agents), then bootstraps TPM and installs tmux plugins from tmux.conf.
Install system bootstrap packages:
./run.sh install-systemPreview dotfile changes first:
./run.sh dry-runInstall packages individually:
./run.sh install-mise
./run.sh install-zsh
./run.sh install-starship
./run.sh install-tmux
./run.sh install-nvim
./run.sh install-ghostty
./run.sh install-btop
./run.sh install-git
./run.sh install-psql
./run.sh install-agent-skillsYou can also skip shell reload for install-zsh:
./run.sh install-zsh --no-reload-shellRemove packages individually:
./run.sh remove-zsh
./run.sh remove-mise
./run.sh remove-starship
./run.sh remove-tmux
./run.sh remove-nvim
./run.sh remove-ghostty
./run.sh remove-btop
./run.sh remove-git
./run.sh remove-psql
./run.sh remove-agent-skillsInstall tmux TPM and the tmux plugins declared in tmux/.config/tmux/tmux.conf:
./run.sh install-tmux-tpmRun this after installing dotfiles individually if you want to bootstrap TPM separately:
./run.sh install-tmux-tpmWhat it does:
- Ensures
tmux/.config/tmux/pluginsexists - Clones TPM into
tmux/.config/tmux/plugins/tpm - Re-stows the
tmuxpackage - Loads tmux config from
$HOME/.config/tmux/tmux.conf - Runs TPM's
install_pluginscommand to fetch plugins listed intmux.conf
This step requires both git and tmux to be installed.
Use this after changing files in the repo to refresh symlinks in the same defined order:
./run.sh restowRemove all symlinks created by stow in reverse order:
./run.sh remove- Symlinks target
$HOME - If a target file already exists,
stowmay report a conflict - Back up or remove conflicting files before installing
install-systemusesbrewon macOS orpacmanon Linux to installjqandstowmisebootstrap package definitions currently includebrew:jq,brew:stow,pacman:jq, andpacman:stowmisebootstrap currently supportszshandbashbased on$SHELL.zshrcdefensively initializesmise,starship, andfzfonly when those binaries are availableinstallis the one-command bootstrap for a new machine, includes every package plus tmux TPM/plugin setup, and reloads the shell by defaultinstall-miseinstallsmisewith the shell-appropriate bootstrap URL when needed, ensures system bootstrap packages are installed, stows its config, and runsmise installinstall-zshreloads the shell by default after stowing.zshrc; pass--no-reload-shellto skip thatinstall-zsh,install-starship,install-tmux,install-nvim,install-ghostty,install-btop,install-git,install-psql, andinstall-agent-skillseach stow only their matching packageremove-zsh,remove-mise,remove-starship,remove-tmux,remove-nvim,remove-ghostty,remove-btop,remove-git,remove-psql, andremove-agent-skillseach unstow only their matching packagerestowre-stows all managed packages to refresh symlinks after repo changesremoveruns all package remove commands in reverse install order
The psql package manages ~/.psqlrc and sets the pager to less -SRXF on startup:
\setenv PAGER 'less -SRXF'
\pset pager always
To apply just the PostgreSQL client config:
./run.sh install-psqlThis creates a symlink at ~/.psqlrc via Stow.
The git config in this repo uses Git conditional includes to switch the commit [user] name and email based on the repository's remote URL. Your fallback identity lives directly in ~/.config/git/config-identities, with optional conditional overrides below it.
- The main config (
git/.config/git/config) includes one local file at the end:
[include]
path = ~/.config/git/config-identities~/.config/git/config-identitiesis not committed (it is ignored bygit/.config/git/.gitignore). It contains your default[user]identity at the top plus anyincludeIfrules for more specific identities:
[user]
name = Your Name
email = your.default.email@example.com
[includeIf "hasconfig:remote.*.url:git@github.com:my-org/**"]
path = config-my-org- A matched identity file overrides the
[user]section:
[user]
name = Your Name
email = your.work.email@example.com- Copy the template:
cp git/.config/git/config-identities.template git/.config/git/config-identities- Edit
git/.config/git/config-identitiesand set your default identity at the top:
[user]
name = Your Name
email = your.default.email@example.com- Create a per-identity file, for example
git/.config/git/config-work:
[user]
name = Your Name
email = your.work.email@example.com- Add a conditional include in
git/.config/git/config-identities:
[includeIf "hasconfig:remote.*.url:git@github.com:my-org/**"]
path = config-work- Re-stow the git package so the files are linked into
~/.config/git/:
./run.sh install-git- Test it by running
git config user.emailinside repositories whose remote URLs match and do not match the pattern.
If someone asks how the identity switching works, you can share this short summary:
Our dotfiles use Git's conditional includes. The main git config loads
~/.config/git/config-identities, which contains your default[user]name/email at the top plus optionalincludeIfrules for repo-specific identities. Matching rules loadconfig-<name>files that override the identity for those repos. These files are gitignored, so they stay personal and are never committed. To set them up, copyconfig-identities.templatetoconfig-identities, set your default identity there, create anyconfig-<name>override files you need, add the matchingincludeIfrules, and run./run.sh install-git.