Personal macOS/Linux dotfiles bootstrap for:
zshtmuxbtopneovimghosttyvscodeclaude/codex(shared global instructions)
- macOS or Linux
- Admin access (needed if package installation or
chshis required) - macOS only: Xcode command line tools/license accepted (
sudo xcodebuild -license) - Internet access for package installs and git clone steps
git clone <this-repo>
cd dotfiles
python3 install.pyOptional: set login shell during install.
APPLY_LOGIN_SHELL=1 python3 install.py- Installs missing packages via Homebrew (or Linux package manager fallback:
apt/dnf/pacman/zypper) forzsh,direnv,fzf,tmux,neovim,ripgrep,fd - Installs
btopvia Homebrew when available, or a verified upstream Linux binary on supported Linux architectures - Installs Homebrew-managed Neovim helper tools when Homebrew is available:
prettier,tree-sitter-cli,typescript-language-server,basedpyright,gh,chafa,viu,mercurial - Installs the ESLint language server from npm when
npmis available - Installs Oh My Zsh and shell plugins
- Symlinks configs from this repo into
$HOME - Applies Starship prompt config (
~/.config/starship.toml) - Applies tracked Claude global instructions (
~/.claude/CLAUDE.md) whenclaude/CLAUDE.mdis present - Applies tracked Codex global instructions (
~/.codex/AGENTS.md) whencodex/AGENTS.mdis present (in-repo symlink toclaude/CLAUDE.md, so both tools share one source of truth) - Applies repo-local Codex CLI config (
~/.codex/config.toml) whencodex/config.tomlis present - Bootstraps
lazy.nvimand runs plugin/tree-sitter sync
The script is designed to be rerunnable and backs up pre-existing target files before replacing them with symlinks.
Remove the symlinks this repo created, leaving everything else in place:
python3 install.py --cleanupPreview first without changing anything:
python3 install.py --cleanup --dry-runA target is removed only when it is a symlink that resolves back into this repo, so real files (and symlinks pointing elsewhere) are left untouched. Installed packages, cloned repos (oh-my-zsh), and *.bak.* backups are not removed. The link set is shared with the install flow (managed_links()), so cleanup never drifts from what setup created. Re-running install.py restores the links.
Enable the repo-managed hooks so pre-push runs an install idempotency check:
git config core.hooksPath .githooksThe pre-push hook runs:
python3 install.py --verify-idempotentThis uses a temporary HOME and skips package/network/bootstrap side effects while verifying the install flow is rerunnable.
To bypass temporarily:
SKIP_DOTFILES_PREPUSH=1 git pushzsh --versiontmux -Vnvim --versionnvim --headless "+checkhealth" +qapython3 install.py --verify-neovim-health- Confirm symlinks:
ls -l ~/.zshrcls -l ~/.config/starship.tomlls -l ~/.tmux.confls -l ~/.config/btop/btop.confls -l ~/.config/nvimls -l ~/.config/ghostty/configls -l ~/Library/Application\\ Support/Code/User/settings.jsonls -l ~/.claude/CLAUDE.mdls -l ~/.codex/AGENTS.mdls -l ~/.codex/config.toml(if using a repo-local Codex config)
Press Ctrl+Space then t to set up agents, vim, and git windows in the current session, rooted at the current pane's directory. It stays put — no new session, no client switch. The window you're in is claimed as the first (agents), so a fresh one-window session becomes exactly those three. Only missing windows are added, so it's safe to press repeatedly. (This overrides tmux's default prefix t clock view.)
The binding calls ~/.tmux-setup-sessions.sh (see tmux/.tmux-setup-sessions.sh) in its in-place mode. You can also run the script directly:
# In-place: add the windows to an existing session (what the binding uses)
~/.tmux-setup-sessions.sh --session mywork ~/applied3
# Standalone: create (or re-use) a session named after the directory and attach
~/.tmux-setup-sessions.sh ~/applied3
~/.tmux-setup-sessions.sh --name review ~/applied3 # override the session name
~/.tmux-setup-sessions.sh --windows "agents vim git logs"Commit message guidance for Codex lives in codex/COMMIT_RULES.md.
These are style rules only (no Git hook/template enforcement).