Skip to content

Instantly share code, notes, and snippets.

@conceptblend
Forked from codeinthehole/osx_bootstrap.sh
Last active April 22, 2024 17:13
Show Gist options
  • Save conceptblend/9f3706fe59b44e36ed5a3122d34f836f to your computer and use it in GitHub Desktop.
Save conceptblend/9f3706fe59b44e36ed5a3122d34f836f to your computer and use it in GitHub Desktop.
Script to install stuff I want on a new OSX machine
#!/usr/bin/env bash
#
# Bootstrap script for setting up a new OSX machine
#
# This should be idempotent so it can be run multiple times.
#
# Some apps don't have a cask and so still need to be installed by hand. These
# include:
#
# - SVGSUS
# - Divvy
#
# Notes:
#
# - If installing full Xcode, it's better to install that first from the app
# store before running the bootstrap script. Otherwise, Homebrew can't access
# the Xcode libraries as the agreement hasn't been accepted yet.
#
# Reading:
#
# - https://gist.github.com/MatthewMueller/e22d9840f9ea2fee4716
# - https://news.ycombinator.com/item?id=8402079
# - https://github.com/mathiasbynens/dotfiles/blob/master/.macos
# - https://www.taniarascia.com/setting-up-a-brand-new-mac-for-development/
echo "Starting bootstrapping"
# Close any open System Preferences panes, to prevent them from overriding
# settings we’re about to change
osascript -e 'tell application "System Preferences" to quit'
# Ask for the administrator password upfront
sudo -v
# Keep-alive: update existing `sudo` time stamp until `.macos` has finished
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
xcode-select --install
# Check for Homebrew, install if we don't have it
if test ! $(which brew); then
echo "Installing homebrew..."
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi
# Update homebrew recipes
brew update
# Install GNU core utilities (those that come with OS X are outdated)
# brew tap homebrew/dupes
# brew install coreutils
# brew install gnu-sed --with-default-names
# brew install gnu-tar --with-default-names
# brew install gnu-indent --with-default-names
# brew install gnu-which --with-default-names
# brew install gnu-grep --with-default-names
# Install GNU `find`, `locate`, `updatedb`, and `xargs`, g-prefixed
# brew install findutils
# Install Bash 4
# brew install bash
PACKAGES=(
ffmpeg
git
imagemagick
markdown
nano
npm
python
python3
svgo
tree
yarn
)
echo "Installing packages..."
brew install ${PACKAGES[@]}
echo "Installing cask..."
brew tap homebrew/cask
CASKS=(
brave-browser
cyberduck
figma
firefox
google-chrome
imageoptim
iterm2
ipvanish-vpn
mamp
microsoft-word
microsoft-excel
microsoft-outlook
microsoft-powerpoint
microsoft-teams
miro
notion
obs
onedrive
paw
postman
slack
spotify
visual-studio-code
xmind
zoomus
)
# iterm2 theme
# https://github.com/nickcernis/iterm2-night-owl
echo "Installing cask apps..."
brew cask install ${CASKS[@]}
echo "Installing fonts..."
brew tap homebrew/cask-fonts
# https://github.com/Homebrew/homebrew-cask-fonts/tree/master/Casks
FONTS=(
font-inconsolata
font-roboto
font-clear-sans
font-inter
font-exo
font-noto-sans
font-noto-serif
font-noto-sans-display
font-noto-serif-display
)
brew cask install ${FONTS[@]}
echo "Cleaning up..."
brew cleanup
# echo "Installing Python packages..."
# PYTHON_PACKAGES=(
# ipython
# virtualenv
# virtualenvwrapper
# )
# sudo pip install ${PYTHON_PACKAGES[@]}
# echo "Installing Ruby gems"
# RUBY_GEMS=(
# bundler
# filewatcher
# cocoapods
# )
# sudo gem install ${RUBY_GEMS[@]}
# NVM and Node
echo "Installing NVM..."
touch ~/.zshrc
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
# Install latest version
nvm install node
# echo "Installing global npm packages..."
# npm install marked -g
echo "Configuring OSX..."
# Set moderate key repeat rate
defaults write NSGlobalDomain KeyRepeat -int 6
defaults write NSGlobalDomain InitialKeyRepeat -int 25
# Require password as soon as screensaver or sleep mode starts
defaults write com.apple.screensaver askForPassword -int 1
defaults write com.apple.screensaver askForPasswordDelay -int 0
# Show filename extensions by default
# defaults write NSGlobalDomain AppleShowAllExtensions -bool true
# Enable tap-to-click
# defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
# defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
# Enable "natural" scroll
defaults write NSGlobalDomain com.apple.swipescrolldirection -bool true
# Disable "shake to reveal"
defaults write NSGlobalDomain CGDisableCursorLocationMagnification -bool true
defaults write NSGlobalDomain com.apple.springing.enabled -bool true
defaults write NSGlobalDomain com.apple.springing.delay -float 0.5
defaults write NSGlobalDomain com.apple.mouse.scaling -float 0.6875
defaults write NSGlobalDomain com.apple.trackpad.forceClick -bool true
# Disable smart quotes
defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
# Expand save panel by default
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode2 -bool true
# Save to disk (not to iCloud) by default
defaults write NSGlobalDomain NSDocumentSaveNewDocumentsToCloud -bool true
# Use scroll gesture with the Ctrl (^) modifier key to zoom
sudo defaults write com.apple.universalaccess closeViewDFRZoomEnabled -bool false
sudo defaults write com.apple.universalaccess closeViewDesiredZoomFactor -float 1.85
sudo defaults write com.apple.universalaccess closeViewHotkeysEnabled -bool false
sudo defaults write com.apple.universalaccess closeViewPanningMode -bool true
sudo defaults write com.apple.universalaccess closeViewScrollWheelModifiersInt -int 262144
sudo defaults write com.apple.universalaccess closeViewScrollWheelToggle -bool true
sudo defaults write com.apple.universalaccess closeViewSplitScreenRatio -float 0.2
sudo defaults write com.apple.universalaccess closeViewZoomFollowsFocus -bool true
# Save screenshots to the desktop
mkdir ~/00_Screenshots
defaults write com.apple.screencapture location -string "~/00_Screenshots"
# Save screenshots in PNG format (other options: BMP, GIF, JPG, PDF, TIFF)
defaults write com.apple.screencapture type -string "png"
# Use list view in all Finder windows by default
# Four-letter codes for the other view modes: `icnv`, `clmv`, `glyv`
defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv"
# Keep folders on top when sorting by name
defaults write com.apple.finder _FXSortFoldersFirst -bool true
# When performing a search, search the current folder by default
defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"
# Disable shadow in screenshots
defaults write com.apple.screencapture disable-shadow -bool true
# echo "Creating folder structure..."
[[ ! -d ~/Sites ]] && mkdir ~/Sites
# Clear all the dumb apps from the Dock
# !!! Not idempotent !!! Only run as needed.
# defaults write com.apple.dock.plist persistent-apps '' && killall Dock
echo "Done. Note that some of these changes require a logout/restart to take effect."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment