My personal installation script for a new computer.
Note, this sets up an extremely opinionated and highly personalized installation, with my preferences and dotfiles. Please adjust as needed!
My dotfile repo is currently private, but I plan on creating a public repo before the end of the year.
Some resources borrowed from:
- https://github.com/ruyadorno/installme-osx/
- https://gist.github.com/millermedeiros/6615994
- https://gist.github.com/brandonb927/3195465/
Open the terminal, then:
bash -c "`curl -L https://git.io/new-computer`"
This command runs the following script:
# _ _ _ _
# ___ _____ __ (_)_ __ ___| |_ __ _| | |
# / _ \/ __\ \/ / | | '_ \/ __| __/ _` | | |
#| (_) \__ \> < | | | | \__ \ || (_| | | |
# \___/|___/_/\_\ |_|_| |_|___/\__\__,_|_|_|
echo "I ❤️ 🍎"
echo "Mac OS Install Setup Script"
echo "By Nina Zakharenko"
echo "Follow me on twitter! https://twitter.com/nnja"
# Some configs reused from:
# https://github.com/ruyadorno/installme-osx/
# https://gist.github.com/millermedeiros/6615994
# https://gist.github.com/brandonb927/3195465/
# Colorize
# Set the colours you can use
black=$(tput setaf 0)
red=$(tput setaf 1)
green=$(tput setaf 2)
yellow=$(tput setaf 3)
blue=$(tput setaf 4)
magenta=$(tput setaf 5)
cyan=$(tput setaf 6)
white=$(tput setaf 7)
# Resets the style
reset=`tput sgr0`
# Color-echo. Improved. [Thanks @joaocunha]
# arg $1 = message
# arg $2 = Color
cecho() {
echo "${2}${1}${reset}"
return
}
echo ""
cecho "###############################################" $red
cecho "# DO NOT RUN THIS SCRIPT BLINDLY #" $red
cecho "# YOU'LL PROBABLY REGRET IT... #" $red
cecho "# #" $red
cecho "# READ IT THOROUGHLY #" $red
cecho "# AND EDIT TO SUIT YOUR NEEDS #" $red
cecho "###############################################" $red
echo ""
# Set continue to false by default.
CONTINUE=false
echo ""
cecho "Have you read through the script you're about to run and " $red
cecho "understood that it will make changes to your computer? (y/n)" $red
read -r response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]; then
CONTINUE=true
fi
if ! $CONTINUE; then
# Check if we're continuing and output a message if not
cecho "Please go read the script, it only takes a few minutes" $red
exit
fi
# Here we go.. ask for the administrator password upfront and run a
# keep-alive to update existing `sudo` time stamp until script has finished
sudo -v
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
##############################
# Prerequisite: Install Brew #
##############################
echo "Installing brew..."
if test ! $(which brew)
then
## Don't prompt for confirmation when installing homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null
fi
# Latest brew, install brew cask
brew upgrade
brew update
brew tap caskroom/cask
#############################################
### Generate ssh keys & add to ssh-agent
### See: https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/
#############################################
echo "Generating ssh keys, adding to ssh-agent..."
read -p 'Input email for ssh key: ' useremail
echo "Use default ssh file location, enter a passphrase: "
ssh-keygen -t rsa -b 4096 -C "$useremail" # will prompt for password
eval "$(ssh-agent -s)"
# Now that sshconfig is synced add key to ssh-agent and
# store passphrase in keychain
ssh-add -K ~/.ssh/id_rsa
# If you're using macOS Sierra 10.12.2 or later, you will need to modify your ~/.ssh/config file to automatically load keys into the ssh-agent and store passphrases in your keychain.
if [ -e ~/.ssh/config ]
then
echo "ssh config already exists. Skipping adding osx specific settings... "
else
echo "Writing osx specific settings to ssh config... "
cat <<EOT >> ~/.ssh/config
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
EOT
fi
#############################################
### Add ssh-key to GitHub via api
#############################################
echo "Adding ssh-key to GitHub (via api)..."
echo "Important! For this step, use a github personal token with the admin:public_key permission."
echo "If you don't have one, create it here: https://github.com/settings/tokens/new"
retries=3
SSH_KEY=`cat ~/.ssh/id_rsa.pub`
for ((i=0; i<retries; i++)); do
read -p 'GitHub username: ' ghusername
read -p 'Machine name: ' ghtitle
read -sp 'GitHub personal token: ' ghtoken
gh_status_code=$(curl -o /dev/null -s -w "%{http_code}\n" -u "$ghusername:$ghtoken" -d '{"title":"'$ghtitle'","key":"'"$SSH_KEY"'"}' 'https://api.github.com/user/keys')
if (( $gh_status_code -eq == 201))
then
echo "GitHub ssh key added successfully!"
break
else
echo "Something went wrong. Enter your credentials and try again..."
echo -n "Status code returned: "
echo $gh_status_code
fi
done
[[ $retries -eq i ]] && echo "Adding ssh-key to GitHub failed! Try again later."
##############################
# Install via Brew #
##############################
echo "Starting brew app install..."
### Window Management
# Todo: Try Divvy and spectacles in the future
brew cask install sizeup # window manager
# Start SizeUp at login
defaults write com.irradiatedsoftware.SizeUp StartAtLogin -bool true
# Don’t show the preferences window on next start
defaults write com.irradiatedsoftware.SizeUp ShowPrefsOnNextStart -bool false
### Developer Tools
brew cask install iterm2
brew cask install dash
brew install ispell
### Development
brew cask install docker
brew install postgresql
brew install redis
### Command line tools - install new ones, update others to latest version
brew install git # upgrade to latest
brew install git-lfs # track large files in git https://github.com/git-lfs/git-lfs
brew install wget
brew install zsh # zshell
brew install tmux
brew install tree
brew link curl --force
brew install grep --with-default-names
brew install trash # move to osx trash instead of rm
brew install less
### Python
brew install python
brew install pyenv
### Microcontrollers & Electronics
brew install avrdude
brew cask install arduino
# Manually install teensyduino from:
# https://www.pjrc.com/teensy/td_download.html
### Dev Editors
brew cask install visual-studio-code
brew cask install pycharm
### spacemacs github.com/syl20bnr/spacemacs
git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
brew tap d12frosted/emacs-plus
brew install emacs-plus --HEAD --with-natural-title-bars
brew linkapps emacs-plus
### Writing
brew cask install evernote
brew cask install macdown
brew cask install notion
### Conferences, Blogging, Screencasts
brew cask install deckset
brew cask install ImageOptim # for optimizing images
brew cask install screenflow
### Productivity
brew cask install wavebox
brew cask install google-chrome
brew cask install alfred
brew cask install dropbox
brew cask install timing # time and project tracker
brew cask install keycastr # show key presses on screen (for gifs & screencasts)
brew cask install betterzip
brew cask install caffeine # keep computer from sleeping
brew cask install skitch # app to annotate screenshots
brew cask install muzzle
brew cask install flux
### Keyboard & Mouse
brew cask install karabiner-elements # remap keys, emacs shortcuts
brew cask install scroll-reverser # allow natural scroll for trackpad, not for mouse
### Quicklook plugins https://github.com/sindresorhus/quick-look-plugins
brew cask install qlcolorcode # syntax highlighting in preview
brew cask install qlstephen # preview plaintext files without extension
brew cask install qlmarkdown # preview markdown files
brew cask install quicklook-json # preview json files
brew cask install epubquicklook # preview epubs, make nice icons
brew cask install quicklook-csv # preview csvs
### Chat / Video Conference
brew cask install slack
brew cask install microsoft-teams
brew cask install zoomus
brew cask install signal
### Music and Video
brew cask install marshallofsound-google-play-music-player
brew cask install vlc
### Run Brew Cleanup
brew cleanup
#############################################
### Fonts
#############################################
echo "Installing fonts..."
brew tap caskroom/fonts
### programming fonts
brew cask install font-fira-mono-for-powerline
brew cask install font-fira-code
### SourceCodePro + Powerline + Awesome Regular (for powerlevel 9k terminal icons)
cd ~/Library/Fonts && { curl -O 'https://github.com/Falkor/dotfiles/blob/master/fonts/SourceCodePro+Powerline+Awesome+Regular.ttf?raw=true' ; cd -; }
#############################################
### Installs from Mac App Store
#############################################
echo "Installing apps from the App Store..."
### find app ids with: mas search "app name"
brew install mas
### Mas login is currently broken on mojave. See:
### Login manually for now.
cecho "Need to log in to App Store manually to install apps with mas...." $red
echo "Opening App Store. Please login."
open "/Applications/App Store.app"
echo "Is app store login complete.(y/n)? "
read response
if [ "$response" != "${response#[Yy]}" ]
then
mas install 907364780 # Tomato One - Pomodoro timer
mas install 485812721 # Tweetdeck
mas install 668208984 # GIPHY Capture. The GIF Maker (For recording my screen as gif)
mas install 1351639930 # Gifski, convert videos to gifs
mas install 414030210 # Limechat, IRC app.
else
cecho "App Store login not complete. Skipping installing App Store Apps" $red
fi
#############################################
### Install few global python packages
#############################################
echo "Installing global Python packages..."
pip3 install --upgrade pip
pip3 install --user pylint
pip3 install --user flake8
#############################################
### Set OSX Preferences - Borrowed from https://github.com/mathiasbynens/dotfiles/blob/master/.macos
#############################################
# 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'
##################
### Finder, Dock, & Menu Items
##################
# Finder: allow quitting via ⌘ + Q; doing so will also hide desktop icons
defaults write com.apple.finder QuitMenuItem -bool true
# Keep folders on top when sorting by name
defaults write com.apple.finder _FXSortFoldersFirst -bool true
# 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 false
# Finder: show all filename extensions
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
# Remove the auto-hiding Dock delay
defaults write com.apple.dock autohide-delay -float 0
# Automatically hide and show the Dock
defaults write com.apple.dock autohide -bool true
# Only Show Open Applications In The Dock
defaults write com.apple.dock static-only -bool true
# Display full POSIX path as Finder window title
defaults write com.apple.finder _FXShowPosixPathInTitle -bool true
# Disable the warning when changing a file extension
defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false
# Automatically quit printer app once the print jobs complete
defaults write com.apple.print.PrintingPrefs "Quit When Finished" -bool true
# Disable the “Are you sure you want to open this application?” dialog
defaults write com.apple.LaunchServices LSQuarantine -bool false
# Avoid creating .DS_Store files on network or USB volumes
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true
# Use list view in all Finder windows by default
# Four-letter codes for the other view modes: `icnv`, `clmv`, `Flwv`
defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv"
# Minimize windows into their application’s icon
defaults write com.apple.dock minimize-to-application -bool true
# Automatically hide and show the Dock
defaults write com.apple.dock autohide -bool true
# Don’t show recent applications in Dock
# defaults write com.apple.dock show-recents -bool false
# Menu bar: hide the Time Machine, User icons, but show the volume Icon.
for domain in ~/Library/Preferences/ByHost/com.apple.systemuiserver.*; do
defaults write "${domain}" dontAutoLoad -array \
"/System/Library/CoreServices/Menu Extras/TimeMachine.menu" \
"/System/Library/CoreServices/Menu Extras/User.menu"
done
defaults write com.apple.systemuiserver menuExtras -array \
"/System/Library/CoreServices/Menu Extras/Volume.menu" \
"/System/Library/CoreServices/Menu Extras/Bluetooth.menu" \
"/System/Library/CoreServices/Menu Extras/AirPort.menu" \
"/System/Library/CoreServices/Menu Extras/Battery.menu" \
"/System/Library/CoreServices/Menu Extras/Clock.menu"
##################
### Text Editing / Keyboards
##################
# Disable smart quotes and smart dashes
defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
# Disable auto-correct
defaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false
# Use function F1, F, etc keys as standard function keys
defaults write NSGlobalDomain com.apple.keyboard.fnState -bool true
###############################################################################
# Screenshots / Screen #
###############################################################################
# Require password immediately after sleep or screen saver begins"
defaults write com.apple.screensaver askForPassword -int 1
defaults write com.apple.screensaver askForPasswordDelay -int 0
# Save screenshots to the desktop
defaults write com.apple.screencapture location -string "$HOME/Desktop"
# Save screenshots in PNG format (other options: BMP, GIF, JPG, PDF, TIFF)
defaults write com.apple.screencapture type -string "png"
# Disable shadow in screenshots
defaults write com.apple.screencapture disable-shadow -bool true
###############################################################################
# Address Book, Dashboard, iCal, TextEdit, and Disk Utility #
###############################################################################
# Use plain text mode for new TextEdit documents
defaults write com.apple.TextEdit RichText -int 0
###############################################################################
# Spotlight #
###############################################################################
# Hide Spotlight tray-icon (and subsequent helper)
#sudo chmod 600 /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search
# Disable Spotlight indexing for any volume that gets mounted and has not yet
# been indexed before.
# Use `sudo mdutil -i off "/Volumes/foo"` to stop indexing any volume.
sudo defaults write /.Spotlight-V100/VolumeConfiguration Exclusions -array "/Volumes"
# Load new settings before rebuilding the index
killall mds
###############################################################################
# Trackpad, mouse, keyboard, Bluetooth accessories, and input #
###############################################################################
# Disable “natural” (Lion-style) scrolling
# Uncomment if you don't use scroll reverser
# defaults write NSGlobalDomain com.apple.swipescrolldirection -bool false
# Stop iTunes from responding to the keyboard media keys
#launchctl unload -w /System/Library/LaunchAgents/com.apple.rcd.plist 2> /dev/null
# Trackpad: enable tap to click for this user and for the login screen
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
# Disable force click and haptic feedback
defaults write ~/Library/Preferences/com.apple.AppleMultitouchTrackpad.plist ForceSuppressed -bool true
# Mouse settings
defaults write com.apple.driver.AppleBluetoothMultitouch.mouse.plist MouseOneFingerDoubleTapGesture -int 0
defaults write com.apple.driver.AppleBluetoothMultitouch.mouse.plist MouseTwoFingerDoubleTapGesture -int 3
defaults write com.apple.driver.AppleBluetoothMultitouch.mouse.plist MouseTwoFingerHorizSwipeGesture -int 2
defaults write ~/Library/Preferences/.GlobalPreferences.plist com.apple.mouse.scaling -float 3
defaults write ~/Library/Preferences/.GlobalPreferences.plist com.apple.swipescrolldirection -boolean NO
###############################################################################
# Mac App Store #
###############################################################################
# Enable the automatic update check
defaults write com.apple.SoftwareUpdate AutomaticCheckEnabled -bool true
# Download newly available updates in background
defaults write com.apple.SoftwareUpdate AutomaticDownload -int 1
# Install System data files & security updates
defaults write com.apple.SoftwareUpdate CriticalUpdateInstall -int 1
###############################################################################
# Photos #
###############################################################################
# Prevent Photos from opening automatically when devices are plugged in
defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool true
###############################################################################
# Google Chrome #
###############################################################################
# Disable the all too sensitive backswipe on trackpads
defaults write com.google.Chrome AppleEnableSwipeNavigateWithScrolls -bool false
#############################################
### Install dotfiles repo, run link script
#############################################
# TODO:
# clean up my personal repo to make it public
# dotfiles for vs code, emacs, gitconfig, oh my zsh, etc.
# git clone git@github.com:nnja/dotfiles.git
# cd dotfiles
# fetch submodules for oh-my-zsh
# git submodule init && git submodule update && git submodule status
# make symbolic links and change shell to zshell
# ./makesymlinks.sh
# upgrade_oh_my_zsh
echo ""
cecho "Done!" $cyan
echo ""
echo ""
cecho "################################################################################" $white
echo ""
echo ""
cecho "Note that some of these changes require a logout/restart to take effect." $red
echo ""
echo ""
echo -n "Check for and install available OSX updates, install, and automatically restart? (y/n)? "
read response
if [ "$response" != "${response#[Yy]}" ] ;then
softwareupdate -i -a --restart
fi
These apps need to be configured manually.
For OSX settings, I'm still looking for the command line way to change this preference.
Checked:
- Reverse Scrolling
- Reverse vertical
- Reverse horizontal
- Reverse Mouse
Unchecked:
- Reverse Trackpad
Checked:
- Start at login
Unchecked:
- Show in menu bar
- Iterm2 -> Preferences -> General
- Check: Load preferences from custom folder /Users/nina/dotfiles/iterm-profiles
- Check: Save changes to folder when Iterm2 quits
Users & Groups
- make sure guest account is turned off
Keyboard
- Use F1, F2 as standard function keys: ON
- Turn off spotlight (use Alfred instead)
- Keyboard -> Shortcuts -> Spotlight -> Deselect all
- Customize control strip -> Delete siri from touchbar
- Touch Bar Shows -> F1, F2, etc. Keys
General
- Recent items: None
- Appearance: Graphite
- Highlight color: Pink
Mission Control
- Dashboard: As Overlay
Desktop & Screen Saver
- Screensaver
- Hot Corners
- Top right -> Dashboard
- Bottom right -> Start screen saver
- Hot Corners
Trackpad
- Tap to click: ON
- Secondary click: ON
Display
- Night Shift (flux) -> Schedule -> Sunrise to Sunset
Security & Privacy
- Firewall -> on
- Firewall options -> Enable stealth mode
- FileVault -> Turn On FileVault (encrypt harddrive)
Sharing
- Ensure everything is unchecked
Finder Preferences
- General
- New finder window show: home folder
- Sidebar
- Show home, remove Recents
- Advanced
- Show all filename extensions: ON
- Show warning before changing an extension: OFF
- Show warning before emptying the trash: OFF
TrackPad
- Point & Click
- Silent clicking -> On
- Sign into chrome to sync profile & bookmarks
- Chrome -> Warn before quitting: ON
- Set Double Cmd to Alfred hotkey
- configure license
- settings -> automatically start at login
- Simple Modifications
- From key caps_lock to key left_control (Remap caps lock to control for emacs)
- From key right_control to key
b
(custom setting for my ergonomic keyboard)
- Devices
- For all devices -> Caps Lock LED Check Manipulate LED
- Preferences -> Additional Boards Manager URLS -> https://adafruit.github.io/arduino-board-index/package_adafruit_index.json
- Tools -> Board -> Board Manager. Install:
- Arduino SAMD Boards
- Adafruit AVR Boards
- Sketch -> Include Library -> Manage Libraries. Install:
- Adafruit NeoPixel
- FastLED
- Download
- docs for:
- python2
- python3
- django
- flask
- arduino
- processing
- man pages
- cheatsheets for:
- emacs
- git
- python debugger
- python unittest assertions
- log into freenode
Useful shipping status tracker widget
Apps:
- Send to kindle for Mac
- Delivery Status Dashboard Widget
- Flip Clock Screensaver
- FlyCut Clipboard Manager
- Visit this page to opt out of ads (turn off adblock first)
- Configure touchbar?
- Set up wallpaper
- osascript -e 'tell application "Finder" to set desktop picture to "/Users/wilsonmar/Pictures/wallpapers/macOS-High-Sierra-Wallpaper-2880x1494.jpg" as POSIX file'
- Set up alfred powerpack