Personal configuration files — symlinked, versioned, and ready to clone.
- What's in here
- Fresh machine setup
- Stow reference
- Day-to-day workflows
- Recovering from conflicts
- Security
- Quick cheatsheet
All configs live under .config/ and are symlinked into ~/.config via GNU Stow. The repo root mirrors your home directory — stow creates the links, git tracks the content.
| Config | What it does |
|---|---|
zsh |
Primary shell — functions, completions, abbreviations, and $PATH setup all live here |
nushell |
Nu shell config for when you want structured data pipelines instead of text streams |
starship |
Cross-shell prompt that shows only what's relevant: git state, language versions, exit codes |
atuin |
Replaces shell history with a searchable, syncable SQLite database |
| Config | What it does |
|---|---|
nvim |
LazyVim — a full IDE setup without the config sprawl |
zed |
Fast native editor for when you want to stay out of the terminal |
ghostty |
GPU-accelerated terminal with a sane default config and zero latency |
tmux |
Session persistence and window management; TPM handles plugins |
zellij |
Multiplexer alternative with a built-in layout system — useful for complex workspace configs |
| Config | What it does |
|---|---|
lazygit |
Git operations without memorizing flags — branches, rebases, and diffs in a single view |
lazydocker |
Container and image management TUI that replaces most docker invocations |
k9s |
Kubernetes cluster management from the terminal; essential when kubectl get isn't enough |
yazi |
Terminal file manager with previews, bulk operations, and plugin support |
television |
Fuzzy finder built for speed — a ripgrep-powered fzf alternative |
hunk |
Patch review and staging TUI |
| Config | What it does |
|---|---|
karabiner |
Keyboard remapping at the driver level — complex modifications, home-row mods, layer switching |
mise |
Runtime version manager for Node, Python, Ruby, and anything else — replaces nvm, rbenv, pyenv |
bat |
cat with syntax highlighting, line numbers, and git diff markers |
btop |
System monitor with a layout that actually uses your terminal width |
gh |
Official GitHub CLI — PRs, issues, workflows, and releases from the terminal |
gh-dash |
Dashboard TUI for gh — all your open PRs and issues in one view |
raycast |
Launcher extensions and scripts |
sqruff |
SQL linter and formatter config |
bucky |
Local configuration for this setup's custom tooling |
Prerequisites: brew install stow
git clone <repo-url> ~/Developer/personal/dootfilesBefore stowing, back up any existing configs that would conflict. Stow refuses to overwrite real files — it errors rather than silently clobbering:
cd ~/.config
for dir in atuin bat btop bucky fish gh gh-dash ghostty hunk k9s karabiner \
lazydocker lazygit mise nushell nvim raycast sqruff starship \
television tmux yazi zed zellij; do
[ -d "$dir" ] && mv "$dir" "${dir}.bak"
doneThen create the symlinks:
cd ~/Developer/personal/dootfiles
stow --target="$HOME" .That's it. Every tool that reads from ~/.config will now pick up the versioned config.
Verify it worked:
readlink ~/.config/fishshould print../Developer/personal/dootfiles/.config/fish
Always run this first on an unfamiliar machine:
stow -nv --target="$HOME" .Prints every link that would be created or removed. Nothing is changed.
stow --target="$HOME" .Idempotent. Already-correct symlinks are left alone — safe to re-run anytime.
stow --restow --target="$HOME" .Unstow + stow in a single step. Run this after adding a new tool config, renaming a directory, or pulling in someone else's changes.
stow --delete --target="$HOME" .Removes every symlink stow created. Your .bak directories are untouched — rename them back to restore the originals.
stow --verbose --target="$HOME" .
# combine with dry run:
stow -nv --target="$HOME" .Move the existing config into the repo, then restow:
mv ~/.config/newapp ~/Developer/personal/dootfiles/.config/newapp
cd ~/Developer/personal/dootfiles
stow --restow --target="$HOME" .Then commit the new directory. The symlink is live immediately — no restart needed.
# Remove from repo
rm -rf ~/Developer/personal/dootfiles/.config/oldapp
# Clean up the now-dead symlink
stow --restow --target="$HOME" .The app will recreate ~/.config/oldapp fresh on next launch using its own defaults.
If stow exits with a conflicts error, a real file (not a symlink) exists at the target path. Two options:
# Option 1: back it up and re-run
mv ~/.config/problem-app ~/.config/problem-app.bak
stow --target="$HOME" .# Option 2: adopt it — stow moves the file INTO the repo and links back
# Use this only if you want to pull the existing file into your dotfiles
stow --adopt --target="$HOME" .
git diff # always review before committing — adopt can be destructiveNote on
--adopt: This flag rewrites the file in your repo to match what's on disk. If the on-disk version is worse than what you had committed, you'll overwrite your config. Checkgit diffbefore yougit addanything.
Never commit credentials to this repo.
API keys, tokens, session cookies, and passwords do not belong here. The right pattern:
- Machine-specific secrets live in a file sourced outside this repo (e.g.
~/.config/fish/local.fishadded to.gitignore) - Long-term secrets belong in a password manager or secrets manager, not in any dotfile
- If you accidentally commit a secret, treat it as compromised immediately — git history is public
# Preview what stow will do (always run first)
stow -nv --target="$HOME" .
# Create / update symlinks
stow --target="$HOME" .
# Sync after adding or moving configs
stow --restow --target="$HOME" .
# Remove all symlinks
stow --delete --target="$HOME" .
# Verify a specific symlink
readlink ~/.config/fish