+---------------------------------------------------------------------------------------+
| MY DOT-FILES |
+---------------------------------------------------------------------------------------+
| |
| .-=--. |
| .' .--. '. |
| : : .-.'. : _ _ |
| : : : .': : (o)o) |
| : '. '-' .' //// |
| _'.__'--=' '-.//' |
| .-' / |
| '---..____...---'' |
| |
+---------------------------------------------------------------------------------------+
My reproducible Apple Silicon macOS development environment: Ghostty, Zsh, Vim, tmux, Git, Homebrew dependencies, and an idempotent bootstrapper.
Website: dotfiles overview ·
Ghostty + rz quick start ·
zoxide directory jumping
The installer checks Apple Command Line Tools, installs Homebrew when needed,
installs the dependencies in Brewfile, mextdisplay, and Ghostty, sets up Oh My
Zsh and Vim submodules, and links the configs. It is safe to rerun: valid links
and installations are retained, while conflicts are moved to timestamped
.backup.<timestamp> paths.
On a new Mac, the first git command may prompt for Apple Command Line Tools.
Finish that installation, then rerun the command.
Clone the repository, install Babashka, and run the installer:
git clone https://github.com/marianposaceanu/dot-files.git ~/dot-files
cd ~/dot-files
brew install borkdude/brew/babashka
bb bootstrap/install_macos.cljThe installer presents a rounded bootstrap UI:
╭─ DOT-FILES :: MACOS SETUP
│ Idempotent setup powered by Babashka
╰─ Existing files are backed up before links are changed
╭─ [01/09] Apple Command Line Tools
╰─
✓ Apple Command Line Tools are available.
╭─ SETUP COMPLETE
│ Your macOS dot-files environment is ready.
╰─ Next: restart the terminal or run source ~/.zshrc
Use --timings to report stage durations. Use --skip-checks only when you
will run the checks manually afterward. Licensed fonts, RVM language runtimes,
credentials, keyboard preferences, and optional native builds remain manual.
- Vim configuration, local customizations, and pinned plugin submodules
- Zsh, Bash, tmux, Git, and global gitignore configuration
- Ghostty, bat, Amp, Codex, and Claude Code configuration
- Homebrew dependencies in
Brewfile - Bootstrap, linking, health-check, and benchmark tools
Brewfile is the source of truth. Install it directly or through the helper:
brew bundle --file Brewfile
bb bootstrap/setup/install_brew_deps.cljbrew tap marianposaceanu/tap
brew install rz
rz --save work
rz --list
rz --session work
rz --watch backup --every 15m
rz --clean 30drz saves and restores named Ghostty workspaces. See the
rz repository for behavior, options,
permissions, snapshot storage, and recovery details.
mextdisplay is installed
through the main Brewfile. The mext alias opens its interface:
mext
mext list
mext disable EV3285
mext enable EV3285- Zsh Autosuggestions offers history completions; press Right Arrow or
Endto accept one. catis aliased tobat; man pages and FZF previews also usebat.z <keywords>jumps with zoxide andzi <keywords>selects through FZF. See the zoxide tutorial.ackis aliased torgin interactive Zsh and Bash sessions.
The optional workflows rebuild the active Homebrew Vim, ripgrep, Universal Ctags, or Git for the local CPU. They validate and smoke-test candidates before replacement and pin the affected formula. Results are workload-dependent; see Native Apple Silicon builds for design, prerequisites, benchmarks, and caveats.
./bootstrap/native/compile_vim_native.sh
./bootstrap/native/compile_ripgrep_native.sh --pgo
./bootstrap/native/compile_ctags_native.sh --pgo
./bootstrap/native/compile_git_native.sh --pgoOmit --pgo for a native/LTO-only build. PGO adds an instrumented training pass
before the final optimized build, so it takes longer and favors the trained
workloads. Restore standard Homebrew bottles by unpinning and reinstalling:
brew unpin vim && brew reinstall vim
brew unpin ripgrep && brew reinstall ripgrep
brew unpin universal-ctags && brew reinstall universal-ctags
brew unpin git && brew reinstall gitChecks and profiles:
bb bootstrap/checks/check_configs.clj
bb bootstrap/checks/doctor.clj
./benchmarks/profile_vim_plugins.sh
./benchmarks/profile_vim_plugins_median.sh
./benchmarks/benchmark_ripgrep_native.sh "$(command -v rg)" native
./benchmarks/benchmark_ctags_native.sh
./benchmarks/benchmark_git_native.sh<leader>a(usually\a): run:Rgand enter a ripgrep query.<leader>A(usually\A): run:Rgfor the word under the cursor.<leader>gc: browse per-file commit history with a diff preview (:BCommits).<leader>gs: search Git history for the line or selection and print its URL.<leader>sw: sort words in a visual selection.<C-p>: open:Filesthroughfzf.vim.<C-n>: lazy-load and toggle NERDTree.<leader>gv: lazy-load and toggle GoldenView.:Tabularize /<pattern>: lazy-load Tabular and align by a pattern.:Blame: show blame information and the GitHub commit URL for the line.:GBrowse: open the current file, range, or commit on GitHub.[c/]c: jump to the previous or next Git hunk.<leader>hp/<leader>hs/<leader>hu: preview, stage, or undo a hunk.
Initialize or update pinned plugins:
bb bootstrap/submodules/update_submodules.cljIntentionally update plugin pointers to upstream revisions:
bb bootstrap/submodules/update_submodules.clj --remoteRemove a submodule through the repository helper:
bb bootstrap/submodules/remove_submodule.clj <submodule-path>Link all managed configuration with:
bb bootstrap/setup/link_configs.cljThis includes Ghostty and backs up conflicting files or directories with a
.backup.<timestamp> suffix. It links:
~/.vimrc~/.vim~/.gitconfig~/.gitignore_global~/.tmux.conf~/.zprofile~/.zshrc~/.zlogin~/.bashrc~/.codex/config.toml~/.claude/settings.json~/.claude/output-styles/amp.md~/.config/amp/settings.json~/.config/bat$HOME/Library/Application Support/com.mitchellh.ghostty/config
.zprofile initializes Homebrew in login shells. .zshrc configures the
interactive environment and loads RVM after its final PATH changes. .zlogin
provides guarded RVM initialization for non-interactive login shells.
Optionally make Zsh the default shell:
chsh -s "$(command -v zsh)"tmux is installed through Brewfile; start it with tmux.
Set fast keyboard repeat:
defaults write NSGlobalDomain KeyRepeat -int 1
defaults write NSGlobalDomain InitialKeyRepeat -int 12Restore the macOS defaults:
defaults delete NSGlobalDomain KeyRepeat
defaults delete NSGlobalDomain InitialKeyRepeat