Jace Babin's dotfiles, managed with Dotbot via
uv, and migrating to
chezmoi, which already owns the zsh and starship
configs under home/. ./install runs both.
- Zsh with Antidote plugin manager
- Starship prompt
- Ghostty terminal (with Kitty as an alternative)
- mise for tool version management (Node, Rust, .NET)
- Karabiner-Elements keyboard customization
- Homebrew package management via Brewfile
- Lefthook git hooks with Prettier, Shellcheck, and markdownlint
- fastfetch system information
- Neovim with LazyVim
- bat syntax-highlighted file viewer
- btop system monitor
- Clone this repository:
git clone https://github.com/jbabin91/dotfiles.git ~/.dotfiles
cd ~/.dotfiles- Run the install script to symlink configuration files:
./install- Install Homebrew packages:
brew bundle --global- Install development dependencies:
pnpm install- Restart your shell:
exec zsh~/.dotfiles/
├── config/
│ ├── bat/ # bat syntax highlighter
│ ├── fastfetch/ # System information display
│ ├── ghostty/ # Ghostty terminal
│ ├── btop/ # btop system monitor
│ ├── karabiner/ # Keyboard customization (copy-synced)
│ ├── kitty/ # Kitty terminal
│ ├── mise/ # Tool version manager (node, rust, dotnet)
│ └── nvim/ # Neovim config (LazyVim)
├── general/
│ ├── git/ # Git config, attributes, ignore
│ ├── .cspell/ # Spell checking dictionaries
│ └── Brewfile # Homebrew packages, casks, VS Code extensions
├── home/ # chezmoi source; mirrors ~/ (dot_zshrc -> ~/.zshrc)
├── .chezmoiroot # Points chezmoi's source at home/
├── install.conf.yaml # Dotbot symlink configuration
├── lefthook.yml # Git hooks
├── prettier.config.js # Code formatting
└── .markdownlint-cli2.mjs # Markdown lintingKarabiner-Elements replaces symlinks when it writes config, so it uses a
bidirectional copy sync instead of a symlink. Running ./install will sync
the latest version in either direction.
Tools are installed by Homebrew where possible; mise covers the rest, in the
order brew > mise > pnpm | cargo | uv. That order picks the installer, not the
winner on PATH: eight names exist in both /opt/homebrew/bin and mise's shims —
node, npm and npx among them — and .zshenv puts the shims first, so the
mise-pinned version is the one that runs.
mise itself is the exception: it installs from https://mise.run into
~/.local/bin, not from the Brewfile, so it updates itself (auto_update in
config/mise/config.toml) instead of waiting on brew upgrade. ./install
bootstraps it, so it needs no manual install — but a machine that carries a
Homebrew mise from before this change wants brew uninstall mise, since
brew bundle leaves an already-installed formula in place.
chezmoi is nearly the same: ./install uses a working chezmoi already on PATH,
and otherwise bootstraps one from https://get.chezmoi.io into ~/.local/bin. A
machine carrying a Homebrew chezmoi from before this change therefore keeps using
it, so brew uninstall chezmoi to switch to that copy, which chezmoi upgrade
updates in place.
- Python — uv, installed via Homebrew, with automatic version switching
- Node.js — managed via mise;
.nvmrc/.node-versionauto-switching enabled viaidiomatic_version_file_enable_tools - .NET — SDK managed via mise
- Rust — toolchain via mise, along with any crate that has no Homebrew formula (
cargo:backend)
pnpm run format # Format JSON/YAML/MD files
pnpm run format:check # Check formatting
pnpm run lint # Run all linting
pnpm run lint:shell # Lint shell scripts
pnpm run lint:md # Lint markdown filesPre-commit hooks automatically:
- Format files with Prettier
- Lint shell scripts with Shellcheck
- Lint markdown with markdownlint
- Validate commit messages with commitlint (conventional commits)
MIT