Skip to content

Repository files navigation

dotfiles

macOS 26 / Apple Silicon. Successor to j1z0/dotfiles, whose last commit was October 2015.

git clone <this repo> ~/.dotfiles && ~/.dotfiles/install.sh

install.sh is idempotent — run it again any time. It backs up anything real it would overwrite into ~/.dotfiles-backup/<timestamp>/.

What carried over from 2015, and what didn't

Kept Because
bindkey -v vi mode, with a prompt indicator it never had
setopt AUTO_CD code instead of cd code
tmux C-a prefix, vi pane keys muscle memory (and the old config bound k twice, so "pane right" never worked — fixed)
solarized + a light/dark toggle was togglebg on F5 in vim; now flips the whole machine
<leader> = space, za folding, no swapfiles, PEP8 indents still right
<leader>g → go to definition was YouCompleteMe, now the built-in LSP client
Dropped Replaced by
Prezto oh-my-zsh + zsh-autosuggestions, fast-syntax-highlighting, fzf-tab
Vundle, YouCompleteMe, syntastic, flake8, Pydiction lazy.nvim, treesitter, built-in LSP (pyright + ruff)
NERDTree, ctrlp oil.nvim, telescope
virtualenvwrapper, rbenv mise + uv
alias git=/usr/local/bin/hub gh
/usr/local, /usr/X11, mongodb-2.0.6 in $PATH Intel-era paths; this is an arm64 mac
todo.txt + mit/birdseye/nav actions not ported — say the word and they come back

Theming: one palette, every tool

macOS appearance is the single source of truth, the way Omarchy uses one theme directory. theme toggle flips the system, and everything follows:

theme            # what mode am I in
theme dark
theme light
theme toggle     # also bound to ⌥t
theme apply      # re-fan the current mode (idempotent)
Tool How it follows
iTerm2 native — two colour sets per profile, "Use Separate Colors for Light and Dark Mode"
bat native — --theme=auto reads the terminal background
starship, fzf, tmux, eza configured in ANSI slots, never hex, so the terminal palette carries them for free
neovim auto-dark-mode.nvim, plus a nudge to already-open instances
git / delta theme sets delta.features to solarized-dark or solarized-light
Claude Code ~/.claude/themes/solarized-{dark,light}.json + "theme": "custom:…", which Claude Code hot-reloads — a running session retints without restarting

One solarized quirk drove several choices: ANSI slot 8 is base03/base3, which is the background in each mode. Anything dim must use slot 10 (base01/base1) or it renders invisible. That's why ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=10".

appearance-watch (30 lines of Swift, compiled by install.sh) is what makes flipping appearance in System Settings — or macOS's own sunset schedule — fan out too. It observes AppleInterfaceThemeChangedNotification instead of polling. It runs as a LaunchAgent, which EDR software may flag as a persistence event; that's expected. Everything works without it except the automatic trigger.

Keyboard: AeroSpace, modifier is ⌥

Run keys for the full cheatsheet, keys <word> to grep it.

The modifier is plain Option, deliberately: Karabiner would give you Caps Lock as the modifier but wants Input Monitoring (keystroke access) and a DriverKit extension, which is a lot of privilege on an MDM-managed work machine to move one key. AeroSpace needs only Accessibility.

Caps Lock → Escape is set natively instead: System Settings → Keyboard → Keyboard Shortcuts → Modifier Keys. No script, no permission.

⌥ h j k l          focus window        ⌥ 1..9       workspace
⌥⇧ h j k l         move window         ⌥ b s m p a  browser/slack/mail/pycharm/agents
⌥ ⏎                new terminal        ⌥⇧ 1..5      send window to workspace
⌥ f                fullscreen          ⌥ tab        last workspace
⌥ /  ⌥ ,           split dir / accordion            ⌥ t   toggle light/dark
⌥⇧ f               float this window — drag-resize works again
⌥⇧ e               tiling off/on — the panic button
⌥⇧ ;               service mode (esc reloads config)

The tradeoff of an Option modifier: AeroSpace grabs those chords globally, so the Option-glyphs on the bound letters stop being typeable and ⌥+hjkl / ⌥+digits no longer reach the terminal. Only the bound letters are affected.

Slack, Chrome, PyCharm and Claude land on their own workspaces automatically; System Settings and 1Password float.

Agentic workflow

The unit of work is one git worktree per task, so several Claude Code sessions edit separate trees of the same repo without fighting over the index.

wt my-feature          # worktree at ../repo.my-feature, copies .env/.envrc across, cd's in
agent my-feature       # the above + names the tmux window + launches claude
wtrm                   # remove the worktree you're in, and its branch
prj                    # fuzzy-pick a repo under ~/code, attach its tmux session
git recent             # every branch, most recently touched first

Claude Code itself gets:

  • a statusline (claude/statusline.sh) — model · dir · branch(dirty) · ⑃ worktree · session cost. The worktree marker matters: it tells you this session is isolated before you run something destructive.
  • macOS notifications (claude/notify.sh) on Stop and Notification, named by dir@branch — with several agents parked on different workspaces, this is how you learn which one is blocked on you. Clicking one takes you to that exact terminal: window, tab, split, and the right tmux pane, switching AeroSpace workspace on the way.
  • rerere and rebase.updateRefs in git, which pay off when agents rebase stacks.

install.sh merges into ~/.claude/settings.json rather than overwriting, so pre-existing hooks (iTerm2's cc-status, for one) survive.

This machine

zsh/zshrc pins SDKROOT to MacOSX26.5.sdk. The installed Command Line Tools (26.6) ship MacOSX27.0.sdk, which their own clang cannot link against — a bare cc hello.c fails inside libSystem.tbd. That breaks every native build (treesitter parsers, node-gyp, python C extensions), not just this repo. Remove the pin once CLT ships a compiler matching its default SDK.

Layout

Brewfile                 44 formulae + casks
install.sh               symlinks, plugins, launch agent, claude settings
bin/theme                the light/dark fan-out
bin/appearance-watch     compiled from src/appearance-watch.swift
zsh/{zshrc,aliases,functions}
nvim/                    init.lua + lua/plugins/{theme,editor,lsp}.lua
themes/                  canonical solarized, both modes (one source of truth)
iterm2/                  profile generator + generated dynamic profile
tmux/tmux.conf           C-a, vi keys, resurrect/continuum
aerospace/aerospace.toml
CHEATSHEET.md            what `keys` prints
starship/starship.toml   ANSI colors only
claude/                  themes + statusline + notify hook
git/gitconfig            delta, solarized both modes

Not done yet

open -a AeroSpace     # then Privacy & Security > Accessibility > AeroSpace.
                      # The only permission this setup asks for.
atuin register        # optional, for synced history

About

my dotfiles

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages