Skip to main content

My Mac setup

Published:

10 min read

In past I have documented my entire setup when I switched to MacBook Pro with Apple Silicon in December, 2020. Since then I have also documented my setups on different MacBooks with adjustments and changes. This guide is mostly about my latest setup, which includes using tools from AI and some new tools on my Mac.

Initial setup

First few things I like to set up or configure are the system settings and install essential tools that are required for my daily workflow.

Updating macOS

As usual after logging in, I have to ensure the macOS is on the latest version. This time I decided to upgrade it to macOS Tahoe.

Xcode and Command Line Tools

The following tools must be installed before proceeding with the rest of the guide:

After the Xcode installation finishes, install Command Line Tools. Open the terminal app and run:

xcode-select --install && sudo xcodebuild -license

Let’s verify that Command Line Tools have been installed properly and install iOS simulators (only required if you are into mobile app development):

The initial setup is complete! You’ve now reached a point where you can proceed further.

Fix the default macOS settings

In my previous setup guides, I went through each setting manually in the System Settings app. This time, I’m using defaults write commands in the terminal to apply them all at once.

Dock

# Automatically hide and show the Dock
defaults write com.apple.dock autohide -bool true # false for other devices

# Disable suggested and recent apps in Dock
defaults write com.apple.dock show-recents -bool false

# Set Dock size to 30%
defaults write com.apple.dock tilesize -int 36

# Enable magnification and set to ~50%
defaults write com.apple.dock magnification -bool true
defaults write com.apple.dock largesize -int 54

# Disable automatically rearrange Spaces
defaults write com.apple.dock mru-spaces -bool false

# Disable click wallpaper to reveal Desktop
defaults write com.apple.WindowManager EnableStandardClickToShowDesktop -bool false

# Disable Widgets
defaults write com.apple.WindowManager StandardHideWidgets -bool true

# Disable all hot corners
defaults write com.apple.dock wvous-tl-corner -int 0
defaults write com.apple.dock wvous-tr-corner -int 0
defaults write com.apple.dock wvous-bl-corner -int 0
defaults write com.apple.dock wvous-br-corner -int 0

# Restart Dock to apply changes
killall Dock

Finder

# Show hidden files
defaults write com.apple.finder AppleShowAllFiles -bool true

# Show Path Bar and Status Bar
defaults write com.apple.finder ShowPathbar -bool true
defaults write com.apple.finder ShowStatusBar -bool true

# Show filename extensions
defaults write NSGlobalDomain AppleShowAllExtensions -bool true

# Set new Finder windows to open in Downloads
defaults write com.apple.finder NewWindowTarget -string "PfLo"
defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}/Downloads/"

# Disable .DS_Store files on network and USB volumes
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true

# Show hard disks on desktop
defaults write com.apple.finder ShowHardDrivesOnDesktop -bool true

# Hide CDs, DVDs, and iPods on desktop
defaults write com.apple.finder ShowRemovableMediaOnDesktop -bool false

# Show Library folder
chflags nohidden ~/Library

# Restart Finder to apply changes
killall Finder

Keyboard and input

# Key repeat rate: Fast
defaults write NSGlobalDomain KeyRepeat -int 2

# Delay until repeat: Short
defaults write NSGlobalDomain InitialKeyRepeat -int 15

# Disable autocorrect
defaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false

Trackpad

# Enable tap to click
defaults write com.apple.AppleMultitouchTrackpad Clicking -bool true

# Set tracking speed (0.0 to 3.0, default is 1.0)
defaults write NSGlobalDomain com.apple.trackpad.scaling -float 2.5

# Disable natural scrolling
defaults write NSGlobalDomain com.apple.swipescrolldirection -bool false

# Disable force click and haptic feedback
defaults write com.apple.AppleMultitouchTrackpad ForceSuppressed -bool true

# Enable secondary click with bottom right corner
defaults write com.apple.AppleMultitouchTrackpad TrackpadCornerSecondaryClick -int 2
defaults write com.apple.AppleMultitouchTrackpad TrackpadRightClick -bool true

# Disable Look up & data detectors
defaults write com.apple.AppleMultitouchTrackpad TrackpadThreeFingerTapGesture -int 0

# Disable swipe between pages
defaults write NSGlobalDomain AppleEnableSwipeNavigateWithScrolls -bool false

Lock Screen and Battery

# Set screen saver to start after 1 hour (in seconds)
defaults -currentHost write com.apple.screensaver idleTime -int 3600

# Set display off on battery after 3 hours (in minutes)
sudo pmset -b displaysleep 180

