Uses
This page describes the setup I use for development. I share it for fun, and I hope others can learn something from it. Almost everything on this page can be found in my dotfiles repository.
Editor & IDE
PhpStorm is my main editor for PHP development. I have used it for years, and my whole workflow is built around it. The IdeaVim plugin keeps my vim key mappings working, so all my vim habits carry over into the IDE.
When I only need to make a quick change, I use vim in the terminal. It is fast, simple and always available. I manage the plugins with Vundle. It includes everything I collected over the years: git support with vim-gitgutter, tag navigation with vim-gutentags and universal-ctags, PHP support, and useful small plugins like vim-surround and vim-commentary.
AI assistants
AI is now a normal part of my workflow. opencode runs in the terminal for AI-assisted development, Claude Code handles the more complex tasks, and Ollama runs models locally when I want to stay offline.
Terminal
Ghostty is my terminal. It is fast and looks good, and I use the Menlo for Powerline font at a comfortable size.
On zsh I run oh-my-zsh, loaded with Antigen and the agnoster theme. The autosuggestions and syntax highlighting plugins are very useful: commands appear before I have finished typing, and mistakes are highlighted immediately.
For longer tasks, tmux keeps my sessions open and organised. It starts automatically with zsh, I changed the prefix key to ยง, and the vim-tmux-navigator plugin lets me move between tmux panes and vim splits with the same ctrl+hjkl keys.
Appearance that follows the sun
tmux, vim and Ghostty all follow the appearance of macOS. When the system switches between light and dark mode, a LaunchAgent notices the change and applies the matching theme to tmux and Ghostty. Vim reads an environment variable that the tmux theme sets, so the whole setup switches together: the terminal, the editor and even this website with its own theme toggle. The dark and light scripts that make this work are in my dotfiles.
Version control
Git is the base of everything I do. I rebase my commits onto the main branch with autostash enabled, and rerere is on, so Git remembers how I solved a merge conflict. The histogram diff algorithm keeps the output readable, and I view my diffs in delta, which shows changes side by side with syntax highlighting.
Every commit I make is signed. My SSH key is stored in 1Password, which also acts as the SSH agent, so I do not have to manage separate keys.
Languages & runtimes
PHP is my main language, and I work with several versions of it: 7.4 for older projects, and 8.0 through 8.6 for newer ones. Homebrew installs and manages them, and a few small scripts switch between versions when a project needs one.
Besides PHP I use several other runtimes. I manage Node.js versions with nvm, and use Yarn and Bun for packages and quick scripts. Go is installed with Homebrew, and Python versions are managed with pyenv. For local data I mostly use MySQL 8.4, SQLite for light cases, and Docker Desktop when I need a full stack.
Infrastructure & cloud
Terraform is how I deploy infrastructure, including this website. Almost everything here runs on AWS: the S3 buckets, the CloudFront distributions and the DNS records are described in Terraform code, and tflint keeps the code in check. The AWS CLI is my way to work with the console.
Two small tools complete the setup: ngrok to expose local endpoints for testing webhooks, and mkcert to create trusted local HTTPS certificates.
Linters & quality tools
AI writes more and more code, so I rely on linters to keep it up to standard. They are stable: they do not change when models change. My pipelines run shellcheck, actionlint, editorconfig-checker, markdownlint-cli2, markdown-link-check and zizmor. I wrote about the linters in my dotfiles in A lot of linters.
Apps
1Password is the app I rely on most. It stores my passwords, keeps my SSH keys and signs my commits, so I only have to remember one master password. Rectangle keeps my windows in order with keyboard shortcuts, and Caffeine stops my Mac from sleeping during long uploads or builds.
I keep my notes and documentation in Notion. Chrome is my browser, and for messaging I use Signal and WhatsApp.
Hardware
I work on a MacBook Air with the M4 chip and 16 GB of RAM. It is quiet, portable and powerful enough for all my work. I wear AirPods for calls and meetings, and an Elgato Key Light Air lights my desk during calls and recordings.
Phone
On my iPhone 16, a few apps get most of my attention. The GitHub app keeps me up to date on issues and pull requests when I am away from the desk, and Feedly collects the blogs and newsletters I read. Organic Maps is my offline map for hiking trips, and Paprika keeps my recipes organised. Once in a while I solve a New York Times hard sudoku in Sudokupad.
Almost everything in this overview is set up through my public dotfiles repository. It contains a Brewfile that installs all the tools, the shell and editor configuration, the light and dark theme scripts, and a guide to set up a new Mac the same way.