All posts

Setup: What I Use

The
Desk .

The desk by the fireplace: an LG monitor on a wooden riser, a black keyboard with a yellow space bar and coiled yellow cable, and a mouse on a polka-dot desk mat

The editor, terminal and apps I use every day to build for Drupal, WordPress, Laravel, Nuxt and Astro.

Machine
MacBook Pro 16″ · M4 Max
Editor
VS Code · Dracula Pro
Terminal
Warp · Oh My Zsh
Last updated

(01) Toolchain

Pick a tool to see exactly how it's configured.

Editor — how it's set up

VS Code

A quiet editor: no minimap, no highlight noise, generous line height, and Prettier formatting on save.

  • Dracula Pro, with Alucard for light mode
  • JetBrains Mono 16 with ligatures
  • Project Manager pointed at ~/Sites
settings.json
"workbench.preferredDarkColorTheme": "Dracula Pro",
"workbench.iconTheme": "material-icon-theme",

"editor.fontFamily": "'JetBrains Mono', Menlo, monospace",
"editor.fontSize": 16,
"editor.fontLigatures": true,
"editor.lineHeight": 2,
"editor.tabSize": 2,
"editor.minimap.enabled": false,
"editor.renderLineHighlight": "none",
"editor.stickyScroll.enabled": true,
"editor.formatOnSave": true,

"projectManager.git.baseFolders": ["~/Sites"]

Terminal — how it's set up

Warp

Warp with the Dracula theme, set slightly transparent, and a prompt built from just the chips I actually look at.

  • Dracula theme
  • 55% window opacity
  • Prompt: directory, branch, dirty files, Node version
Warp's prompt in the McPasha.sh folder: chips for the directory, the main branch and Node v26.10.0, on the Dracula theme
Warp › Settings
theme       Dracula
font size   13
opacity     55%

prompt
  ├── remote login
  ├── working directory
  ├── git branch
  ├── git dirty files
  └── node version

Shell — how it's set up

Oh My Zsh

Oh My Zsh on the default robbyrussell theme, with autosuggestions, syntax highlighting and extra completions from Homebrew.

  • robbyrussell theme
  • Suggestions from history as I type
  • Commands colored as valid or not
.zshrc
ZSH_THEME="robbyrussell"

# installed with Homebrew
brew install zsh-autosuggestions \
             zsh-syntax-highlighting \
             zsh-completions

JavaScript — how it's set up

nvm + pnpm

nvm keeps the right Node version per project, and pnpm is the package manager on every JavaScript project.

  • Both installed with Homebrew
  • Node version per project
  • pnpm by default
~/Sites — zsh
brew install nvm pnpm

cd ~/Sites/[project]
nvm use
pnpm install
pnpm dev

Local sites — how it's set up

OrbStack

OrbStack runs Docker for every local site: one Compose file per project, up in a few seconds and easy on the battery.

  • Docker Compose per project
  • Projects live in ~/Sites
~/Sites — zsh
cd ~/Sites/[project]
docker compose up -d

PHP — how it's set up

PHP 8.1–8.5

Client sites span a few PHP versions, so they all live side by side through Homebrew. A small direnv helper puts the right one on the PATH as soon as I cd into a project.

  • 8.1 via shivammathur/php
  • One line of .envrc per project
  • Intelephense set to 8.4
~/.config/direnv/direnvrc
use_php() {
  local version="$1"
  local prefix
  prefix="$(brew --prefix "php@${version}" 2>/dev/null)"

  if [[ -z "$prefix" || ! -x "$prefix/bin/php" ]]; then
    log_error "php@${version} is not installed (brew install php@${version})"
    return 1
  fi

  PATH_add "$prefix/bin"
  PATH_add "$prefix/sbin"
  export PHP_VERSION="$version"
}

# then in each project's .envrc
use php 8.5

Version control — how it's set up

Git + gh

Git with main as the default branch and a compact, colored log graph on git lg. The GitHub CLI handles PRs.

  • main by default
  • git lg for a readable history
  • gh for pull requests
.gitconfig
[init]
  defaultBranch = main
[core]
  pager = less -F -X
[alias]
  lg = log --color --graph --abbrev-commit \
    --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'

Databases — how it's set up

TablePlus

One saved connection per environment, grouped by site, and a backup of each one before anything changes.

  • Grouped by client site
  • Local, stage and production side by side
  • Backup before every change
connections
[client-site]
├── local
├── stage
└── production

before any change:
  back up local
  back up stage
  back up production

AI — how it's set up

Claude Code

Claude Code sits in VS Code's bottom panel, beside the terminal, so the editor keeps the full width.

  • Claude Code in the panel
  • Editor keeps the full width
settings.json
"claudeCode.preferredLocation": "panel"

(02) Command line

The small tools I reach for dozens of times a day.

direnv
Per-project environment variables.
doggo
Readable DNS lookups for launches.
eza
A better ls, with git status.
gh
GitHub from the terminal.
wp-cli
WordPress from the command line.

(03) Apps

Everything else in the dock.

The
Rig .

Rig photo coming soon

What runs after the laptop closes — the build and the gear around it.

CPU
AMD Ryzen 7 5800X
GPU
NVIDIA RTX 3070
Memory
32 GB DDR4-3200
Last updated

(01) Current build

Every part in the case today.

CPU
AMD Ryzen 7 5800X
Graphics
NVIDIA GeForce RTX 3070
Motherboard
ROG Strix B550-F Gaming (Wi-Fi)
Memory
4 × 8 GB Corsair Vengeance LPX DDR4-3200 CL16
Storage
Samsung 970 EVO Plus 1 TB + Seagate 2 TB HDD
Cooling
NZXT Kraken Z73
Power
Corsair CX750M
Case
Lian Li O11 Dynamic

(02) Peripherals

Everything on the desk around it.

Monitor
ASUS TUF Gaming VG27V
Mouse
Logitech Pro X2
Keyboard
Mode Sonnet
Headset
SteelSeries Arctis Nova Elite