# Set display off on power adapter after 3 hours (in minutes)
sudo pmset -c displaysleep 180

# Disable slightly dim the display on battery
sudo pmset -b lessbright 0

Other

# Disable Siri
defaults write com.apple.assistant.support "Assistant Enabled" -bool false

A few settings still need to be changed manually in System Settings:

Install Homebrew: macOS package manager

An important step in installing development-related tools is using Homebrew, a package manager I’ve trusted for nearly eight years.

To install Homebrew, open iTerm and run the command:


/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

After installing, add the Homebrew to the PATH:


echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/username/.zshrc

eval "$(/opt/homebrew/bin/brew shellenv)"

Note: If you don’t have a .zshrc, create one at /Users/username/.

Then, add the following to .zshrc:


export PATH=/opt/homebrew/bin:$PATH

Install apps from Homebrew bundle

I keep a list of must install apps in a Homebrew bundle inside my dotfiles repo. Download the file from the repo and run the following command to install the apps:

brew bundle --file=brewfile.sh

Tip: Git is already installed as part of Xcode Command Line Tools. However, I prefer to install the latest version from brew and avoid using the outdated version installed by Apple. After installing git, run git --version in a new terminal window. If you run this command in the same terminal window, it will show the Apple Git version.

Git global configurations

After installing Git, apply the following global configurations:

git config --global init.defaultBranch main
git config --global color.uni auto
git config --global user.name "Real name"
git config --global user.email email@domain.com

To check or verify the global git config, run:

git config -l --global

Configure .zshrc

In previous setup guides, I used Oh My Zsh as a shell framework. This time, I’m skipping it entirely. I already use Starship for my prompt, so Oh My Zsh was just adding shell startup lag for features I wasn’t using. The only plugin I need is syntax highlighting, which can be installed directly via brew.

Install zsh-syntax-highlighting:

brew install zsh-syntax-highlighting

The key additions to .zshrc:

# Auto cd into directories without typing cd
setopt AUTO_CD

# Mise (version manager for Node.js, bun, pnpm)
eval "$(mise activate zsh)"

# Starship prompt
eval "$(starship init zsh)"

# Syntax highlighting (must be last)
source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

Copy the full .zshrc from dotfiles to ~/.zshrc.

Configure Starship prompt

I have been using Starship as my command line prompt for a while now. It’s fast, configurable, and works across shells.

Since Starship is already installed from the brew bundle step, copy starship.toml from the dotfiles repo to ~/.config/starship.toml.

Configure iTerm

Setup a primary web browser

By now, you will need a primary web browser to set up and do some things further.

Shared configuration or steps required in both browsers

GitHub setup and configuration

To configure an account on GitHub.com and use an SSH key, follow the steps from GitHub documentation:

Install Node.js, bun, and pnpm

In previous setup guides, I used NVM (Node Version Manager) to install and manage Node.js versions. This time, I’m using mise, a polyglot version manager written in Rust. It replaces nvm, pyenv, and similar tools with one consistent interface. It’s faster (no shell startup lag), auto-switches versions when you cd into a project, and reads existing .nvmrc files.

Since mise is already installed from the brew bundle step, activate it in the shell:

echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
source ~/.zshrc

Install Node.js, bun, and pnpm:

mise use --global node@22
mise use --global bun@latest
mise use --global pnpm@latest

Verify the installations:

node --version
bun --version
pnpm --version

After installing Node.js

Node.js comes with the default package manager npm. Set defaults for it:

npm config set init-author-name "your name"
npm config set init-author-url "example.com"
npm config set init-license MIT

Install global npm packages:

npm i -g eas-cli

Useful mise commands

# Update Node.js to latest patch
mise upgrade node@22

# Install a different version for a specific project
mise use node@20

# List installed tools
mise ls

# List available remote versions
mise ls-remote node

VS Code

My current setup supports JavaScript, TypeScript, Node.js, React, React Native, Expo, and documentation work.

Setup VS Code as the default editor

After installing VS Code from the brew bundle step, open it and set up the code command in PATH. Open the command palette (Cmd + Shift + P) and search for Shell Command: Install ‘code’ command in PATH.

Installing code command in Path in VS Code

Settings

Copy the vscode_settings.jsonc from the dotfiles repo to ~/Library/Application Support/Code/User/settings.json.

Here is what the settings file includes:

{
  "editor.tabSize": 2,
  "workbench.editor.tabSizing": "shrink",
  "editor.cursorBlinking": "phase",
  "editor.fontLigatures": false,
  "editor.wordWrap": "on",
  "editor.cursorSmoothCaretAnimation": "on",
  "editor.tabCompletion": "on",
  "editor.formatOnPaste": true,
  "editor.formatOnSave": true,
  "git.openRepositoryInParentFolders": "always",
  "editor.semanticHighlighting.enabled": true,
  "editor.guides.bracketPairs": true,
  "editor.bracketPairColorization.enabled": true,
  "files.trimTrailingWhitespace": true,
  "readTime.enabled": true,
  "readTime.fileTypes": ["markdown", "plaintext", "yaml", "mdx"],
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "cSpell.language": "en,en-US",
  "cSpell.enabledFileTypes": {
    "markdown": true,
    "mdx": true
  },
  "editor.inlineSuggest.enabled": true,
  "editor.minimap.enabled": true,
  "editor.fontSize": 13.5,
  "terminal.integrated.fontFamily": "JetBrainsMono Nerd Font",
  "editor.fontFamily": "JetBrains Mono",
  "editor.fontWeight": "normal",
  "[markdown]": {
    "editor.quickSuggestions": {
      "comments": "on",
      "strings": "on",
      "other": "on"
    }
  },
  "[json]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[javascriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[jsonc]": {
    "editor.defaultFormatter": "vscode.json-language-features"
  },
  "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "typescript",
    "typescriptreact",
    "markdown"
  ],
  "files.associations": {
    ".env*": "dotenv"
  },
  "mdx.validate.validateFileLinks": "ignore",
  "workbench.editor.enablePreview": false,
  "explorer.confirmDelete": false,
  "editor.renderLineHighlight": "line",
  "githubPullRequests.pullBranch": "never",
  "editor.linkedEditing": true,
  "workbench.startupEditor": "none",
  "update.mode": "manual",
  "telemetry.telemetryLevel": "crash",
  "redhat.telemetry.enabled": false,
  "errorLens.enabledDiagnosticLevels": ["error", "warning"],
  "extensions.ignoreRecommendations": true,
  "window.commandCenter": true,
  "explorer.confirmDragAndDrop": false,
  "claudeCode.preferredLocation": "panel",
  "github.copilot.nextEditSuggestions.enabled": true,
  "github.copilot.enable": {
    "*": true,
    "plaintext": false,
    "markdown": true,
    "scminput": false
  },
  "workbench.colorTheme": "Light 2026"
}

Extensions

Install all extensions with the following commands:

code --install-extension anthropic.claude-code
code --install-extension astro-build.astro-vscode
code --install-extension atishay-jain.all-autocomplete
code --install-extension bradlc.vscode-tailwindcss
code --install-extension christian-kohler.npm-intellisense
code --install-extension dbaeumer.vscode-eslint
code --install-extension eamodio.gitlens
code --install-extension esbenp.prettier-vscode
code --install-extension expo.vscode-expo-tools
code --install-extension formulahendry.auto-close-tag
code --install-extension formulahendry.auto-complete-tag
code --install-extension formulahendry.auto-rename-tag
code --install-extension github.copilot-chat
code --install-extension github.vscode-pull-request-github
code --install-extension johnpapa.read-time
code --install-extension mathiasfrohlich.kotlin
code --install-extension naumovs.color-highlight
code --install-extension oderwat.indent-rainbow
code --install-extension openai.chatgpt
code --install-extension orta.vscode-ios-common-files
code --install-extension oxc.oxc-vscode
code --install-extension redhat.vscode-yaml
code --install-extension riussi.code-stats-vscode
code --install-extension streetsidesoftware.code-spell-checker
code --install-extension tamasfe.even-better-toml
code --install-extension unifiedjs.vscode-mdx
code --install-extension usernamehw.errorlens
code --install-extension vincaslt.highlight-matching-tag
code --install-extension wakatime.vscode-wakatime

This list of extensions can be generated by running code --list-extensions in the terminal.

AI tools and services

Currently, I am using the following tools from different providers:

I keep syncing my personal skills for Claude Code and Codex CLI from dotskills repository. To set that up, open the terminal window, navigate to the dotskills directory, and run:

bash setup.sh

Wrap up

These configurations and tools are what I am currently using on my Mac. It is a work in progress as I expect to make adjustments and changes to it over time.

Enjoyed this post?


Next Post
Week notes 16

Aman Mittal author

I'm a software developer and technical writer. On this blog, I share my learnings about both fields. Recently, I have begun exploring other topics, so don't be surprised if you find something new here.

Currently, working on documentation at Expo.

Tech writing blog webring | Static.Quest webring