Category: Work

Home Office Setup

In March of 2020, I finally started putting together my home office. I’ve been working from home since 2013, but for various reasons, I never put that much thought into a home office until the beginning of the COVID-19 pandemic.

A lot of this was purchased through a home office allowance that Automattic graciously provides. I’m lucky to work for a company that has always been fully distributed and understands the value of ensuring everyone has a good workspace. I know home office setups weren’t everyone’s top priority a year and a half ago.


The desk is an UPLIFT V2 with a 60″x30″ Rubberwood top. I previously had a much smaller desk with a manual crank. The manual crank was actually fine but I wanted something that was big enough for two monitors and a lamp, at least. The extra space helps it feel less cluttered, which is important for my ability to concentrate.

Desk Chair

The chair is a Herman Miller Mirra 2. I’ve had this one for over 8 years and it’s showing no signs of wearing out any time soon. I know this is a clichĂ©, but if anything is worth spending extra money on, it’s a good chair. Your back will thank you.


I love having a comfy armchair in my office. This was a March 2020 addition and I think it’s my favorite thing in here. (It’s definitely my dog’s favorite thing.) This is the IKEA STRANDMON. It’s the perfect place to meditate, catch up on some reading, or just find a slightly comfier place to work through a coding problem.


There are two monitors — an LG 27″ UltraFine 5K and a Dell U2417H.

The LG connects to my MacBook over USB-C, which also provides power. The Dell uses a DisplayPort to USB-C adapter. In an ideal world, I could daisy chain these monitors and just have one cable going to the MacBook. Unfortunately, the 5K version of the LG doesn’t support daisy-chaining. I added the Dell later on. It’s not high-DPI, so switching back and forth between the two displays can be a little jarring. In hindsight, I should have splurged for two 24″ 4K displays from the start.

Keyboard and Mouse

For input, I use the Apple Magic Mouse, Magic Keyboard, and Magic Trackpad combo. I had been using just the Magic Keyboard and Magic Trackpad for many years, but recently got the mouse as well. The consistency of having a Trackpad available regardless of whether I’m at my desk is nice, but I’m appreciating a mouse for the big screens. I know the Magic Mouse is a little controversial. I do a lot of navigating on the keyboard, so the ergonomics aren’t really a problem.

I’ve also tried the Keychron K2. It’s very fancy but just can’t get used to it. I really want to like it — every couple of months I take it out again. I think years of primarily using the MacBook keyboard make it easy to use the Apple keyboard compared to the slightly different layout of the K2.


Behind the desk is a shelf with Q Acoustics 3020i Bookshelf Speakers, a Sony STRDH190 Reciever, and a Fluance RT80 Record Player. I also have an old AirPort Express plugged into the receiver so I can stream music to the speakers over AirPlay. I have a small vinyl collection and I love listening to it while I work from time to time, but it isn’t exactly compatible with the blocks of uninterrupted time needed to solve complex programming problems.

I also have a pair of WordPress-branded Sony WH-1000XM4s that are great on a plane or when I need noise-canceling to help me concentrate.


There’s a Philips Hue Beyond lamp on the desk and another lamp in the corner with a Hue bulb. I’ve used Hue lights throughout the house for many years. With HomeKit’s Adaptive Lighting feature, they start out warm in the morning, transition to cooler colors in the middle of the day, and go back to warm colors at night. I don’t know how much this does to help with concentration, but it sounds nice.


  • A plant from Wildewood, a local plant shop in Madison.
  • A PUGG wall clock from IKEA.
  • A fantasy football trophy.
  • Prints with Andrew McMahon lyrics.
  • A Martin LX1E (not pictured) for when I’m stuck on a problem and it’s too cold or wet to take a walk.

Radio Milwaukee AppleScript

I’ve been listening to Radio Milwaukee a lot lately. They play it at a lot of my favorite coffee shops in Milwaukee that I haven’t been able to visit for a while.

I like to listen to music in the Music app (previously iTunes) because I have AirPlay speakers in my office and around the house. This script opens the Radio Milwaukee stream and hides the Music app.

tell application "Music" open location "" play set visible of every window to false end tell
Code language: AppleScript (applescript)

IPv6 PAC Support

If you’re not familiar with a Proxy Auto-Configuration (PAC) file, it’s a JavaScript function that determines whether web requests should be forwarded to a proxy server or not.

There’s a minimal set of JavaScript functions defined that you can use to conditionally send your web traffic through a proxy. One of those functions, isInNet(), returns true if an address (an IPv4 address) is included in a given network range. Unfortunately there are no functions in this standard set that provide similar support for IPv6 addresses.

There are many IPv6 parsing libraries on GitHub, but all of them depend on at least a few npm packages. I’m normally not one to complain about npm dependencies, but this is once instance where the dependency model is not really tenable.

Here I’ve put together a copy/pastable inIPv6Range() function that provides limited functionality for determining whether a given IPv6 address is in a predetermined range.

function expandIPv6( ipv6 ) { const parts = ipv6 .replace( '::', ':' ) .split( ':' ) .filter( p => !! p ); const zerofill = 8 - parts.length; // Fill in :: with missing zeros return ipv6 .replace( '::', `:${ '0:'.repeat( zerofill ) }` ) .replace( /:$/, '' ); } function parseIPv6( ipv6 ) { ipv6 = expandIPv6( ipv6 ); // Check is valid IPv6 address ipv6 = ipv6.split( ':' ); if ( ipv6.length !== 8 ) { return false; } const parts = []; ipv6.forEach( function( part ) { let bin = parseInt( part, 16 ).toString( 2 ); while ( bin.length < 16 ) { // left pad bin = '0' + bin; } parts.push( bin ); }); const bin = parts.join( '' ); return parseInt( bin, 2 ); } function inIPv6Range( ipv6, low = '::', high = 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' ) { ipv6 = parseIPv6( ipv6 ); low = parseIPv6( low ); high = parseIPv6( high ); if ( false === ipv6 || false === low || false === high ) { return false; } return ipv6 >= low && ipv6 <= high; }
Code language: JavaScript (javascript)

If you clean this up or add CIDR support, let me know!

Five Tips from Five Years of Remote Work

I’ve worked from home for a long time now. Forever, really — Automattic was my first real job after college. In a lot of ways, I work similarly to the way I did in college except that I go to a coffee shop instead of a library.

When I started working from home, I noticed people were very concerned that it would be too challenging. I’ve gotten used to the questions, and over the years, I’ve refined my answer to a handful of main points.

  1. Get out of the house most days. Whatever that looks like for you will depend on how you work best and how much you like to interact with other people. It could be going for a walk around the block, spending some time in a coffee shop, or spending the whole day in a co-working space.
  2. Try to follow a routine. Going back to the first point, it helps me to take a walk to a coffee shop every morning. The ten minute walk to the coffee shop is sort of like my commute and defines the start of my day. When you work from home, it’s easy to forget when it’s time to “go home” for the day. Having a routine to start and end the day helps with that.
  3. Take advantage of the flexibility. Like anything, working from home has pros and cons. One of the advantages is the flexibility you get, so use it! I try to get out of the house most days, but I also have the option to stay in if it’s particularly cold or there’s a blizzard and I don’t feel like walking through the snow.
  4. Set up a nice home office. I think a nice chair is a minimum requirement. Don’t cheap out here. It will pay for itself in chiropractor bills. I also like a desk that can convert to a standing desk. There are a lot of fancy automatic options, but I personally recommend saving some money and getting one with a manual crank. I need a nice monitor and noise canceling headphones. Again, do what works for you.
  5. Meet people outside work. Joining a co-working space can be a nice way to do this, but you could join a basketball league or organize a local Internet of Things meetup — whatever interests you. Joining a new company can be a big transition. Especially if you’ve just graduated and many of your friends are moving across the country.

I also like to make a distinction between distributed companies and remote workers. Automattic is a distributed company. Everyone works from home — or wherever they feel most productive. Sometimes people work from home, but in a company where most people are colocated in one or several offices.

The difference might not seem obvious at first, but I think it’s important because it can be a defining factor in how the rest of the company communicates with remote workers. Since we’re all distributed at Automattic, there’s no way to overlook someone who is remote. If most of your company is colocated, it helps to understand how the rest of the company thinks about communication.

Working from home is great. My colleagues sometimes say that they’ve broken me — remote work is all I know. I’m not sure if I could work in an office every day, but maybe someone else can write that blog post. 🙃

San Francisco Panoramas

Last week I was in San Francisco for a team meetup. I’ve been taking a ton a panoramas since I realized there’s an album dedicated to them in iOS. Here are a few.

Interestingly, this is the first time I’ve been to “the office” in almost a year and half.