Ever spent hours setting up a new Mac for development? Installing Homebrew packages, configuring dotfiles, tweaking system settings, arranging your Dock... it's tedious and error-prone. What if you could automate everything with a simple Ruby DSL that reads like plain English?
Meet Hola – a blazing-fast development environment manager that combines the best of Homebrew, mise, and dotfiles management into one cohesive tool.
The Problem with Existing Solutions
I've been a long-time Chef user because typing endless brew install or apt install commands drives me crazy. Chef's Ruby DSL is perfect – it's readable and expressive. But Chef comes with heavy dependencies, especially on macOS where it installs unnecessary components and even creates system users.
Other configuration management tools? Ansible and Salt force you to write complex YAML files when you'd rather just type commands directly. Popular dotfiles managers have steep learning curves for what should be a simple task: symlinking files to the right places.
Enter Hola: Convention Over Configuration
Inspired by modern tools like Ghostty and Bun, I built Hola in Zig for its speed, cross-compilation capabilities, and seamless C integration. The result? A tool that sets up your entire development environment in minutes, not hours.
What Makes Hola Different?
1. Convention Over Configuration – Use tools you already know:
Brewfile (Homebrew's native format):
brew "git"
brew "neovim"
cask "ghostty"
cask "visual-studio-code"
mise.toml (mise's native format):
[tools]
node = "24"
python = "3.14"
rust = "stable"
2. Optional Ruby DSL – For advanced provisioning (90% of users won't need this):
# ~/.config/hola/provision.rb
package ["git", "tmux", "neovim"]
execute "install-oh-my-zsh" do
command 'sh -c "$(curl -fsSL https://ohmyz.sh/install.sh)"'
not_if { Dir.exist?(File.expand_path("~/.oh-my-zsh")) }
end
3. Intelligent Dotfiles Management – No complex configs needed:
# Bootstrap from a GitHub repo (clones + installs packages + links dotfiles)
hola apply --github username/dotfiles
# Or just link dotfiles from local directory
hola link --dotfiles ~/.dotfiles
4. macOS Desktop Configuration – The killer feature that even Chef doesn't offer:
# ~/.config/hola/provision.rb
macos_dock do
apps [
'/Applications/Ghostty.app/',
'/Applications/Visual Studio Code.app/',
'/Applications/Safari.app/',
]
orientation "bottom"
autohide true
magnification true
tilesize 50
largesize 40
end
macos_defaults "show hidden files" do
domain "com.apple.finder"
key "AppleShowAllFiles"
value true
end
macos_defaults "keyboard repeat rate" do
global true
key "KeyRepeat"
value 1
end
Getting Started in 3 Minutes
1. Install Hola
# Quick install (recommended)
curl -fsSL https://hola.ac/install | bash
# Or using Homebrew
brew tap ratazzi/hola
brew install hola
# Or download manually
curl -fsSL https://github.com/ratazzi/hola/releases/latest/download/hola-macos-aarch64 -o hola
chmod +x hola
xattr -d com.apple.quarantine hola
sudo mv hola /usr/local/bin/
2. Create Your Dotfiles Repo
Create a GitHub repo with these files:
Brewfile (in repo root):
brew "git"
brew "gh"
brew "ripgrep"
brew "fzf"
cask "ghostty"
cask "zed"
cask "raycast"
mise.toml (in repo root):
[tools]
node = "20"
python = "3.12"
go = "latest"
~/.config/hola/provision.rb (optional, see "macOS Desktop Configuration" section above for examples)
3. Run It
# One command to set up everything!
hola apply --github username/dotfiles
That's it! Hola will:
- ✅ Clone your dotfiles repo to
~/.dotfiles - ✅ Install all Homebrew packages from Brewfile
- ✅ Install and pin tool versions from mise.toml
- ✅ Symlink dotfiles to your home directory
- ✅ Run provision.rb (if exists) for Dock/system settings
Real-World Use Cases
Migrate Your Current Setup
Export your existing configuration:
# Export current Dock configuration
hola dock
# Export Homebrew packages to Brewfile
brew bundle dump
Team Onboarding
Create a company dotfiles repo with Brewfile:
# Core tools every developer needs
brew "git"
brew "docker"
brew "kubectl"
# Company-specific tools
cask "slack"
cask "zoom"
cask "visual-studio-code"
And ~/.config/hola/provision.rb for advanced setup:
# Install VS Code extensions
execute "install vscode extensions" do
command "code --install-extension ms-python.python"
command "code --install-extension dbaeumer.vscode-eslint"
not_if "code --list-extensions | grep -q ms-python.python"
end
# Clone team repositories
directory "/Users/#{ENV['USER']}/work" do
recursive true
end
git "/Users/#{ENV['USER']}/work/backend" do
repository "git@github.com:company/backend.git"
end
Then new hires just run:
hola apply --github company/dotfiles
Personal Dotfiles Management
Bootstrap your entire environment with one command:
# Clone repo, install packages, link dotfiles - all in one
hola apply --github username/dotfiles
# Hola automatically:
# 1. Clones https://github.com/username/dotfiles to ~/.dotfiles
# 2. Installs packages from Brewfile
# 3. Installs tools from mise.toml
# 4. Symlinks dotfiles/ directory to ~/
# ~/.dotfiles/dotfiles/.zshrc → ~/.zshrc
# ~/.dotfiles/dotfiles/.gitconfig → ~/.gitconfig
# ~/.dotfiles/dotfiles/.config/ghostty → ~/.config/ghostty
Performance That Matters
Built in Zig, Hola is incredibly fast:
- Dock configuration: ~50ms (vs seconds with AppleScript)
- Dotfiles linking: <100ms for hundreds of files
- Package installation: Limited only by Homebrew/mise speed
- Memory usage: <10MB resident
Why Developers Love It
"It's like Chef, but without the baggage" – Hola gives you Chef's beautiful Ruby DSL without the heavyweight dependencies.
"Finally, Dock management that works" – No more manual dragging or complex AppleScript. Define your Dock layout in code.
"Convention over configuration done right" – Smart defaults mean less typing. Hola knows where dotfiles should go.
Advanced Features
Conditional Logic
Use Ruby's full power in provision.rb:
# In ~/.config/hola/provision.rb
if ENV['USER'] == 'john'
package "discord"
end
case node['platform']
when 'darwin'
package "mas" # Mac App Store CLI
when 'ubuntu'
apt_repository "ppa:graphics-drivers/ppa"
end
File Templates
template "/Users/#{ENV['USER']}/.gitconfig" do
content <<~GITCONFIG
[user]
name = #{ENV['GIT_NAME'] || 'Your Name'}
email = #{ENV['GIT_EMAIL'] || 'you@example.com'}
[core]
editor = nvim
GITCONFIG
end
Resource Notifications
Chain resources together:
file "/etc/app/config.yml" do
content "production: true"
notify :execute, "restart-app", :immediately
end
execute "restart-app" do
command "systemctl restart app"
action :nothing # Only runs when notified
end
Try It Today
Stop wasting time on manual setup. Whether you're setting up a new Mac, onboarding team members, or just want reproducible configurations, Hola makes it simple.
# Install
curl -fsSL https://hola.ac/install | bash
# Bootstrap from your dotfiles repo
./hola apply --github username/dotfiles
Or start simple with just a Brewfile:
# Create a Brewfile
echo 'brew "git"' > Brewfile
echo 'cask "ghostty"' >> Brewfile
# Run apply in current directory
hola apply
GitHub: https://github.com/ratazzi/hola
Installation: https://github.com/ratazzi/hola#installation
Built with ❤️ in Zig by developers who value their time.
What's your Mac setup routine? Have you tried Hola? Share your thoughts in the comments!
Top comments (0)