These are my dotfiles. There are many like them, but these are mine.
They are mostly for ZSH and Mac, but I use them on Linux too. No framework, just zsh and a starship prompt.
Clone this repo to ~/dotfiles (the shell configs expect it there), then run
script/install:
git clone git@github.com:PatrickTulskie/dotfiles.git ~/dotfiles
~/dotfiles/script/install
script/install is idempotent and safe to re-run on any machine. It symlinks
everything into place (backing up anything real it would clobber), installs
vim-plug and the Meslo Nerd Font if they're missing, and seeds
Rectangle's prefs on a machine that has none yet.
~/.zshrc and ~/.gitconfig are the two files other tools like to edit in
place (guise, ltv-agent), so the installer asks how to wire each one:
- Symlink — the repo file itself. Edits by those tools land in the repo.
- Stub — a real file whose first lines load the repo copy. Tools append below and the repo stays clean. An existing file keeps its contents.
- Leave it — hands off.
It only asks when the file isn't already wired one of those ways, and
DOTFILES_RC_MODE=link|stub|skip answers for both without a prompt.
A machine that was on the old layout (resources/_zshrc, _universal_*,
Vundle, thefuck) should run script/migrate once instead. It clears out what
the installer doesn't know about, swaps thefuck for pay-respects, then runs
script/install. Anything local it won't delete on its own, it prints.
zsh/zshrc symlinked to ~/.zshrc
zsh/path.zsh the only place PATH is assembled
zsh/shell.zsh history, completion, key bindings
zsh/env.zsh exports
zsh/aliases.zsh aliases
zsh/linux.zsh Linux-only bits
script/ install, migrate, and the terminal UI they share
bin/ scripts, on PATH via path.zsh
config/ app configs symlinked into ~/.config (git, ghostty, ...)
private/_* gitignored; anything matching is sourced after the rest
If you'd rather not run the installer, source zsh/path.zsh first and the
other zsh/*.zsh files after it, as zsh/zshrc does.
config/git/config is linked to ~/.gitconfig, so git config --global
writes land in the repo. config/git/ignore goes to ~/.config/git/ignore,
git's default global excludes path.
config/hunk/config.toml defines a "Monokai Soda" custom theme for
hunk that matches the Ghostty terminal
theme (hunk ships plain Monokai but no Soda variant).
config/herdr/config.toml does the same for herdr via its
[theme.custom] token overrides, using the same palette.
zsh/zshrc binds ctrl+r to atuin via --disable-up-arrow,
so history search is atuin's but up-arrow stays zsh's. The binary comes from
Homebrew (see the iac repo); the hook is guarded on command -v atuin, so a
box without it just falls back to zsh's own ctrl+r. config/atuin/config.toml
keeps it local-only — no account, no sync, no network.
fuck is pay-respects, also from
Homebrew and also guarded, so it's simply absent where it isn't installed.
mise, direnv and
zoxide (z, zi) are hooked in the
same way, straight from the binaries.
The prompt is starship, pointed straight at config/starship/ by
STARSHIP_CONFIG. soda.toml (the default) is the Pastel Powerline preset in
the Monokai Soda palette; jived.toml is the old oh-my-zsh theme. Set
STARSHIP_THEME=jived (a private/_* file works) to switch. Without starship
installed there's a plain fallback prompt.
fzf is deliberately not wired into the shell. It's installed for vim's
<C-P> (:FZF), which only needs the binary on PATH, and atuin owns ctrl+r.
cmd+k clears the screen inside herdr panes (and any other TUI) because
config/ghostty/config remaps it to send ctrl+l rather than firing Ghostty's
own clear_screen. Ghostty's scrollback-wiping clear moved to cmd+shift+k.
config/rectangle/RectangleConfig.json only seeds a fresh machine. To update
it, export from Rectangle's settings and overwrite the file.
config/iterm and resources/themes/macos-terminal are kept for reference but
nothing installs them; Ghostty is the terminal.