Skip to content

Migrate dotfiles from bash to zsh and modernize the toolchain#22

Merged
celkins merged 3 commits into
masterfrom
modernize-2026
Jul 22, 2026
Merged

Migrate dotfiles from bash to zsh and modernize the toolchain#22
celkins merged 3 commits into
masterfrom
modernize-2026

Conversation

@celkins

@celkins celkins commented Jul 22, 2026

Copy link
Copy Markdown
Owner

Summary

Moves the shell layer to zsh (the macOS default since Catalina) and refreshes the toolchain. dotbot still manages symlinks; the *.d snippet architecture and command -v guards are retained, so a missing tool degrades silently.

  • Shell: .zshenv/.zprofile/.zshrc replace the bash startup files; bashrc.d/zshrc.d/; zsh's compinit replaces bash-completion (removing the bash-4 prerequisite entirely). brew shellenv now runs in .zprofile, so HOMEBREW_PREFIX is actually set.
  • Tooling: exaeza, liquidpromptstarship, diff-so-fancydelta, and jenv/direnv/nodenv/rbenvmise. Adds ripgrep, fd, fzf, zoxide.
  • Zenburn wired end to end: vendored .tmTheme for bat and delta (BAT_THEME=zenburn was previously a no-op), fzf picker colours, starship palette, plus a Nerd Font for prompt glyphs.
  • Signing: 1Password op-ssh-sign, scoped by remote URL to the personal GitHub namespace, so work repos stay unsigned even on a personal machine. Verification (allowed_signers) is global so signed commits elsewhere show as untrusted rather than erroring.
  • Removed as dead: the aws, aws-vault, terraform, hub, jenv, emacs, dotnet and dircolors snippets; direnvrc; the XDG_DATA_HOME/XDG_CONFIG_HOME overrides; svn, python and bash-completion from the Brewfile; and the historical ~/.gitconfig.

Several bash→zsh semantic gaps were found and fixed after the port, not just syntax: compinit aborting on Homebrew's group-writable fpath (which silently disabled all completion), WORDCHARS swallowing whole hyphenated names on Option+Delete, and setopt correct being a mis-port of shopt -s cdspell.

Test plan

  • make shellcheck clean (CI target repointed at zshrc.d/)
  • Fresh login shell starts with no errors; Starship renders
  • Case-insensitive completion, prefix history search, Option+Delete word semantics
  • eza/ll, z, Ctrl-R (fzf), mise all active
  • bat + delta render Zenburn; bat --list-themes includes zenburn
  • Signing verified status=G with the dedicated signing key; confirmed off for work-namespace remotes
  • Verify on a work machine (Colima Include, no signing)

🤖 Generated with Claude Code

celkins added 3 commits July 22, 2026 14:21
Shell layer moves to zsh, the macOS default since Catalina: .zshenv/.zprofile/
.zshrc replace the bash startup files, per-tool snippets move to zshrc.d/, and
zsh's compinit replaces bash-completion. dotbot still manages the symlinks.

Tooling: exa -> eza, liquidprompt -> starship, diff-so-fancy -> delta, and
jenv/direnv/nodenv/rbenv -> mise. Adds ripgrep, fd, fzf and zoxide. Zenburn is
wired end to end (vendored bat/delta theme, fzf colours, starship palette) with
a Nerd Font for prompt glyphs.

Removed as dead: the aws, aws-vault, terraform, hub, jenv, emacs, dotnet and
dircolors snippets; direnvrc; the XDG_DATA_HOME/XDG_CONFIG_HOME overrides; and
svn, python and bash-completion from the Brewfile.

Commit signing via 1Password's op-ssh-sign, scoped by remote URL to the personal
GitHub namespace so work repos stay unsigned even on a personal machine. The
historical ~/.gitconfig is retired in favour of the managed config.
config.local carries machine-wide Host * overrides (work machines point at a
Secure Enclave agent rather than 1Password), so it belongs after Colima's
host-specific blocks but still before the repo defaults. Verified both hold at
once: config.local overrides the default agent for github.com, while Colima's
per-host settings are no longer shadowed by it.
Both were GOPATH-layout relics ($GOPATH/{bin,pkg,src}) from when profile set
GOPATH=$HOME; src also backed the old CDPATH. That override went with the bash
profile, go isn't installed and GOPATH is unset, and the mkdir line was the only
reference to either path in the repo. Both were empty and have been removed.

~/bin stays: it is the target of the PATH prepend in zprofile, which is a no-op
unless the directory exists.
@celkins
celkins merged commit df9ccd4 into master Jul 22, 2026
1 check passed
@celkins
celkins deleted the modernize-2026 branch July 22, 2026 23:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant