- Purpose: Personal development environment configuration (macOS, WSL)
- Bootstrap:
source bootstrap.shfrom a fresh machine sets up everything - Convention: XDG Base Directory Specification throughout
- Platforms: macOS (primary), WSL (secondary)
This is a dotfiles repository rooted at $XDG_CONFIG_HOME (~/.config). It bootstraps and configures a complete development environment: shell (zsh), editor (neovim), terminal emulators (Ghostty, Terminal.app), git, language runtimes (Node, Ruby, Go, Java), and CLI tools.
The bootstrap system is self-contained: clone the repo to ~/.config, run bootstrap.sh, and a new machine is fully configured.
| Directory | Purpose |
|---|---|
zsh/ |
Shell config: .zshrc, env vars, aliases, keybindings, vi mode, plugins (antidote) |
nvim/ |
Neovim: init.vim, custom colorscheme (terminal.vim), statusline, tabline |
ghostty/ |
Ghostty terminal: base24-twilight theme, font/keybind config |
terminal/ |
macOS Terminal.app: base24-twilight theme, bootstrap plist setup |
git/ |
Git config: aliases, delta pager, Kaleidoscope difftool, global ignore |
ruby/ |
Ruby: gem config, gem bootstrap |
node/ |
Node: npm aliases |
fonts/ |
Font files: Consolas NF, Fira Code, Cascadia PL |
bat/ |
bat config (base16 theme) |
sqlite/ |
SQLite config (.sqliterc) |
npm/ |
npm aliases |
claude/ |
Claude Code env config |
jbx/ |
jbx defaults |
bootstrap.shdetects OS (macOS, WSL, Linux)- Sets
XDG_CONFIG_HOMEandXDG_CACHE_HOMEif unset - Clones/updates the dotfiles repo to
$XDG_CONFIG_HOME - Symlinks all
*.symlinkfiles to$HOME/.filename - Runs platform-specific bootstrap (
bootstrap.mac.shorbootstrap.wsl.sh) - Auto-discovers and runs every
*/bootstrap.shin the config tree
Files named *.symlink are symlinked to $HOME/.basename (without the .symlink suffix). Example: zsh/zshenv.symlink becomes ~/.zshenv. The bootstrap handles re-runs: it fixes stale symlinks and warns on conflicts.
bootstrap.mac.sh— Installs Homebrew, cask apps (Ghostty, Firefox, VS Code, etc.), and brew formulas (neovim, node, ruby, bat, fd, fzf, ripgrep, etc.)bootstrap.wsl.sh— apt-get update, Homebrew for Linux, similar formulas without macOS-specific tools
Each directory can have a bootstrap.sh that runs automatically:
nvim/bootstrap.sh— runsnvim +qallto trigger vim.pack plugin installationnode/bootstrap.sh— npm global update, installs chnode (guards against missing npm)ruby/bootstrap.sh— installs gems (cocoapods, fastlane, houston)zsh/bootstrap.sh— sets zsh as default shellfonts/bootstrap.sh— copies fonts to system font directoryterminal/bootstrap.sh— runs platform-specific Terminal.app setup
All paths follow XDG Base Directory:
- Config:
$XDG_CONFIG_HOME(~/.config) — this repo - Cache:
$XDG_CACHE_HOME(~/.cache) — swap, undo, plugin caches - Data:
$XDG_DATA_HOME(~/.local/share) — neovim plugin installs (via vim.pack)
The base24-twilight theme is used consistently across:
- Ghostty (
ghostty/themes/base24-twilight) — 24 palette colors (0-23) - Terminal.app (
terminal/Base24 Twilight.terminal) — matching ANSI colors - Neovim (
nvim/colors/terminal.vim) — uses terminal palette indices, not hex - bat (
bat/config) — base16 syntax theme - git-delta (
git/config[delta] section) — custom background tints
The colorscheme is intentionally terminal-palette-driven: change the terminal theme and neovim updates automatically.
Shell initialization follows this sequence:
~/.zshenv(symlinked fromzsh/zshenv.symlink) — sets XDG paths, ZDOTDIR, ZCACHEDIR$ZDOTDIR/.zshrc(zsh/.zshrc) — the main shell config, which runs steps 3-6 in order~/.zshrc(local, created by homebrew bootstrap) —eval "$(brew shellenv)"which setsHOMEBREW_PREFIX,HOMEBREW_CELLAR, and adds brew to PATH- Starship prompt init, antidote plugins, mise activation
for file in $XDG_CONFIG_HOME/**/*.zshsources all config files- History, completion, and keybinding setup
The **/*.zsh glob auto-discovers config across all directories. Order is filesystem-dependent but safe because all dependencies (homebrew, mise, starship) are initialized before the glob runs in step 5.
Mise (https://mise.jdx.dev/) manages language runtimes. Global versions are defined in mise/config.toml. Mise is activated in zsh/.zshrc via eval "$(mise activate zsh)" — this runs after homebrew is on PATH but before the **/*.zsh glob, so mise-managed tools are available when env.zsh and other config files load.
| File | What it does |
|---|---|
bootstrap.sh |
Main entry point — OS detection, symlinks, sub-bootstraps |
bootstrap.mac.sh |
Homebrew + cask + formula installation |
zsh/zshenv.symlink |
First file loaded — XDG paths, ZDOTDIR, ZCACHEDIR |
zsh/.zshrc |
Shell init — p10k, antidote, sources all *.zsh files |
mise/config.toml |
Global tool versions (node, ruby) for mise |
zsh/env.zsh |
EDITOR, PATH additions, GEMRC |
zsh/aliases.zsh |
Shell aliases (bat, eza, rg, nvim) |
nvim/init.vim |
Neovim config — plugins, settings, mappings |
nvim/colors/terminal.vim |
Colorscheme using base24 terminal palette |
nvim/plugin/statusline.vim |
Custom statusline with powerline separators |
nvim/plugin/tabline.vim |
Custom tabline (buffer list) |
ghostty/config |
Ghostty terminal settings |
ghostty/themes/base24-twilight |
24-color palette definition |
git/config |
Git config — aliases, delta, Kaleidoscope |
- Vimscript, not Lua — neovim config uses vimscript intentionally. The only Lua is the
vim.pack.addblock and treesitter autocmd in init.vim. - Terminal palette colors only —
nvim/colors/terminal.vimusesctermfg/ctermbgindices (0-23), never hex values. This keeps the colorscheme terminal-theme-agnostic. - Bootstrap must be idempotent — running
bootstrap.shtwice should produce the same result. Don't overwrite existing files without checking. - Don't add features to the colorscheme that require
termguicolors— the entire theme system depends onnotermguicolors.