My personal macOS dotfiles crafted with love - version-controlled, Everforest-themed, XDG-compliant where possible.
dotfiles/
├── packages/
│ └── <pkg>/
│ ├── link/ # files to symlink (mirrored structure, optional)
│ ├── source/ # <pkg>.zsh sourced from ~/.config/zsh/source/ (optional)
│ ├── copy/ # files to copy (optional)
│ ├── hooks/ # pre-setup.zsh / post-setup.zsh run by sync.zsh (optional)
│ └── setup.toml # install conditions and copy/link target (optional)
└── setup/
├── _lib.zsh # shared utilities (colors, logging)
├── Brewfile # Homebrew formulae, casks, mas apps and vscode extensions
├── bootstrap.zsh # full machine setup
├── sync.zsh # symlinks package files and copies assets
├── prune-symlinks.zsh # removes orphaned symlinks left by renamed/removed package files
└── macos.zsh # sensible macOS defaults
Warning
Works on my machine! Review the installation scripts and package files before adopting.
- Clone the repo:
git clone https://github.com/vasylromanets/dotfiles.git ~/.dotfiles- Run the bootstrap script:
~/.dotfiles/setup/bootstrap.zsh
# or: cd ~/.dotfiles && make bootstrapThis will:
- Install Xcode Command Line Tools
- Install Homebrew
- Install formulae, casks, App Store apps and VS Code extensions from Brewfile
- Symlink package files and copy assets
- Configure Git and SSH
- Apply macOS defaults
You'll be prompted before each step.
After adding or modifying package files, re-run sync.zsh to apply them:
~/.dotfiles/setup/sync.zsh
# or: cd ~/.dotfiles && make syncRenaming or removing a package file can leave a stale symlink behind. Run prune-symlinks.zsh occasionally to clean those up:
~/.dotfiles/setup/prune-symlinks.zsh
# or: cd ~/.dotfiles && make prune-symlinksEach package may optionally include a setup.toml. Packages without one are always processed, symlinking link/ to ~ by default.
# Skip this package if the CLI tool/GUI app is not installed
[requires]
command = "bat" # checked via command -v
app = "Ghostty" # checked via /Applications/Ghostty.app
# Override symlink destination (defaults to ~)
[link]
target = "~"
# Copy files from copy/ to this directory
[copy]
target = "~/Library/..."[requires] accepts command, app, or both. [link] is rarely needed since ~ is the default. [copy] is only used by packages that can't be symlinked because of macOS sandboxing (e.g. any app installed from the Mac App Store).
A package can also define hooks/pre-setup.zsh and/or hooks/post-setup.zsh for setup steps beyond symlinking/copying (e.g. resolving plugin dependencies). Both are optional and run only for packages that pass [requires].
- Theme: Most tools are themed with Everforest Dark Hard for a warm, low-fatigue aesthetic.
- Font: The terminal and editors use Meslo LG Nerd Font Mono.
Many thanks to the dotfiles community for sharing their insights and configurations over the years.
setup/bootstrap.zsh is based on Denys Dovhan's bootstrap.sh.
setup/macos.zsh is inspired by Mathias Bynens' .macos.

