My Development Environment
A lot of us are slightly voyeuristic about others work environments. It’s fascinating way of finding new tools, features of existing ones that we may have overlooked, or even just getting a glimpse into how someone we admire does things. I rather enjoy reading sites such as uses this and workspaces.xyz; watching setup tours on YouTube, and reading developers uses pages. A particular shout out to the wonderful Dev Tool Time playlist from Sourcegraph which I've learnt a huge amount from (the episode with Mitchell Hashimoto I found particularly inspiring).
I've also had a few conversations recently where people have been interested in my setup and how I approach work, so I thought it would be interesting to document my development setup - if only to look back at it in the future and see how it evolves.
My overarching focus is to keep things as simple as possible; both from a UI perspective, and from the amount of tools I use. I tend to find myself either in the browser or terminal for everything I do (Slack and Zoom aside.)
For starters, I’ve been using Apple devices exclusively for the last 12 years and am fully invested, and happy, in the ecosystem. Currently I’m running a work issued M1 MacBook Air 16GB. It’s a really fantastic machine, and provides the portability when needed. However - I spend approx 90% of the time with it closed in clamshell mode, plugged into a single 27” Dell 4k monitor.
I like to keep things as clean and distraction free as possible. I hide the toolbar along the top, and the dock along the bottom - opting to show them on hover. I don’t have any icons on the desktop, although it is my destination of downloads, but they’re either deleted or filed away as soon as they’re dealt with.
For wallpaper, I again have a very minimalistic wallpaper - Crystal from the Aqueux collection by Hector Simpson.
With the basics things out of the way, lets move on to some of the structure..
The real key to my setup is using MacOS Spaces. Introduced to OS X 10.5 in 2009, I’ve been using them heavily since, and feel like they’re a hugely underused feature of MacOS. I typically use 5 spaces and have each of them designated for a specific purpose, allowing me to focus on that one main app when in that space:
- Slack & Messages
- Music or Overcast
Spaces are navigable via the keyboard, so it allows me to navigate between them quickly - moving easily between iTerm2 and Safari with a keyboard shortcut.
There are a couple of areas where I need more than what MacOS provides out of the box, the first of which is window management. For that, I use Moom with a bunch of custom layouts. The two I use most both centre the application horizontally and vertically, and set to approx 90% width and height of the screen size. The other approx 70% width of the screen. This means that I have a nice border around a single application entered on the screen - which works great for me and allows me to focus on one singular thing at a time.
Another area I need more than what MacOS gives us is a launcher. I use Alfred as I find it has a much cleaner interface than Spotlight, and more importantly allows me to launch scripts directly in the terminal from the launcher by using a prefix. I use it for launching all apps, and frequently even for switching between them.
This is a relatively new addition, and one I’m not 100% on yet, but is quite interesting to play with so far. Essentially, Quitter, by Marco Arment automatically quits apps if they haven’t been used for a predefined amount of time. For example, I have it set up to automatically quit Mail after 2 minutes of inactivity, and both Notes and Messages after 1 minute of inactivity.
I have found that it’s not completely reliable, and have had it occasionally quit whilst I’m in the middle of using the app that it's watching, but not enough for it to be a blocker to using it.
I switched to iTerm2 a few years ago and have kept with it ever since. To be honest I don’t have any huge reason for it, but it does have a few differences to the built in Terminal.app that I like - better text rendering, generally more configurable and allows me to hide the title bar.
I’m not sure I could work productively without Tmux anymore. I use it for every single programming project I work on, and at a minimum have two horizontal splits.
On top of Tmux, I use tmuxinator. It allows me to preconfigure Tmux to launch with specific windows, panes, and commands running within them. For example, I have one project set up to start with two windows - window 1 has two horizontally split panes, and window 2 has a single pane running the server, which is launched at opening.
Pair this with shell aliases and Alfred, I can run
> personal and it launches iTerm2 and runs the
personal alias, which is set to run the tmuxinator project for my
I’ll likely write something more about this in a bit more detail at a later date.
I've used Vim as my editor for at least 7 years now and I love it. There’s a definite learning curve, but it’s without doubt worth it! I made the switch over to NeoVim last year, and am enjoying the vibrant community and the fast pace of development it’s bringing.
I’ve recently switched to using asdf for my version management of runtimes. Having only been using it for a few months I don’t have anything negative to say about it - it just seems to work, although I haven't tried anything out of the ordinary with it.
I'm sure I'm missing things, and there are some things that I have just omitted (nobody needs to hear how I use Git like every other developer.) But I hope that it is at least interesting to someone!