How I set up a clean Mac

October 28, 2024

Last updated August 7, 2026.

Homebrew package manager

Install: brew.sh/

‼️ Follow instructions in terminal to add to path

Bundle: docs.brew.sh/Brew-Bundle-and-Brewfile

Connect Github

Add computer to github SSH list: github.com/settings/keys. See guide linked from keys page.

Make 'git open' open the repository in the browser

npm install --global git-open

Use by typing git open in a reposetory.

Docs: www.npmjs.com/package/git-open?activeTab=readme

IDE and dev tools

cursor.com/

code.visualstudio.com/

Install code as PATH keyword (works in either vscode or cursor):

⌘ + Shift + PShell Command: Install 'code' command in PATH

claude.com/product/claude-code

www.docker.com/products/docker-desktop/?at_exp=DO103.B

.dotfiles

github.com/aukoyy/dotfiles

Clone in home folder: git clone git@github.com:aukoyy/dotfiles-zsh.git

GNU Stow dotfiles symlinking

formulae.brew.sh/formula/stow

www.gnu.org/software/stow/

Manages the symlinks from ~/dotfiles into ~. Replaces hand-rolled ln -sfn.

The original .zshrc and other conflicting files must be deleted/renamed.

Install

brew install stow

Mental model

Each top-level directory in ~/dotfiles is a package. Everything inside it mirrors the path relative to ~. The package name never appears in the resulting path. In other words, the top level dir names like zsh, git, ghostty are arbitrary names and exist for organisation.

dotfiles/
├── zsh/
│   ├── .zshrc                          →  ~/.zshrc
│   ├── .aliases                        →  ~/.aliases
│   └── .zsh_plugins.txt                →  ~/.zsh_plugins.txt
├── git/
│   └── .gitconfig                      →  ~/.gitconfig
├── ghostty/
│   └── .config/ghostty/config          →  ~/.config/ghostty/config
├── starship/
│   └── .config/starship.toml           →  ~/.config/starship.toml
└── mise/
    └── .config/mise/config.toml        →  ~/.config/mise/config.toml

Commands

cd ~/dotfiles

stow -nv */      # DRY RUN — always do this first
stow -v  */      # link all packages
stow -R  */      # restow (unlink + relink) — use after adding files
stow -D  zsh     # unlink one package

Use */ not .. treats the whole repo as one package and links ~/ghostty, ~/git etc. into home. */ expands to the package list and skips hidden dirs like .git.

Verify

ls -la ~ | grep -E 'zshrc|aliases|gitconfig'
ls -la ~/.config/
ghostty +show-config | grep -E 'theme|font'
mise config

Terminal and config (2026)

Check load times: for i in $(seq 1 5); do /usr/bin/time zsh -i -c exit; done

ghostty.org/

Antidote plugin manager

antidote.sh/

Zsh plugin manager. Replaces oh-my-zsh's plugin loading.

brew install antidote

Nerd Font (prerequisite for the prompt)

Antidote itself doesn't need it, but Starship / Oh My Posh / p10k render glyphs that don't exist in normal fonts. Without it the prompt shows boxes (􏿿).

brew install --cask font-jetbrains-mono-nerd-font

Then in ~/.config/ghostty/config:

After symlinking, this should be same as ⌘ + , in ghostty.

font-family = JetBrainsMono Nerd Font
font-size = 14

Verify the glyphs render:

echo "\ue0b0 \uf013 \ue702 \uf09b \ue7a8"
# wrong output:     

Should show: a powerline arrow, a gear, a git icon, the GitHub logo, a Rust icon. Boxes or blank space = wrong font, or the font name in the config doesn't match. List what's actually installed with ghostty +list-fonts | grep -i nerd.

!CleanShot 2026-08-04 at 15.15.01.png

Configure

~/.zsh_plugins.txt — one bundle per line. Syntax highlighting must be last.

zsh-users/zsh-completions
zsh-users/zsh-autosuggestions
zsh-users/zsh-history-substring-search
zdharma-continuum/fast-syntax-highlighting

Oh-my-zsh plugins still work here:

ohmyzsh/ohmyzsh path:plugins/git
ohmyzsh/ohmyzsh path:plugins/aws

