Home office setup

I recently ended a four (plus) year stint at a geographically distributed, all-remote, async-first startup, and began a similar remote role at another slightly earlier stage SF-based startup. I took the two weeks between jobs to tidy up my home office to clean my mental slate. It’s like cleaning your dorm between terms: new semester, new me.

I snapped a few pictures to immortalize the absence of dust and clutter on my desk and was reminded of an old Sourcegraph blog post from 2020 where the entire company (which was very small at the time) shared their home office setup. I felt it was time to post a personal update.

Room setup

The desk is a Renew Sit-to-Stand Table from Herman Miller, shown at a level comfortable to be used with the ErgoChair Pro from Autonomous (with Evergreen fabric). I’ve previously had Herman Miller Aerons (stool and chair form factors over the years), but have come to prefer the Autonomous chairs as the cushioned front allows me to sit cross-legged on occasion. Aeron chairs have a hard plastic lip that made sitting in that position uncomfortable.

Also pictured on the bookshelf is the requisite Art of Computer Programming Box Set (Note: I have actually read Volume 4 to implement efficient arbitrary precision integer arithmetic for a passion compiler project a few years ago, thank you very much). There’s also a completely unnecessary figurine of Dat Boi, which my wife has demanded I move from the living room mantel.

I’ll describe the laptops, monitor, keyboard and mouse inputs, and camera in more detail below because, in a similar spirit to to how most programmers feel about their tools, I’ve got a lot of opinions about them.

As for the rest of what’s pictured, I’ve got a Streaky Black Desk Pad from Konah Home to designate the “active workspace area” (the same way one uses an area rug in a large room) and to keep mouse movements comfortable. I use a CyberPower UPS as a surge protector as well as a battery backup that can keep my peripherals powered for a short period of time during (infrequent) power outages. A vertical laptop stand holder holds two laptops (used in clamshell mode) and takes up very little desk real estate.

I use a pair of wired Bose QuietComfort 35 with a perpetually drained battery during work and hang them off a headphone holder mounted on my desk when not in use. I also have a pair of open-ear and non-noise-cancelling Sennheiser HD 650 when I play piano (not pictured, but to the left of the desk).

I keep things fairly tidy by buying cables that are waaaay too long, routing them down monitor arms, wrapping them in cable sleeves and other assortments of velcro straps (but not zip ties, which are a pain when you need to ultimately add or remove a cable from your run), then stuffing the remaining extra cable slack into a cable management box.

Lastly, a Baseus Desk Fan mounted on the top of my monitor and pointed directly at my face has made the summers a bit more comfortable as my office runs slightly hotter than the rest of the house.

Machines

I’m currently in possession of two 16-inch MacBook Pros:

  • An M1 Max 64 GB from 2021 that I’ve purchased from Sourcegraph as a personal machine; and
  • An M2 Max 32 GB from 2023 more recently supplied by Render.

Both machines are setup almost identically via shared dotfiles, although the Render machine has a few additional utilities such as Tailscale that allows connection to certain sensitive services. I was originally hoping Render would supply a 64GB or 96GB machine, but I haven’t actually felt any issue with 32GB in the past three months. The control plane software we’re building runs in a personal development cluster on GCP/AWS, so there’s no massive local application pressure.

Mounted below the desk is a Windows machine with an AMD Ryzen 5 3600 6-Core in a NZXT H200i (Mini-ITX) used exclusively for Steam. This is likely an outdated build at this point, but it works well enough for leisure.

Display

My display preferences have evolved over time, adapting to the type of machine (mostly determined by the operating system).

My home setup during university (left) was a windows machine attached to a Dell UltraSharp 30" Monitor and two 21" monitors in portrait mode on either side. This gave me my first rudimentary “zoned” workflow:

  1. The left monitor was used for chat applications and music streaming;
  2. The center monitor was the main “focus area”, usually containing an IDE; and
  3. The right monitor was reserved for a full-screen browser, which was visible as a reference without using any screen real estate of the main focus area.

The following iteration of my home setup (right), which later became my work-from-home setup for the first half of my tenure at Sourcegraph, was a 27" iMac (a 4.0GHz quad-core Intel i7; 16GB RAM) and two Dell Ultrasharp 27" 4K monitors in portrait mode on either side. Because the portrait monitors had much more available vertical space, zone preferences were also adapted. In the picture, you can see a smaller Spotify window on top of a browser window only taking the lower two thirds of the screen. Having some previous experience with the i3 tiling window manager on Linux, I began to use Divvy for comparable tiling functionality on MacOS.

At some point, I upgraded the machine to a similarly sized iMac Pro (3.2GHz 8-core Intel Xenon W; 32GB RAM) which was sick as hell. When I joined Sourcegraph I declined a company-supplied machine so I could continue to use my home setup. Unfortunately for me, Sourcegraph security concerns evolved to the point where remote device management became a necessity for all employees.

The change from a 27" to a 16" display for the main focus area demanded a new choice in peripherals. At the recommendation of a co-worker, I chose a Samsung 49" Odyssety G9 mounted on a Ergotron Heavy Duty Monitor Arm to maximize usable desk space. The change from a gorgeous 5K retina display to a monitor where individual pixels were visible again was an initial shock, but didn’t spark any long-lasting regrets.

Having a single monitor with such massive width made me appreciate adopting Divvy, as it’s no longer feasible to maximize a window within the bounds of one of several monitors. So, once again, my zone preferences adapted to the available hardware.

The applications I frequently run fall into one of two overlapping zone sets:

  • The main zone (left) is used for deep work and includes, from left-to-right, a browser, an IDE, and a terminal; and
  • The secondary zone (right) is used mainly for communication and includes, from left-to-right, Slack (or Spotify), and social applications (Signal, Discord, WhatsApp, and Messages).

Keyboard

I used to have a pair of CODE mechanical keyboard (one for work, one for home) before transition to a Ergodox EZ with Cherry MX Blue switches. The transition to an ortholinear keyboard (which uses a uniform grid instead of an offset one) was a bit rough. My typing speed (which was recently recorded at a peak of 168 WPM) dropped for a two-week span until I re-learned precisely where all the key centers were in the new layout. For some reason I was unable to hit the “y” key with any accuracy at first.

The Ergodox layout is completely customizable, and took quite a bit of iteration to get to something stable that I was effective and comfortable with. Although I didn’t do anything crazy like adopt a non-QWERTY layout, I did highly customize modifier keys and code navigation hotkeys. My current layout looks like the following, over three layers:

Mouse

Although the keyboard is the input device more closely tied to my personality and self-worth (like most developers that don’t have enough non-coding hobbies), I have also been recently and pleasantly surprised by the feel of the Logitech MX Master 3S. Maybe one day I’ll switch from VSCode to Neovim and abandon the mouse entirely; or maybe I’ll try out a vertical mouse at the suggestion of a co-worker just to see how it feels.

Camera

When I traded in my iMac for a laptop in clamshell mode, I lost a built-in webcam. Instead of opting for a USB webcam mounted atop my monitor, I decided to use the majority of my untapped desk budget at Sourcegraph to help purchase a mirrorless camera. Having experience with specific Canon products in film school, I decided to honor a brand that worked well for me. I initially chose a Canon EOS R as the base product, and decided to build from there.

To gather an list of the accessories I’d need to set up this Rube Goldberg machine successfully, I initially followed Quinn Slack’s guide on how he achieved similar high-resolution video calls. Here’s what I ended up needing:

Maybe in the future I’ll get a stronger zoom lens, as the current one is a bit limited: