#!/usr/bin/env bash # # macOS Installation Script # Usage: curl -fsSL https://static.due.ren/install.sh | bash # # This script installs: # - Homebrew (if not installed) # - CLI tools via Homebrew formulas # - GUI applications via Homebrew casks # - Mac App Store applications (requires sign-in) # - Google Fonts (Barlow, Poppins) # set -e # Exit on error # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color print_section() { printf "\n${GREEN}==>${NC} %s\n" "$1" } print_error() { printf "${RED}ERROR:${NC} %s\n" "$1" } print_warning() { printf "${YELLOW}WARNING:${NC} %s\n" "$1" } print_info() { printf "${GREEN}✓${NC} %s\n" "$1" } # Check if running on macOS if [[ "$(uname)" != "Darwin" ]]; then print_error "This script only works on macOS" exit 1 fi # ============================================================================= # STEP 1: Install Xcode Command Line Tools # ============================================================================= print_section "Checking Xcode Command Line Tools..." if ! xcode-select -p &> /dev/null; then print_info "Installing Xcode CLI tools..." xcode-select --install printf "\n${YELLOW}💡 Please complete the Xcode installation in the popup window.${NC}\n" read -p "Press ENTER after installation is complete... " else print_info "Xcode CLI tools already installed" fi # ============================================================================= # STEP 2: Install Homebrew # ============================================================================= print_section "Installing Homebrew..." if ! command -v brew &> /dev/null; then /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # Determine Homebrew path based on architecture if [[ "$(/usr/bin/arch)" == "arm64" ]]; then BREW_PATH="/opt/homebrew/bin/brew" else BREW_PATH="/usr/local/bin/brew" fi # Add to shell profile for future sessions if [[ ! -f "$HOME/.zprofile" ]] || ! grep -q "brew shellenv" "$HOME/.zprofile"; then echo >> "$HOME/.zprofile" echo "eval \"\$($BREW_PATH shellenv)\"" >> "$HOME/.zprofile" fi # Set up PATH for current session eval "$($BREW_PATH shellenv)" print_info "Homebrew installed successfully" else print_info "Homebrew already installed" eval "$(brew shellenv)" fi # ============================================================================= # STEP 3: Install Homebrew Formulas (CLI Tools) # ============================================================================= print_section "Installing Homebrew Formulas (CLI tools)..." FORMULAS=( "atuin" # Shell history "bash" # Updated bash "bash-completion" # Bash completions "claude-cli" # Claude AI CLI "gemini-cli" # Gemini AI CLI "node" # Node.js "ffmpeg" # Media processing "mas" # Mac App Store CLI "mole" # SSH tunneling "rename" # Rename utility "ykman" # YubiKey manager ) for formula in "${FORMULAS[@]}"; do if brew list --formula | grep -q "^${formula}\$"; then print_info "$formula already installed" else print_info "Installing $formula..." brew install "$formula" fi done # ============================================================================= # STEP 4: Install Homebrew Casks (GUI Applications) # ============================================================================= print_section "Installing Homebrew Casks (GUI applications)..." CASKS=( "eloston-chromium" # Ungoogled Chromium browser "deepl" # DeepL translator "element" # Matrix client "signal" # Signal messenger "nextcloud" # Nextcloud sync "proton-drive" # Proton Drive "proton-mail" # Proton Mail "protonvpn" # Proton VPN "codex" # AI coding assistant "nova" # Nova editor "transmit" # FTP client "trimmy" # Video trimmer ) # Add custom tap for codexbar print_info "Adding custom taps..." brew tap steipete/tap CUSTOM_CASKS=( "steipete/tap/codexbar" # AI assistant menu bar ) for cask in "${CASKS[@]}"; do if brew list --cask | grep -q "^${cask}\$"; then print_info "$cask already installed" else print_info "Installing $cask..." brew install --cask "$cask" fi done # Install custom tap casks for cask in "${CUSTOM_CASKS[@]}"; do cask_name="${cask##*/}" if brew list --cask | grep -q "^${cask_name}\$"; then print_info "$cask_name already installed" else print_info "Installing $cask_name..." brew install --cask "$cask" fi done # ============================================================================= # STEP 5: Install Mac App Store Applications # ============================================================================= print_section "Installing Mac App Store applications..." # Check if user is signed into App Store if ! mas account &> /dev/null; then print_warning "Not signed into Mac App Store" printf "Please sign in to the App Store, then press ENTER to continue... " read fi # Check that mas is available if ! command -v mas &> /dev/null; then print_error "mas CLI not found. Please run: brew install mas" exit 1 fi MAS_APPS=( "1352778147:Bitwarden" "1503970375:Invoice Ninja" "409203825:Numbers" "409201541:Pages" "1503446680:PastePal" "1579902068:xSearch" ) for app in "${MAS_APPS[@]}"; do app_id="${app%%:*}" app_name="${app##*:}" if mas list | grep -q "^${app_id}"; then print_info "$app_name already installed" else print_info "Installing $app_name..." mas install "$app_id" || print_warning "Failed to install $app_name (may need to purchase first)" fi done # ============================================================================= # STEP 6: Install Google Fonts # ============================================================================= print_section "Installing Google Fonts..." FONT_DIR="$HOME/Library/Fonts" mkdir -p "$FONT_DIR" # Download and install Barlow font family if [[ ! -f "$FONT_DIR/Barlow-Regular.ttf" ]]; then print_info "Downloading Barlow font family..." curl -fsSL "https://fonts.google.com/download?family=Barlow" -o /tmp/Barlow.zip unzip -q -o /tmp/Barlow.zip -d /tmp/Barlow cp /tmp/Barlow/*.ttf "$FONT_DIR/" 2>/dev/null || true rm -rf /tmp/Barlow /tmp/Barlow.zip print_info "Barlow installed" else print_info "Barlow already installed" fi # Download and install Barlow Semi Condensed if [[ ! -f "$FONT_DIR/BarlowSemiCondensed-Regular.ttf" ]]; then print_info "Downloading Barlow Semi Condensed font family..." curl -fsSL "https://fonts.google.com/download?family=Barlow%20Semi%20Condensed" -o /tmp/BarlowSemiCondensed.zip unzip -q -o /tmp/BarlowSemiCondensed.zip -d /tmp/BarlowSemiCondensed cp /tmp/BarlowSemiCondensed/*.ttf "$FONT_DIR/" 2>/dev/null || true rm -rf /tmp/BarlowSemiCondensed /tmp/BarlowSemiCondensed.zip print_info "Barlow Semi Condensed installed" else print_info "Barlow Semi Condensed already installed" fi # Download and install Poppins if [[ ! -f "$FONT_DIR/Poppins-Regular.ttf" ]]; then print_info "Downloading Poppins font family..." curl -fsSL "https://fonts.google.com/download?family=Poppins" -o /tmp/Poppins.zip unzip -q -o /tmp/Poppins.zip -d /tmp/Poppins cp /tmp/Poppins/*.ttf "$FONT_DIR/" 2>/dev/null || true rm -rf /tmp/Poppins /tmp/Poppins.zip print_info "Poppins installed" else print_info "Poppins already installed" fi # Note about Berkeley Mono (commercial font) print_warning "Berkeley Mono is a commercial font and must be installed manually" print_info "Visit: https://berkeleygraphics.com/typefaces/berkeley-mono/" # ============================================================================= # COMPLETION # ============================================================================= print_section "Installation Complete!" printf "\n${GREEN}✓${NC} All software has been installed successfully!\n" printf "\n${YELLOW}Next steps:${NC}\n" printf " 1. Restart your terminal to use Homebrew commands\n" printf " 2. Configure installed applications as needed\n" printf " 3. (Optional) Install Berkeley Mono font manually from https://berkeleygraphics.com/typefaces/berkeley-mono/\n" printf "\n${GREEN}Enjoy your new macOS setup!${NC}\n\n"