My various configuration files managed with GNU Stow.
Most packages are installed by stowing into $HOME (their internal
structure already includes the leading dot, e.g. tmux/.tmux.conf):
stow -t $HOME <directory>For example, to install tmux configuration:
stow -t $HOME tmuxPackages whose files live outside $HOME (under ~~/.config~, ~~/bin~,
~~/.claude~) use a different stow target — see the per-section notes
below.
To install everything at once:
for pkg in git lein tmux zsh; do stow -t $HOME $pkg; done
stow -t $HOME/bin bin
stow -t $HOME/.claude claude
stow -t $HOME/.config ghostty ghostty-linux podman starship # or ghostty-macos
stow -t $HOME/.config/hunk hunk
stow -t $HOME/.config/tuicr tuicrScripts under tests/ are plain bash and run standalone. They build
throwaway git repositories under a temp directory, so they never touch
this one:
./tests/test-better-branch
./tests/test-eat-trailing-whitespaceOr all of them, stopping at the first failure:
for t in tests/test-*; do "$t" || break; donetests/ is deliberately not a stow package — bin/ is stowed onto
PATH, so test scripts must live outside it.
Personal shell scripts (better-branch, eat-trailing-whitespace,
osc52-copy). Stowed directly to $HOME/bin:
stow -t $HOME/bin binBoth the macOS and linux branches of the zsh config add $HOME/bin to
PATH.
Claude Code settings (CLAUDE.md and settings.json). Stowed to
$HOME/.claude:
stow -t $HOME/.claude claudeOnly settings.json is tracked. Claude Code writes machine-local state
into settings.local.json — permission grants and the absolute paths
they refer to — so that file is gitignored and deliberately left
unstowed, keeping it out of this repo.
Configuration for the Ghostty terminal emulator. Shared settings live in
the ghostty package; the platform-specific overrides live in
ghostty-linux and ghostty-macos, which are separate packages so that
only the one matching this machine is ever linked:
stow -t $HOME/.config ghostty ghostty-linux # or ghostty-macosEach package holds a ghostty/ subdirectory, the same shape as podman,
so the files land in $HOME/.config/ghostty/. Stow folds that directory
into a symlink if only one package claims it and unfolds it again when
the second arrives, so stowing the two in either order or separately all
work.
They are separate packages rather than three files in one on purpose.
Stow links every file in a package, so holding config_macos next to
config_linux put both on every machine, and since config pulls them in
last, the macOS padding quietly won on Linux.
Git configuration and aliases.
The git config uses an include directive to load machine-specific settings from ~~/.gitconfig.local~. After stowing, set up your email:
cp ~/.gitconfig.local.example ~/.gitconfig.local
# Edit ~/.gitconfig.local to set your emailConfiguration for the Hunk terminal diff viewer (config.toml). Stowed
to $HOME/.config/hunk rather than $HOME/.config so the directory
itself stays real — Hunk writes runtime state (state.json) alongside
the config, and that shouldn’t end up in this repo:
stow -t $HOME/.config/hunk hunkThe target directory must exist first (run hunk once or mkdir -p
~/.config/hunk).
Leiningen configuration for Clojure development with CIDER integration and useful aliases.
Container registry policy. Stowed to $HOME/.config (creates
$HOME/.config/containers/policy.json):
stow -t $HOME/.config podmanStarship prompt configuration. Stowed to $HOME/.config (creates
$HOME/.config/starship.toml):
stow -t $HOME/.config starshipThe following packages should be installed to get optimal TMUX experience on MacOS.
brew install reattach-to-user-namespace
brew install pam-reattachConfiguration for the tuicr code review TUI (config.toml). Stowed to
$HOME/.config/tuicr so the directory itself stays real:
mkdir -p ~/.config/tuicr
stow -t $HOME/.config/tuicr tuicrConfiguration for ZSH shell with Starship prompt.