Quickly bootstrap a new macOS device; installs Homebrew, git, Oh My Zsh, all symlinks, and runs brew bundle for the chosen environment (personal | work).
curl -fsSL https://raw.githubusercontent.com/arraywaves/.dotfiles/main/bootstrap.sh | bashThe script will prompt for:
SHELL_ENV:workorpersonal(default:personal)U_CTX: device identifier, e.g. your username (default: hostname)GIT_USER: git username (default: same asU_CTX)
After it completes, add any API keys to ~/.dotfiles/.env and open a new terminal.
Safe to re-run, all steps are idempotent.
Notes for individual packages.
Install:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Install packages:
brew bundle --file=path-to-brewfile
OR
export HOMEBREW_BUNDLE_FILE=path-to-brewfile
brew bundle
Add to .zshrc:
source ~/.dotfiles/shared/zsh/.ohmyzsh
Add custom plugins:
ln -s ~/.dotfiles/shared/zsh/plugins/pluginname ~/.oh-my-zsh/custom/plugins/pluginname
Nushell is the primary shell. Zsh (with ohmyzsh) remains fully configured as a fallback — run ^zsh from within nushell to drop into a full zsh session.
Symlink configs (macOS):
ln -s ~/.dotfiles/shared/nushell/config.nu ~/Library/Application\ Support/nushell/config.nu
ln -s ~/.dotfiles/shared/nushell/env.nu ~/Library/Application\ Support/nushell/env.nu
Set as default shell:
grep -qF "$(which nu)" /etc/shells || echo "$(which nu)" | sudo tee -a /etc/shells
chsh -s "$(which nu)"
Symlink scaffold wrapper:
ln -s ~/.dotfiles/shared/bin/scaffold ~/.local/bin/scaffold
chmod +x ~/.dotfiles/shared/bin/scaffold
Files:
shared/nushell/env.nu— PATH (Homebrew, pyenv) and.envloadingshared/nushell/config.nu— aliases, prompt, and nushell commands (tmux-dev,tmux-cli,hh,scaffold)
Symlink conf:
ln -s ~/.dotfiles/shared/tmux/.tmux.conf ~/.tmux.conf
Symlink tmux macro file:
ln -s ~/.dotfiles/shared/zsh/custom/tmux.zsh ~/.oh-my-zsh/custom/tmux.zsh
Create Symlink
ln -s ~/.dotfiles/shared/zed/settings.json ~/.config/zed/settings.json
Install:
brew install PeonPing/tap/peon-ping
peon-ping-setup --packs=cute-minimalAdd to end of default config:
config-file = /path/to/config
To launch nushell (rather than zsh) add to shared/ghostty/config:
command = /opt/homebrew/bin/nu
Run:
TERM=xterm-256color sudo nano /opt/homebrew/etc/dnsmasq.conf
Add:
address=/.localhost/127.0.0.1
Run:
sudo mkdir -p /etc/resolverecho "nameserver 127.0.0.1" | sudo tee /etc/resolver/localhostsudo brew services start dnsmasq
Caddyfile location: ~/.dotfiles/caddy/Caddyfile.<env> — symlinked by bootstrap to /opt/homebrew/etc/caddy/Caddyfile.
Setting up a project in Caddyfile:
projectname.localhost { reverse_proxy localhost:DEV_SERVER_PORT }
Run:
caddy start to start the service in the background.
caddy run to start the service in a terminal window.
Login
infisical login or infisical login -i for browser-less login
Setup
cd into project and run infisical init
Install pre-commit hook (per project):
infisical scan install --pre-commit-hook
Add to scripts:
infisical run --env=dev -- [rest of script]
Link dotfiles global CLAUDE.md instructions to claude-code:
ln -s ~/.dotfiles/shared/claude-code/CLAUDE.md ~/.claude/CLAUDE.md // instructs claude to read and write to AGENTS.md
Link dotfiles skills and agents to claude-code:
rm -rf ~/.claude/skills if dir already exists
ln -s ~/.dotfiles/shared/agents/skills ~/.claude/skills
ln -s ~/.dotfiles/shared/claude-code/agents ~/.claude/agents
Optional: enable agent teams (experimental)
export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1
Tavily MCP
in .claude/settings.json add:
"env": { "TAVILY_API_KEY": "tvly-YOUR_API_KEY" }
claude and run /plugin marketplace add tavily-ai/tavily-plugins and /plugin install tavily@tavily-plugins
Railway
railway login --browserless
Context7 MCP
claude mcp add --scope user context7 -- vpx -y @upstash/context7-mcp --api-key YOUR_API_KEY
export OPENCODE_CONFIG=path-to-opencode.json
Set PATH:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init - zsh)"' >> ~/.zshrc
source ~/.zshrc
Install Python (latest):
pyenv install 3.x picks latest stable minor release in python3 automatically
pyenv global 3.x.x sets system python version
Install (check homebrew if reading this):
curl -fsSL https://vite.plus | bash
Commands:
vp create Create a new project
vp env Manage Node.js versions
vp env doctor Verify your Node setup
vp env off Opt out of Node management
vp install Install dependencies
vp migrate Migrate to Vite+
vp help
Open: ~/.dotfiles/shared/blender/default.blend
File > Save Startup File > Confirm
"If you are using macOS, add your terminal app (Ghostty, iTerm2, Terminal, …) to the approved "Developer Tools" apps in the Privacy panel of System Settings and restart your terminal app. Your Rust builds will be about ~30% faster." Source: vite+ contributing