Back on

If you’re seeing this, then my blog is back to being hosted on

The primary reason for this? I want to blog more often. The writing interface in is now much, much better than what you get in a standard WordPress install. Plus, there’s also something to be said about not having the mental overhead of site management every time you go to write a blog post.

This domain’s history: switched from 1&1 to WebFaction in June 2009, to Slicehost in May 2010, back to WebFaction in September 2010, to in November 2011to Digital Ocean in March 2014, and back to Webfaction in January 2015.

Thoughts on online conduct

The latest outrage within my sphere of the internet seems to be the PHP project’s proposed Code of Conduct (PHP internals threadreddit thread). My cursory opinion: I like the idea, and the language of this particular proposal seems a bit draconian. While the PHP CoC doesn’t directly impact me, this seems like a good opportunity to jot down some thoughts on online conduct.

I am a white, privileged male who grew up in an upper middle class family. I didn’t have to work in high school, and my college would’ve been completely paid for, had I chosen to complete it. I live in a comfortable house in well-developed suburbs, with easy access to many local services. I identify as fiscally conservative, socially progressive, and think politicians are a bunch of schmucks (so you could probably call me libertarian).

As someone of privilege, I try to refrain from discussing controversial topics on the web. All too often they devolve into a flame war, “a heated argument between two individuals, that results in those involved posting personal attacks on each other during or instead of debating the topic at hand.” But, as a maintainer of several open source projects and active contributor to many others, codes of conduct have a direct impact on my daily life.

I do believe in the golden rule, and do my best to treat others as I wish to be treated. I think communities, online and off, can benefit from explicitly stated expectations of behavior — even more so when leadership role models ideal conduct. I also understand it’s difficult to regulate away human behavior, and take an active concern with who holds the power to enforce rules. Power is a real thing. Lastly, I know that if a conversation turns into personal attacks, it can be effective to explicitly address emotions — “it hurts me when you say…” — because it brings empathy to the forefront.

Text-based communication, particularly as we practice it on the internet, is really hard. Let me say that again for emphasis: text-based communication is really hard. Merlin Mann and Dan Benjamin have a great podcast episode about emotional density, which conveys many of my thoughts on the subject. In short, text loses many of the voice intonation and body language nuances we humans actually use to communicate. Think about it this way: text is a medium where 2/3 of packets are lost in transmission. If we chose to collaborate on the web, this is a constraint we must acknowledge and embrace.

Be nice to others. Go out of your way to be helpful. And, if someone flames you, understand they might be operating a computer without their first cup of coffee for the day.

Verifying WordPress migrations

It seems like every time I do a migration with the WordPress importer, something about my data breaks. For instance, while writing my Year in Review post just now, I noticed last year’s post has an incorrect image:

2015-12-30 at 3.23 PM

The image should be the visualization.

It would be really neat if I could verify a migration with WP-CLI. Using the WXR file as the baseline, the command would iterate through all of the data in the file, compare it to what’s present in WordPress, and alert me if anything is missing or unexpectedly different.

Decisions, not options, in the WordPress Customizer

Earlier this month, I helped relaunch Pottery Barn’s blog. The homepage and each brand page (PBteen example) are moderately configurable through the WordPress Customizer. Building this functionality was an opportunity to make user-friendly decisions about the management experience.

Smarter Featured Gallery

2015-12-30 at 9.27 AM

By default, the topmost UI element on each homepage will display the most recent published post. In the Customizer, the Pottery Barn team can choose one or more posts for promotion with an AJAX post selection tool (plugin in-progress). If multiple posts are selected, then the UI element turns into a carousel (powered by Slick).

Look ma, no checkboxes!

Magical Pin Promotion

2015-12-30 at 9.39 AM

Further down the homepage, the Pottery Barn team wanted to promote their top Pins from Pinterest. Rather than create a more complicated workflow of uploading images and completing multiple fields per Pin, I decided to magically pull in Pin metadata from their Open Graph / Twitter Card tags.

Drop a link in — voila!

If you’re considering a similar approach, here are a few technical details I worked out:

  • Rather than make a number of on-going frontend HTTP requests, I decided to fetch the metadata when the links are saved, and store it in options.
  • Pinterest will block your IP address if it thinks you’re a bot. If your code mysteriously stops working, you might want to check the response.
  • Pinterest’s Twitter Card image source is better to work with than Facebook Open Graph because Pinterest forcefully crops the Open Graph image to a Facebook-friendly proportion. The Twitter Card image source appears to be the original proportion.

The pain of customizing WordPress themes

2015-12-15 at 9.06 AM

Choosing a WordPress theme from the Customizer is a bit painful.

First of all, “Search installed themes” doesn’t make sense as a string on a hosted WordPress service. As a user, I have no ability to install new themes. It could be edited to just “Search themes”

Second, as a user with a blog, I want to choose from themes that showcase my words. The first suggested theme appears to be a product portfolio, and the second suggested theme is for a restaurant website. I should be able to indicate I just want to see writing themes.

Third, the “371” indicator next to the “Customizing Themes” heading has no meaning whatsovever. 371 what? Is that power user UI?

Hello World

In the interest of blogging professionally, I’ve started a blog for my business, Hand Built. My blog’s description is “Perfect is the enemy of good enough”, because I’ve been meaning to write about work-related topics for a while and sometimes you just need to ?.

It was many painful steps to start this WordPress blog. Although I wanted to self-host, most managed WordPress hosts charge an arm and a leg (each month!) to use SSL. Hopefully, this changes in the future.

Categories are an annoying feature of WordPress, particularly because I’m forced to have a default category. Why do blogs need categories? What’s the difference between a category and a tag?

For now, because I’m OCD about feelings of completion, I’ve changed my default category to “Categorized”.

I hope you enjoy my new blog.