writing-skills
writing-skills
Use when creating new skills, editing existing skills, or verifying skills work before deployment
new-mac-setupFully automated new Mac setup for fullstack web developers and AI engineers. Generates and executes idempotent shell scripts to install dev tools, CLI utilities, GUI apps, AI/ML tooling, shell config, and macOS preferences — all via Homebrew, fnm, uv, and defaults commands. Use this skill whenever someone says "set up my Mac", "new Mac setup", "configure my…
Independent GitHub snapshot · Automated classification · Original documentation governs
This skill generates and runs a complete, idempotent Mac setup for fullstack web development and AI engineering. It produces 8 shell scripts that can be run individually or via a master runner, plus dotfiles and macOS preference automation.
The scripts are designed to be re-runnable — they check whether each tool is already installed before attempting installation, so you can safely run them again if something fails partway through.
The setup is opinionated. The core opinions:
agy via the antigravity Homebrew cask), Railway CLI, Ollama for local modelsHF_TOKEN is configured. Diarization should default to GPU/cloud paths; do not burn local CPU on long diarization unless explicitly requested.Before generating scripts, ask the user a few questions to customize the setup. Key things to learn:
git configFor RAM-based Ollama model recommendations:
Generate 8 scripts into the user's chosen directory. Each script is standalone and idempotent. Use the templates in scripts/ as the base, customizing per the user's answers.
The scripts should run in this order:
01-xcode-and-homebrew.sh # Xcode CLI tools + Homebrew (15-25 min)
02-shell-setup.sh # Oh-My-ZSH + plugins + fonts
03-brew-packages.sh # All brew formulae + cask apps
04-dev-environment.sh # Node (fnm), Python (uv), Git, Docker
05-ai-tools.sh # Claude Code, Codex CLI, Antigravity CLI, Ollama models, llama.cpp
06-dotfiles.sh # .zshrc + Ghostty config
07-macos-settings.sh # System preferences via defaults commands
00-run-all.sh # Master runner (runs 01-07 in order)
If possible, execute the scripts directly. If running in a VM/sandbox that can't reach the user's Mac, write the scripts to the workspace folder and put a one-liner in the clipboard:
cd /path/to/scripts && chmod +x ./*.sh && bash ./00-run-all.sh
These are real issues encountered during testing. The scripts in scripts/ already incorporate these fixes, but if you're generating fresh scripts, keep these in mind:
fnm needs sourcing before npm works. After installing Node via fnm, the current shell doesn't have npm in PATH until you run eval "$(fnm env --use-on-cd)". Every script that uses npm/node must source fnm first.
Don't use set -e in the master runner. If one script fails (e.g., a brew cask 404s), set -e kills the entire pipeline. Individual scripts can use set -e if they handle errors gracefully, but the master runner should not.
Source brew and fnm in the master runner. Add these lines near the top of 00-run-all.sh so all child scripts inherit them:
eval "$(/opt/homebrew/bin/brew shellenv)" 2>/dev/null || true
eval "$(fnm env --use-on-cd)" 2>/dev/null || true
Smart quotes break shell commands. If writing commands to the clipboard, avoid curly/smart quotes. Use simple ASCII quotes only, or avoid quotes entirely where possible. The safest clipboard commands are single simple statements like bash ./07-macos-settings.sh.
Zoom and some casks require sudo. The Zoom installer triggers a Password: prompt. The user needs to be warned that some cask installs will pause for their password.
brew install yarn --ignore-dependencies is needed if Node is managed by fnm (not brew). Otherwise brew tries to install its own Node as a yarn dependency.
Ghostty config location: ~/.config/ghostty/config. cmux reads this same file.
# Core dev tools
gh, git, fnm, pnpm, bun, z, diff-so-fancy
# Languages & runtimes
elixir, erlang, python@3.13
# Docker (no Docker Desktop)
colima, docker, docker-completion
# Media & processing
ffmpeg, yt-dlp, tesseract, libsndfile
# Build dependencies
openssl@3, readline, sqlite, xz, zstd
# Databases
postgresql@14, rabbitmq
# Misc CLI
honcho, pipx, flyctl, entr, tig, mas, terminal-notifier, googleworkspace-cli
# Google Workspace
googleworkspace-cli installs the `gws` binary; auth still requires `gws auth setup` and `gws auth login`.
# Libraries
cairo, glib, harfbuzz, libvmaf, webp
# Terminal
ghostty
# Editors
cursor, visual-studio-code
# Browser
thebrowsercompany-dia
# Communication
slack, discord, zoom
# Productivity
raycast, rectangle, obsidian, notion, notion-calendar
# AI & ML
ollama, antigravity
# Media
vlc, audacity, tella, descript
# Utilities
shottr, notunes, caffeine, stretchly, quickshade, pure-paste, 1password
# Dev tools
beeper, superhuman, gcloud-cli
Plus cmux via: brew tap manaflow-ai/cmux && brew install --cask cmux
gcloud-cli installs Google Cloud CLI (gcloud). Keep /opt/homebrew/share/google-cloud-sdk/bin on PATH so additional SDK components are available after install.
These tools were suggested by Claude during the initial setup session and accepted by the user. They are now part of the default install in 03-brew-packages.sh:
brew install fzfrg) — Blazingly fast grep replacement. Respects .gitignore, searches recursively by default. Essential for any developer. brew install ripgrepcat with syntax highlighting, line numbers, and git integration. Makes reading code files in terminal beautiful. brew install batz replacement with a smarter frecency algorithm and fuzzy matching. Same muscle memory, better results. brew install zoxidebrew install --cask orbstackundollar, npm-check-updates, trash-cli,
@anthropic-ai/claude-code, @openai/codex, @railway/cli
Install Google Antigravity through Homebrew:
brew install --cask antigravity
The cask installs the desktop app and exposes agy as the Antigravity CLI. Prefer this over Gemini CLI for new setups: Google announced on May 19, 2026 that consumer Gemini CLI access for free, Google AI Pro, and Ultra users stops serving requests on June 18, 2026. Enterprise and paid API-key Gemini CLI access can remain available, but this new-Mac path should default to Antigravity CLI.
Install the local transcription stack on new AI/dev Macs because it is useful for meetings, podcasts, YouTube/video workflows, and searchable archives.
Add this to 03-brew-packages.sh / 04-dev-environment.sh generation:
brew install ffmpeg yt-dlp libsndfile
uv tool install mlx-whisper || true
mkdir -p "$HOME/.local/share/transcribe-anything"
uv venv --python 3.11 "$HOME/.local/share/transcribe-anything/.venv-pyannote"
uv pip install --python "$HOME/.local/share/transcribe-anything/.venv-pyannote/bin/python" \
"pyannote.audio" soundfile
Guidance for generated docs:
mlx_whisper is the preferred local ASR path on Apple Silicon when available.pyannote.audio direct is the preferred diarization path when HF_TOKEN is configured and the user has accepted Hugging Face model terms, but run it on CUDA/cloud GPU for long files.pyannote/speaker-diarization-community-1 and pyannote/segmentation-3.0, then set HF_TOKEN in their shell or secret manager. Never bake tokens into generated setup scripts.When setting up AI tools on a new Mac, also install and configure peon-ping with these defaults:
~/.claude/hooks/peon-ping/ so Claude Code, Codex, and Cursor can all use the same install.~/.codex/config.toml:
notify = ["bash", "/Users/$USER/.claude/hooks/peon-ping/adapters/codex.sh"]
~/.cursor/ exists.default_pack: "peon" as the fallback pack.glados, jarvis, r2d2, peasant, sc_kerrigan, sc_scv, sc_marine, sc_raynor, sc_ghost, sc_terran, protoss, sc2_alarak, sc2_abathur, ra2_eva_commander, ra2_kirov, ra2_yuri, ra_soviet, ccg_gla_worker, ccg_us_dozer, ccg_china_dozerpack_rotation_mode to round-robin.volume to 0.2.desktop_notifications enabled, but use notification_style: "standard" rather than large overlays.terminal-notifier via Homebrew so standard macOS notifications work reliably and support click-to-focus behavior.suppress_sound_when_tab_focused: true.silent_window_seconds: 30 so task.complete only fires for longer-running work.session.start: falsetask.acknowledge: falsetask.complete: truetask.error: trueinput.required: trueresource.limit: trueuser.spam: falseqwen3.5:27b # General purpose (256K context, multimodal)
qwen2.5-coder:14b # Code-focused
deepseek-r1:8b # Reasoning
# Finder: show extensions, show dotfiles, show path bar, list view
# Dock: auto-hide, no recents, no delay, minimize to app icon
# Keyboard: no autocorrect, no smart quotes, fast repeat, no press-and-hold
# Trackpad: no natural scrolling, tap to click
# Screenshots: PNG, Desktop, no shadow
# Menu bar: auto-hide
These can't be automated via defaults write:
These aren't in Homebrew or need manual install:
After all scripts finish, open these apps to sign in and configure them. The skill should auto-open them for the user:
# Apps that need login/activation after install
open -a "Slack"
open -a "Discord"
open -a "Raycast"
open -a "Shottr"
open -a "1Password"
open -a "Spotify"
open -a "Zoom"
open -a "Dia"
open -a "GitHub Desktop" 2>/dev/null
open -a "Claude" 2>/dev/null
echo "🔑 Sign into each app above, then continue setup."
Essential:
Nice to have:
Things worth considering that aren't in the original blog posts but complement this setup well:
z alternative with fuzzy matchingcat replacement with syntax highlightingls replacementfind alternativegrep (rg)The .zshrc should include:
The Ghostty config should include: