MacBook-setup voor AI engineering: macOS-tools en workflow

Automatische vertaling Dit artikel is automatisch vertaald vanuit de oorspronkelijke Engelse versie.

Dit is de setup die ik toepas op een nieuwe MacBook voordat ik AI engineering-werk doe. De setup omvat de command-line tools die macOS niet standaard bevat, Homebrew, Python met uv, de shell, keuzes voor terminal en editor, Docker en lokale AI-tools.

De nuttige scheidslijn ligt tussen vereiste fundamenten en persoonlijke voorkeuren. Xcode Command Line Tools, Homebrew, Git en een Python-workflow zijn fundamenten. Warp, iTerm2, Powerlevel10k, Cursor en lokale model runners zijn keuzes. Met de onderstaande commando’s installeer je de fundamenten; in de volgende secties leg ik de keuzes vast die ik daar bovenop maak. Dit is een gedocumenteerde setup-sequence, geen bit-for-bit reproduceerbare machine-image.

De macOS-fundamenten installeren

Begin met Apple’s command-line tools:

xcode-select --install

macOS opent een dialoogvenster dat je door de installatie leidt.

Homebrew is de package manager die ik voor de rest van deze setup gebruik:

Download de installer van een gereviewde revision, controleer de digest, inspecteer het bestand en voer daarna de lokale kopie uit:

(
    set -e
    homebrew_installer="$(mktemp)"
    trap 'rm -f "$homebrew_installer"' EXIT
    curl --proto '=https' --tlsv1.2 --fail --location --show-error https://raw.githubusercontent.com/Homebrew/install/150c69df1e54b0b74c9fcca5a201410a2300816a/install.sh -o "$homebrew_installer"
    printf '%s  %s\n' 12479a24be3f5307eecac7cde670fad7118640f031229e964f544b1367b52a41 "$homebrew_installer" | shasum -a 256 --check
    less "$homebrew_installer"
    /bin/bash "$homebrew_installer"
)

De Homebrew-installatiehandleiding legt de wijzigingen en standaardprefixes uit. Op Apple Silicon gebruikt Homebrew /opt/homebrew. Voer het brew shellenv-commando uit dat aan het einde wordt afgedrukt, zodat brew beschikbaar is in de huidige shell. De installer configureert mogelijk ook de Homebrew-prefix voor toekomstige login shells. De commit pin en SHA-256 hebben betrekking op het bootstrap-bestand; werk ze na review gezamenlijk bij. Homebrew zelf is een rolling package manager, dus latere brew install-commando’s verwijzen nog steeds naar de dan actuele formulaversies.

Installeer de command-line tools die ik regelmatig gebruik:

brew install openssl readline sqlite3 xz zlib uv htop gitmoji pandoc ncdu tmux

De packages vallen in drie groepen:

  • openssl, readline, sqlite3, xz en zlib leveren libraries voor algemene Python- en command-line-workloads.
  • uv beheert Python-versies, environments, dependencies, commando’s en lockfiles.
  • htop, tmux, ncdu, gitmoji en pandoc zijn bedoeld voor process monitoring, terminal sessions, disk-inspectie, commit-formatting en documentconversie.

uv gebruiken voor dagelijks Python-werk

Voordat ik uv ging gebruiken, gebruikte ik pyenv om Python-environments te beheren. uv dekt nu mijn dagelijkse workflow. Installeer de nieuwste Python-versie die door uv wordt beheerd:

uv python install

Hiermee installeer je de nieuwste versie die op het moment van de setup beschikbaar is voor uv. Gebruik voor een projectspecifieke versie de pinning-workflow uit mijn korte handleiding voor Python-beheer op macOS met uv.

Installeer pyenv afzonderlijk wanneer je het source-buildpad nodig hebt:

brew install pyenv

Ik gebruik pyenv wanneer ik een source-built interpreter of aangepaste CPython-buildopties nodig heb die de prebuilt distributions van uv niet bieden. Verwijder pyenv uit de shell-pluginlijst hieronder als je deze optionele installatie overslaat.

Een terminal kiezen

De standaard macOS Terminal voldoet prima. Ik heb jarenlang iTerm2 gebruikt en ben onlangs overgestapt op Warp, een op Rust gebaseerde terminal met ingebouwde AI-features. Deze keuze heeft geen invloed op de rest van de setup.

Als je iTerm2 blijft gebruiken, wijzig ik deze twee instellingen:

Natuurlijke tekstbewerking inschakelen

  1. Open Preferences → Profiles → Keys → Key Mappings.
  2. Open de dropdown Presets…
  3. Selecteer “Natural Text Editing”.

Een kleurenthema kiezen

  1. Bekijk thema’s op iTerm2-Color-Schemes.
  2. Open Preferences → Profiles → Colors → Color Presets…
  3. Selecteer Import en kies het gedownloade thema.

Zsh configureren

macOS gebruikt Zsh als standaard login shell. Ik gebruik de meegeleverde /bin/zsh; installeer Zsh van Homebrew alleen wanneer je een specifieke nieuwere upstream-versie nodig hebt.

Controleer de geïnstalleerde Zsh en de huidige login shell:

echo "$SHELL"
command -v zsh
zsh --version

Als Zsh is geïnstalleerd maar niet als login shell is geselecteerd, schakel dan over naar de meegeleverde kopie:

chsh -s /bin/zsh

Open na het wijzigen van de login shell een nieuwe terminal.

Oh My Zsh voegt de defaults en het plugin-systeem toe die ik gebruik. De standaardinstaller volgt een bewegende branch. Voor een gepinde setup clone je de repository zonder die branch uit te checken, selecteer je de gereviewde commit en kopieer je pas daarna de template:

(
    set -e
    omz_dir="$HOME/.oh-my-zsh"
    if [ -L "$HOME/.zshrc" ]; then
        printf 'Refusing to replace symlink: %s\n' "$HOME/.zshrc" >&2
        exit 1
    fi
    if [ -e "$HOME/.zshrc" ] && [ ! -f "$HOME/.zshrc" ]; then
        printf 'Refusing to replace non-regular file: %s\n' "$HOME/.zshrc" >&2
        exit 1
    fi
    if [ -e "$HOME/.zshrc" ]; then
        omz_backup="$(mktemp "$HOME/.zshrc.pre-oh-my-zsh.XXXXXX")"
        cp "$HOME/.zshrc" "$omz_backup"
        printf 'Existing .zshrc backed up to %s\n' "$omz_backup"
    fi
    git clone --filter=blob:none --no-checkout https://github.com/ohmyzsh/ohmyzsh "$omz_dir"
    git -C "$omz_dir" checkout --detach 4b657407c98bbc8830ae66c2ac7ff3d737c55a83
    test "$(git -C "$omz_dir" rev-parse HEAD)" = 4b657407c98bbc8830ae66c2ac7ff3d737c55a83
    new_zshrc="$(mktemp "$HOME/.zshrc.new.XXXXXX")"
    trap 'rm -f "$new_zshrc"' EXIT
    cp "$omz_dir/templates/zshrc.zsh-template" "$new_zshrc"
    test -s "$new_zshrc"
    test ! -d "$HOME/.zshrc"
    mv -f "$new_zshrc" "$HOME/.zshrc"
)

Het block stopt voordat .zshrc wordt vervangen als het clonen of de commit-verificatie mislukt. Het weigert symlinks en niet-reguliere bestanden, maakt een backup van een bestaand bestand onder een unieke .zshrc.pre-oh-my-zsh.*-naam en vervangt het bestand met één rename door een geverifieerde tijdelijke kopie. Vergelijk de afgedrukte backup met de template en zet je lokale instellingen terug voordat je een nieuwe shell opent. De checkout is gepind op commit 4b65740; werk de hash pas bij nadat je een nieuwere revision hebt gereviewd.

Voer de shell-configuratiesnippets uit vanuit één setup-shell, zonder dat een ander proces .zshrc of de plugin- en themadoelen wijzigt. Ze weigeren bestaande of gesymlinkte doelen, maar zijn geen multi-process package manager.

Plugins toevoegen

Installeer zsh-autosuggestions en zsh-syntax-highlighting in de custom plugin-directory van Oh My Zsh:

install_pinned_zsh_repo() (
    set -e
    repo_url="$1"
    commit="$2"
    destination="$3"
    if [ -L "$destination" ]; then
        printf 'Refusing symlink destination: %s\n' "$destination" >&2
        return 1
    fi
    if [ -d "$destination/.git" ] && [ "$(git -C "$destination" rev-parse HEAD)" = "$commit" ]; then
        return 0
    fi
    destination_parent="$(dirname "$destination")"
    mkdir -p "$destination_parent"
    stage="$(mktemp -d "$destination_parent/.pinned-zsh.XXXXXX")"
    cleanup_stage() { rm -rf "$stage"; }
    trap cleanup_stage EXIT
    git clone --filter=blob:none --no-checkout "$repo_url" "$stage/repo"
    git -C "$stage/repo" checkout --detach "$commit"
    test "$(git -C "$stage/repo" rev-parse HEAD)" = "$commit"
    test ! -e "$destination"
    test ! -L "$destination"
    mv -h -n "$stage/repo" "$destination"
    test ! -e "$stage/repo"
    test "$(git -C "$destination" rev-parse HEAD)" = "$commit"
)

install_pinned_zsh_repo https://github.com/zsh-users/zsh-autosuggestions e52ee8ca55bcc56a17c828767a3f98f22a68d4eb "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions"
install_pinned_zsh_repo https://github.com/zsh-users/zsh-syntax-highlighting.git db085e4661f6aafd24e5acb5b2e17e4dd5dddf3e "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting"

De gepinde zsh-autosuggestions-commit en zsh-syntax-highlighting-commit komen overeen met de gepubliceerde v0.7.1- en 0.8.0-releases. Werk de hashes pas bij nadat je een nieuwere release hebt gereviewd.

Bewerk ~/.zshrc om deze plugins samen met de plugins die ik gebruik te laden:

plugins=(
    aws bgnotify brew docker docker-compose
    emoji forklift gcloud git history iterm2
    keychain kubectl macos pre-commit
    pyenv pylint python screen themes
    tmux virtualenv vscode
    zsh-autosuggestions zsh-syntax-highlighting
)

Laat zsh-syntax-highlighting als laatste item in de array staan. De Oh My Zsh plugins-wiki beschrijft de meegeleverde plugins. De twee externe plugins stellen commando’s voor uit de history en markeren commando’s terwijl je typt; volg de installatie-instructies in elke repository.

Powerlevel10k en het font toevoegen

Powerlevel10k is het Zsh-thema dat ik gebruik. Het toont de working directory, Git-status en actieve Python-environment in de prompt en biedt een interactieve configuratiewizard. Installeer het voor Oh My Zsh en selecteer het thema vervolgens in ~/.zshrc:

(
    set -e
    p10k_dir="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
    if [ -L "$p10k_dir" ]; then
        printf 'Refusing symlink destination: %s\n' "$p10k_dir" >&2
        exit 1
    fi
    if [ -d "$p10k_dir/.git" ] && [ "$(git -C "$p10k_dir" rev-parse HEAD)" = 35833ea15f14b71dbcebc7e54c104d8d56ca5268 ]; then
        exit 0
    fi
    test ! -e "$p10k_dir"
    p10k_parent="$(dirname "$p10k_dir")"
    mkdir -p "$p10k_parent"
    stage="$(mktemp -d "$p10k_parent/.pinned-p10k.XXXXXX")"
    cleanup_stage() { rm -rf "$stage"; }
    trap cleanup_stage EXIT
    git clone --filter=blob:none --no-checkout https://github.com/romkatv/powerlevel10k.git "$stage/repo"
    git -C "$stage/repo" checkout --detach 35833ea15f14b71dbcebc7e54c104d8d56ca5268
    test "$(git -C "$stage/repo" rev-parse HEAD)" = 35833ea15f14b71dbcebc7e54c104d8d56ca5268
    test ! -L "$p10k_dir"
    mv -h -n "$stage/repo" "$p10k_dir"
    test ! -e "$stage/repo"
    test "$(git -C "$p10k_dir" rev-parse HEAD)" = 35833ea15f14b71dbcebc7e54c104d8d56ca5268
)

De gepinde Powerlevel10k-commit verwijst naar de v1.20.0 release.

De bovenstaande Git object IDs voorkomen stille version drift nadat je ze hebt verkregen; ze authenticeren de maintainer niet zelfstandig. Deze commando’s vertrouwen op GitHub’s HTTPS-endpoint en de accounts achter de repositories. Gebruik voor een sterker trust model een signed tag of commit die je verifieert tegen een maintainer key die je afzonderlijk hebt verkregen, voordat je de staged checkout op zijn plaats zet.

ZSH_THEME="powerlevel10k/powerlevel10k"

Open een nieuwe shell en voer p10k configure uit.

Als je de integrated terminal van VS Code gebruikt, installeer dan het aanbevolen font voordat je het terminalfont instelt, zodat de Powerlevel10k-iconen correct worden weergegeven. p10k configure kan het font automatisch installeren in iTerm2. Download en installeer voor andere terminals de vier TTF-bestanden uit de Powerlevel10k-fontguide.

Stel in VS Code het terminalfont in op MesloLGS NF:

  1. Open de instellingen van je editor.
  2. Zoek naar terminal.integrated.fontFamily.
  3. Stel dit in op MesloLGS NF.

Editors en AI-assistants kiezen

Ik houd één IDE open en daarnaast een of twee AI-tools.

IDE’s

  • Cursor is een VS Code-fork met ingebouwde AI pair programming.
  • VS Code heeft de grotere extension-catalogus.

AI-assistants

  • OpenAI Codex is OpenAI’s coding agent.
  • Claude is Anthropic’s assistant, die ik erbij pak voor moeilijkere taken.

Tegenwoordig gebruik ik Cursor met Codex en Claude Code parallel.

Containers en lokale modeltools kiezen

De overige tools hangen af van het werk dat ik op de machine wil doen:

Docker Desktop en lokale model runners zijn onafhankelijke keuzes. Installeer ze wanneer je projecten containers of lokale inference nodig hebben; de shell- en Python-setup zijn van geen van beide afhankelijk.

De grenzen van de setup vastleggen

Dit is een persoonlijke setup, geen minimale of universele macOS-baseline. Verwijder wat je niet gebruikt. De setup legt gereviewde bootstrap-revisions en plugin-releases vast, maar Homebrew-formulas en GUI-applicaties blijven veranderen. De grenzen die ik consistent houd zijn:

  1. Gebruik de meegeleverde /bin/zsh, tenzij een project een specifieke nieuwere Zsh nodig heeft.
  2. Gebruik uv voor dagelijkse Python-installaties en project-environments; bewaar pyenv voor source-built of aangepaste CPython-interpreters.
  3. Documenteer installatiecommando’s, secret-free dotfiles, editor extensions en model-locaties, zodat de volgende setup mechanisch kan worden uitgevoerd.

Referenties