My main working machine setup. Here be cyber dragons π and optional bugs π.
The links below lead to my configuration files in this repo.
I run macOS. π Packages are managed with Homebrew β see Brewfile
for the explicit install list (brew bundle --file=~/Brewfile to restore on a
fresh machine). Ghostty is my terminal with tmux on top for
window management, and Starship as the prompt. I code in
Neovim with AstroNvim as the distro.
Zsh with zinit as the plugin manager. Zinit solves two problems that
matter when your .zshrc does a lot:
- Async loading (
wait,lucidice modifiers) β heavy plugins load after the prompt renders, so shell startup stays snappy. Autosuggestions, history search, syntax highlighting, gcloud completions, scm_breeze β all deferred. - Lazy install + git-based plugins β first-time clone is automatic, and
binary plugins (e.g. the k9s theme bundle) install from GitHub releases
via
from"gh-r".
A few notable hacks in there:
- Prezto without SVN β GitHub killed SVN in 2024, so
zinit ice svnno longer works for cherry-picking single Prezto modules. Workaround: clone the full Prezto repo once andsourceindividual module init scripts manually. - Claude Code fast path β when
$CLAUDECODEis set, the shell short-circuits after loading just zinit, PATH, fnm, and direnv. No prezto, themes, completions, or keybindings β Claude doesn't need them and they cost startup time on every Bash tool call. - compinit guard β zinit wraps autoload during plugin loads, which breaks
_tags(stack-depth-sensitive). A small loop strips the wrapper beforecompinitruns.
.zprofile keeps a few login-shell-only bits: brew shellenv (the official
Apple Silicon path setup) and an fnm default-node entry on $PATH so GUI
apps and IDEs find Node without an interactive shell.
π Git & SSH (.gitconfig, .ssh/config)
Commit signing and SSH auth go through the 1Password SSH agent β
no private SSH or signing keys live on disk. .gitconfig sets
gpg.format = ssh and points gpg.ssh.program at op-ssh-sign.
.ssh/config scopes IdentityAgent to Host github.com so okteto and other
SSH targets keep using their own keypairs. Local signature verification is
wired via .config/git/allowed_signers.
π€ Claude Code (.claude/)
My global Claude Code configuration β applies to every project that doesn't override it.
- CLAUDE.md β global rules: tool preferences, when to reach for which MCP, git/PR conventions, objectivity & disagreement protocol.
- mcp.json β global MCP servers (Sequential Thinking,
Git, Context7, Tavily, Exa) loaded via a
~/.claude/mcp.jsonflag in theclaudealias, so the dotfiles-tracked file is the source of truth and~/.claude.json'smcpServersstays empty/committable. - mcp-library.json β catalog of MCPs that are opt-in per repo (not loaded globally).
- settings.json β hooks, model choice, status line.
- scripts/tmux-rename.sh β rename the current tmux window when Claude Code starts in it.