Setup and update the tech stack on a Mac with one command, based on your stack configuration:
- 🐚 Shell customizations (prompt, paths, functions, aliases, environment)
- 🐙 Global git configuration
- 📰 Fonts
- ⌨️ Command line tools (like
brew,git,pyenv,python,claude-code) - 🍏 Graphical apps (including Mac App Store apps)
- 🤖 Settings and permissions of AI agents (Gemini CLI, OpenCode, Cursor CLI)
- ⚙️ Settings and keybindings for Zed and most VS Code based IDEs
- 🧩 Extensions for VS Code based IDEs
- 📂 git repositories (clone, sync, list issues)
- Install and configure MacStack (also installs Homebrew if absent):
curl -fsSL https://macstack.dev/setup.sh | zsh - Configure your stack in your chosen stack folder. An example is the Nohype AI Stack
- If your stack includes Mac App Store apps, connect your iCloud account
- Apply your stack configuration by running
mack updateor simplyupdate
Note: Whether you want to set up a fresh Mac or want to repeatedly update your established Mac,
mack updateis idempotent and works for both cases. That means it's safe to use and only overwrites things you define in your stack. It preserves everything else – even individual pre-existing entries in dotfiles.
- 🐚 Ensure
~/.zshrcloads (sources) the MacStack shell customizations - 🍺 Update Homebrew itself
- 🍺 Update Homebrew packages that were already installed
- 🍺 Clean up Homebrew system: delete old package versions and cache
- 🐙 Ensure a
~/.gitignore_globalexists - 🐙 Set necessary global git settings plus some basic best-practice ones in
~/.gitconfig. - 🍏 Make
mackcommand available system-wide, offering several subcommands, including:mack update(or justupdate): trigger this whole update processmack help(or justmack): show all availablemackcommands
Here is what mack update does wherever it finds the respective inputs in your stack configuration folder.
All these configuration files and folders in your stack are optional. You can add what you want when you want it:
- ⚙️
macstack.json: Load the contained basic configuration options, based on this JSON schema - 🐚
bin/: Add it toPATHso you can place your custom commands there (scripts, binaries) - 🐚
zshrc.sh: Ensure it gets sourced from~/.zshrcto apply your shell customizations - 🍺
Brewfile: Ensure all declared Homebrew packages are installed- 📰 Fonts
- ⌨️ Command line tools
- 🍏 Mac App Store apps
- 🧩 VS Code extensions
- 🐙
macstack.json: Apply the contained personal global git settings to~/.gitconfig - 📜
update.sh: Run this custom update step - ⚙️
zed/*: Update configuration of Zedzed/settings.jsonzed/keymap.json
- ⚙️
vscode/*: Update configuration of VS Code, Cursor, Antigravity, Kiro, Windsurf, VSCodiumvscode/settings.jsonvscode/keybindings.json
- 🤖
ai/coding/*: Update AI coding agent configurations- Cursor CLI, Cursor IDE
ai/coding/cursor/cli-config_template.json⚠️ Don't simply copy your whole~/.cursor/cli-config.jsonhere since that contains semi-sensitive infos
ai/coding/cursor/rules/*
- Gemini CLI
ai/coding/gemini/settings.jsonai/coding/gemini/policies/*
- OpenCode, OpenCode Desktop
ai/coding/opencode/opencode.json
- Cursor CLI, Cursor IDE
- 📁
git/repos-folder-template: Clone/sync git repos based on this template, then report which repos need manual attention- Template defines content of this folder:
git.repos_folderdefined inmacstack.json - Each folder in the template may contain a
git-repos.txtlisting URLs of intended repos in that folder
- Template defines content of this folder: