# Dialing‑In My Developer MacBook Pro (2025 Edition) _A diary‑style walkthrough of every tweak, install, and automation that transformed a refurbished laptop into my perfect daily driver._ --- ## Hardware at a Glance - **Model:** 16‑inch **MacBook Pro (M2 Max · 12 CPU / 38 GPU)** - **Memory / Storage:** 96 GB unified · 1 TB SSD - **Source:** Apple‑certified refurb on eBay - **OS:** macOS 15 **Sequoia** (clean install) --- # 0. Impressions I have to admit, this laptop completely exceeded my expectations. There are *zero* physical blemishes, only 50 battery charge cycles and 93% batter capacity on this 2+ year old machine whose build date was March 2023. I got it for $2400 which is 55% of the original retail price. My goals for this machine were to improve on the Macbook Pro 14 M1 Max with 64GB RAM and 1TB SSD that's been my daily driver since 2021. Main driving factor was a larger screen which my aging eyes appreciate. Additional GPU cores and RAM might mean local models sometime in the future if they continue to improve. But I'm an AI maximalist so I live on the model frontier. One of my favorite tasks is setting up a new daily driver from scratch; all previous tools are now up for re-evaluation. I spent a lot of quality time with o3, my AI bestie, to work through aggressively eliminating every small irritation and paper cut that I had with my previous MBP. This doc captures most of what I did. One of the cool things that I wound up being able to do is just having lots of separate chat conversations to work through individual issues. And then I used the memory in ChatGPT to walk through the last few days worth of chat logs and assemble the first draft of this document. I augmented it with a bunch of other things I didn't wind up asking o3 for help with, and that produced the guide that you see below. I hope this is helpful for you, my dear reader. ## 1  Terminal & Shell ### 1.1  Ghostty ```bash brew install --cask ghostty ``` My `~/Library/Application Support/com.mitchellh.ghostty/config` now reads: ```toml theme = "Argonaut" # vibrant, readable palette font-family = "Berkeley Mono" macos-titlebar-style = "tabs" minimum-contrast = 2 # lifts dim ANSI colours cursor-style = "block" cursor-style-blink = true # slight animation helps locate caret cursor-color = "#FFFF00" # bright yellow shell-integration-features = "no-title,no-cursor" split-divider-color = "#444444" # visible yet subtle ``` Key extras: - Horizontal split ⌘D, vertical split ⌘⇧D (custom key‑bindings). - config is symlinked into my dotfiles repo for version control. ### 1.2  Fonts & Prompt — minimal prompt, rich tab titles - **Berkeley Mono** (US $75). I tried patching it with nerd fonts, but that failed for reasons that even o3 wasn't able to figure out. So I wound up abandoning that approach in favor of the much more minimalistic prompt approach that I detailed later in this document. - **Starship** is tuned to display _only_ a coloured arrow; everything else—working directory, Git branch, remote host—moves to the tab title so the prompt itself stays one character wide. ```bash brew install starship ``` ```toml # ~/.config/starship.toml add_newline = false # no leading blank line format = "$character" # one glyph only [character] success_symbol = "[➜](green)" error_symbol = "[➜](red)" [directory] disabled = true [git_branch] disabled = true [git_status] disabled = true [hostname] disabled = true ``` **Tab title helper (`~/.zshrc`)** ```zsh function _set_tab_title { local dir="${PWD/#$HOME/~}" local branch="" if command -v git &>/dev/null; then branch=$(git symbolic-ref --quiet --short HEAD 2>/dev/null) || true [[ -z $branch ]] && branch=$(git describe --tags --exact-match 2>/dev/null) || true [[ -z $branch ]] && branch=$(git rev-parse --short HEAD 2>/dev/null) || true fi local host="" [[ -n $SSH_CONNECTION ]] && host="$USER@$HOST" local title="$dir" [[ -n $branch ]] && title+=" · $branch" [[ -n $host ]] && title+=" · $host" print -Pn "\e]0;$title\a" } precmd_functions+=(_set_tab_title) # Load Starship last so the arrow prompt appears after the title update eval "$(starship init zsh)" ``` With Starship reduced to a single symbol and context relocated to the macOS tab strip, the terminal stays readable while you still know _where_ and _on what branch_ you are at a glance. ### 1.3  Zsh Framework & Eye‑Candy  Zsh Framework & Eye‑Candy - **Zim** with only `git`, `history`, `input`, `completion`, and `prompt` modules. - **fastfetch** & **btop** for system‑info screenshots. - Key‑repeat bug in VS Code Vim fixed via ```bash defaults write -g ApplePressAndHoldEnabled -bool false ``` (requires logout). ### 1.4  File‑type Associations `duti` makes VS Code the editor for extension‑less files: ```bash brew install duti duti -s com.microsoft.VSCode public.data all ``` This was an especially painful thing when configuring Ghosty because its config file doesn't have a file extension. ## 2  Input, Shortcuts & Windowing ### 2.1  Karabiner‑Elements — making macOS feel like Windows (when it should) ```bash brew install --cask karabiner-elements ``` #### Global philosophy > _“Make macOS feel like Windows everywhere **except** inside terminals, remote desktops, or any place where `Ctrl` already matters.”_ A single JSON [profile](https://gist.github.com/jflam/e7b17f16a2d71f50f669ce7d03222614) expresses that rule of thumb. Every complex‑mod converts a Windows‑muscle‑memory **Ctrl+…**chord into its macOS **⌘‑…** twin _unless_ the front‑most app is a shell, VM, RDP window, X11 server, or another explicitly exempted bundle. - **Caps Lock → Control** is applied twice (once global, once per‑device) so the change survives Bluetooth glitches. - Each physical keyboard is identified so per‑device swaps (e.g., Logitech **Option ↔ Command**) feel native. #### 2.1.1  Editing & clipboard shortcuts - **Ctrl C / V / X → ⌘ C / V / X** - **Ctrl Z / Y / A / S / N → ⌘ equivalents** - **Ctrl B / I → ⌘ B / I** (bold / italic) - **Exception list:** Warp, iTerm2, Terminal, Ghostty, VS Code, all VM/RDP clients. Inside those apps, the original `Ctrl` semantics (readline, tmux, etc.) are preserved. #### 2.1.2  App‑specific helpers - **Obsidian:** `Ctrl P/O` → ⌘ P/O. - **Outlook:** `Ctrl R` → Reply; `Ctrl⇧R` → Reply‑All; `Ctrl Enter` → Send; `Ctrl Home/End` → jump list. - **Browsers:** `Ctrl L` focuses URL bar; `Ctrl R / F5` reloads. - **Finder:** `Return` opens (⌘ O); `F2` renames; `Forward‑Delete` moves to Trash; `Backspace` goes up a folder. #### 2.1.3  Navigation & text movement - Word‑wise: `Ctrl ←/→` (+⇧) → ⌥ ←/→ (+⇧) - Line‑wise: `Home/End` (+⇧) → ⌘ ←/→ (+⇧) - File‑wise: `Ctrl Home/End` (+⇧) → ⌘ ↑/↓ (+⇧) - Plain arrows: `Ctrl ↑/↓` collapse to regular arrows (for Excel‑style navigation) All of the above are silenced in terminals/VMs so readline shortcuts live on. #### 2.1.4  System & window management - `Ctrl Esc` launches **Launchpad**; `Ctrl⇧Esc` pops **Activity Monitor**. - `Alt F4` quits the frontmost app (⌘ Q) **unless** that window is an RDP/VM shell—safety first. - `Ctrl T / K / F` map to new‑tab, insert‑link, and find‑in‑page respectively, again with the usual exclusions. #### 2.1.5  Mouse trick - `Ctrl + Left‑click` is rewritten to ⌘‑click so multi‑select in Finder feels Windows‑natural without finger yoga. #### 2.1.6  Device‑specific simple mods - **Built‑in keyboard:** Caps → Control. - **Logitech K380:** swap Left Option ↔ Left Command. - **Logitech MX Keys Mini / Mechanical:** inverse swap so the physical ⌘ key hits macOS’s Option and vice‑versa. Karabiner marks each of those keyboards as “built‑in” so the swaps apply immediately on Bluetooth wake. #### 2.1.7  Fn‑row overrides & virtual HID - Only **F5** is remapped (mutes audio). F3/F4 keep Mission Control/Launchpad. - Karabiner’s virtual HID declares an **ANSI** layout so key‑codes line up predictably regardless of board. > The entire profile lives at `~/.config/karabiner/karabiner.json` and is version‑controlled alongside dotfiles. ### 2.2  Raycast (Spotlight replacement)  - Global hotkey ⌘Space (Spotlight disabled in System Settings). - Quicklink _Downloads_ opens `~/Downloads` instantly - Calculator feature is used all the time - I don't use any of the AI features ### 2.3  AltTab - **AltTab** shows icons‑only and excludes AlDente, OneDrive and other annoying things in the task switcher ### 2.4  Mouse & Spaces - **Mac Mouse Fix** reverses Logitech wheel scroll to match natural track‑pad scrolling. Super annoying to have these in the same direction. - **Hammerspoon** script maps mouse side buttons to _Mission Control_ spaces (⌃←/→) and browser back/forward. I find I still use my keyboard shortcut ^⌘[ and ^⌘] more commonly --- ## 3  Power & Menu‑Bar Hygiene ### 3.1  AlDente Pro Charge capped at 70 %, heat protection @ 95 °F, Sailing Mode ON. Stock battery icon hidden. ### 3.2  Stats + ItsyCal + Ice - **Stats** modules: CPU %, GPU %, Die watts, Net up/down, and a 24‑hour `HH:mm` clock. - **ItsyCal** drops down a month view (`EEE d` format). - **Ice** collapses _CPU · GPU · Sensors · Network · Wi‑Fi · AlDente · ItsyCal · Stats‑Clock_ into one snowflake. System digital clock can’t be removed, so I switch it to **Analog** to avoid duplication. --- ## 4  Core Apps & Utilities - **1Password** - **TalkTastic** dictation (trial while I locate Better Dictation licence) - **OneDrive** for work SharePoint - **Obsidian** local vault under Git - **Microsoft Edge** (corporate sites need Chromium) - **Company Portal** (Intune compliance) - **Docker Desktop** - **DaisyDisk** disk visualiser - **Ghostty**, **Stats**, **ItsyCal**, **Ice**, **AltTab**, **Mac Mouse Fix** (see sections above) --- ## 5  Development Environment ```bash # Git newer than Apple’s brew install git # Node via NVM curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | zsh nvm install --lts # Rust tool‑chain & clip helper curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # build clip (it isn’t on crates.io) git clone https://github.com/jflam/clip.git ~/src/clip cargo install --path ~/src/clip --locked # installs into ~/.cargo/bin ``` **About uv:** Astral’s _uv_ is a Rust‑fast replacement for _pip_, _virtualenv_, and _pip‑tools_ in one binary. Running `uv tool install <pkg>` builds a slim virtual environment under `~/.local/share/uv/tools/` and shims the executable onto your `PATH`; each CLI lives in its own fully‑pinned environment, isolated from project venvs and system Python. The sibling command `uvx` lets you run a tool once without persisting it. Upgrading or removing a tool simply swaps or deletes that dedicated env, so no global‑site‑packages cruft ever leaks. ([docs.astral.sh](https://docs.astral.sh/uv/concepts/tools/?utm_source=chatgpt.com), [docs.astral.sh](https://docs.astral.sh/uv/guides/tools/?utm_source=chatgpt.com)) **clip utility:**  _clip_ (GitHub `jflam/clip`) is a tiny Rust CLI that turns the system clipboard into a two‑way filesystem pipe. By default it copies the concatenated contents of any glob (`clip **/*.py`) into the clipboard—perfect for pasting code into chat or AI prompts. The reverse works too: `clip -o notes.md` saves whatever text or image is on the clipboard to a file, auto‑detecting MIME types. Under the hood, macOS uses NSPasteboard calls, while Windows falls back to the `Clip`API; on Linux Wayland/X11, it shells out to `wl-copy`/`xclip` when available. Two flags cover 90 % of needs: `-a` appends to an existing file, and `-q` runs quietly so it chains cleanly in scripts. ([github.com](https://github.com/jflam/clip?utm_source=chatgpt.com)) --- ## 6  Misc macOS Tweaks  Misc macOS Tweaks - **Hide autocorrect:** System Settings ▸ Keyboard ▸ Text → un‑check _Correct spelling automatically_. - **Default editor for Ghostty config** opens in VS Code (see `duti` above). - **Analog menu‑bar clock** set in Control Centre. ---