~/.zshrc — note the Homebrew path, not ~/.antidote.

source /opt/homebrew/opt/antidote/share/antidote/antidote.zsh
antidote load

Verify

CheckCommandExpected
Antidote loadedantidote --versionversion string
Plugin file foundantidote listone line per bundle
Repos clonedls $(antidote home)one dir per bundle
Static file builtls -l ~/.zsh_plugins.zshexists, non-zero
Installed fontsghostty +show-configfonts listed

Functional test (visual):

  • Autosuggestions — retype a past command → grey completion, accept with
  • Syntax highlightingls green, lsss red
  • History substring — type 2–3 chars, filters instead of walking history
  • Completionsgit che<TAB>checkout

After changing .zsh_plugins.txt

antidote update    # update cloned plugins
exec zsh           # regenerate static file and reload

Starship prompt engine

starship.rs/

Prompt engine. Replaces powerlevel10k. Requires a Nerd Font (see antidote-setup).

curl -sS https://starship.rs/install.sh | sh

Config

Lives in dotfiles, symlinked into place with gnu stow

Apply a preset — write to the real path, not through the symlink:

starship preset catppuccin-powerline -o ~/dotfiles/starship.toml --force

Browse presets with screenshots: starship.rs/presets/ List locally: starship preset --list

Matches the Ghostty catppuccin-mocha theme. Flavour is set by palette in the toml (catppuccin_mocha / frappe / macchiato / latte).

.zshrc

Order matters — Starship goes last, after antidote load.

eval "$(starship init zsh)"

Two-line prompt

Info on top, underneath. Needs both:

format = """...$line_break$character"""

[line_break]
disabled = false # this one did it

add_newline = true (top-level) is separate — that's the blank line above the whole prompt.

Verify

starship --version
starship timings          # per-module cost

Trimming

Powerline presets show every detected runtime. On a TS/AWS machine that's noise:

[nodejs]
disabled = true

[time]
disabled = true

Env handler

mise.jdx.dev/

MacOS Defaults & settings

Defaults

macos-defaults.com/dock/autohide.html

macos-defaults.com/dock/autohide-time-modifier.html

macos-defaults.com/dock/autohide-delay.html

Fade hidden apps in dock:

defaults write com.apple.Dock showhidden -bool true; killall Dock

Finder

mkdir ~/code && mkdir ~/torrenting && mkdir ~/youtube && mkdir ~/bots

Remember that to show hidden folders in Finder, use command + shift + .

Improve GUI

  • View → Show path bar
  • View → Show tab bar
  • View → Show status bar
  • View → Sort by → Name
  • View → Sort by → Snap to grid
  • More options: Show View Options (⌘J)
  • Finder settings (⌘ + ,) → Advanced → In windows when sorting by name

Keyboard shortcuts

Settings → Keyboard → Keyboard Shortcuts

  • Mission Control → Show Notificatioin Center: ⌥ `

Hot corners

Settings → Desktop & Dock → Hot Corners

  • Up left: Mission control
  • Up right: Notification Center

Text replacements

Settings → Keyboard → Text Replacements

ReplaceWith
-^
->
-v
<-
<->
**
/bul
/cmd
/control
/deg°
/euro
/globe🌐
/idk¯\_(ツ)_/¯
/inf
/j
/opt
/pound£
/shift
/tlf+47 num
/tm
/x
gmgmail
mvhøMed Vennlig Hilsen,
orgvnum

Applications

App store

  • Whisper Transcription
  • Slack
  • Things 3
  • Tripmode
  • Keystroke Pro
  • Marked 3
  • Bulder
  • Subscription Day

Brew or command line installs

Apps I consider

Other

  • Discord
  • Telegram
  • Flightly
  • Grammarly
  • Infuse
  • Karabiner elements (for alt-tab)
  • PhotoCuller
  • Photomator
  • Spotify
  • Cursor
  • Remind me faster

Get from old mac

If you are simply resetting an old mac, make sure to grab everything you need:

  • Go over and commit+push dotfiles
  • Rectangle: export user settings
  • Brewfile
    • Create Brewfile: brew bundle dump --force (explained in bundle link)
    • Personally I like a clean install, but the brewfile is still nice as reference
← Go back