By Patrick Griffith on January 21, 2016

How to Start a WordPress Blog and Be Super Nerdy About It

All Articles how to start a wordpress blog

Reviews are a crutch for me. Buying a bag of coffee without reading all of the reviews on all of the top 10 coffee beans first? Never gonna’ happen. So when starting a blog, hastily picking a hosting company and a template is not an option. Analness about everything is required.

Here’s more or less the complete process I went through to start this blog, just in case you’re thinking about starting your own blog and you too are a finicky snob.

Prior to Starting

I had no intention of starting a blog. I had a couple of things to say so I wrote and submitted a guest post to a fairly prominent minimalist blog. It wasn’t accepted. So fair warning here, readers: I’m not that good of a writer.

After that unaccepted post I started thinking about how much fun the writing process was, how much I learned about myself in said process (the kind of stuff that you already “know” but just never think about) and that I have many more things to say that could theoretically benefit at least one or two people.

Anthony Ongaro of Break The Twitch conversed with me privately on Twitter and was mega encouraging about the whole thing. Anthony never outright told me to start a blog, but that’s what I wanted to hear so that’s what I took away from the conversation.

So then I toyed with the idea for a while. Definitely not committed to starting a blog, but certainly intrigued by the idea. And I started gobbling up some resources to help figure things out. A couple of my faves:

  • Episodes 1, 2, 73, 74, 90 and 98 of The Fizzle Show podcast for the purpose of starting this blog. The remaining episodes for the purposes of that podcast being awesome.
  • Pretty much every blog post on Fizzle’s Best Of section. I swear nobody is paying me to say this, and I don’t even know anybody at Fizzle personally, but holy fucking balls the free content on that site is amazing! I am trying not to spend much money on this blog which, if it ever makes money at all, will be my tertiary income. But Fizzle is so awesome that it makes me want to change my mind.
  • HOW TO START A SUCCESSFUL BLOG TODAY by The Minimalists. Their “How To” section wasn’t for me (more on that later) but the “reasons you should blog” and “recommendations for your blog” sections were inspiring.

Choosing a Domain Name

Tough task. Almost infinite possibilities. And likely any time you get an “AH HA” moment with the perfect domain name it’s going to already be taken.

I decided to consider three categories of domain names.

  1. Name-based. eg or Unfortunately the closest thing available to my name is (which I happen to already own). This category has the advantage of being able to write about whatever I want. It has the disadvantage of visitors not being able to see a clear focus from the domain name.
  2. Topic-based. eg or Advantage of quickly conveying to readers what the site is about. Disadvantage is that I’d pretty much always have to write on topic, and it would be tough to change my vision down the line.
  3. A combination of the two. This is the route I went, with It doesn’t convey the topic as strongly as a purely topic-based domain name would, but it’s a start. And it’s not as “professional” – or whatever – as my full name might be. But hopefully it has a good combination of personality and topicality and flexibility. Now if I want to write the occasional post about web design then it still fits.

Best domain name ever? No. But I’m happy enough with it.

After finalizing my domain choice I used Namechk to help lockdown PatOnPurpose on a bunch of different social media platforms. I have no intentions of using most of those outlets, but figure it’s best to have the names just in case. Yeah, I know that “just in case” is supposed to be the least minimalist phrase in history, but c’mon.

Registrar, Platform and Hosting

I register all of my domains with iwantmyname, the most minimalist domain registrar I’ve ever seen. They’re not trying to constantly upsell you on hosting services or email services, or trying to get you to buy t-shirts. You go on the site. You register your domain name. Done.

Built on WordPress. Because of course it is. Because WordPress’s intersection of ease and customization is truly unrivaled. I get that sites like Squarespace are freaking awesome for people who just want to set it and forget it. But if you’re a tweaker go with WordPress.

For hosting I initially signed up with Bluehost because every “how to start a blog” post that I read recommended them. Wow, what a nightmare.

  1. I use CloudFlare on all of my websites, and it seemed as if there was no way to use your own external CloudFlare account (and all of its accompanying goodies like Flexible SSL) with Bluehost. And not to be a conspiracy theorist or anything, but it seems like this could have been by design. Using my external CloudFlare Pro account costs me $5/mo per domain, and includes free SSL. If I were to go with the embedded Bluehost CloudFlare option + SSL + Private IP it would have been somewhere in the range of an extra $24/mo. They give you $6/mo hosting (for the multi-domain account) and then nickel and dime the shit out of you for extras.
  2. I had perhaps the least helpful live chat session in my Internet life when trying to talk to somebody about the first problem. The person on the other end of the screen was not a native English speaker, and had no clue what CloudFlare was (it’s a pretty big deal in the website world). And to add insult, he kept pulling the “is there anything else I can help you with today?” after each of his responses. So either he genuinely thought he had solved my problem or he was just being a dick.
  3. They charged me for three years of hosting up front. $200+. This one is maybe a bit picky because I’m sure that this was specified somewhere – maybe even front and center – but it alluded my eyeballs and so I wasn’t expecting it.
  4. In order to cancel your account you have to either get on a call or live chat with them. I chose live chat. It took just under two hours of wait time until I was connected with a representative.

In summary: Bluehost is one of those things where it’s super easy if you do everything exactly how they want you to do it, but if you stray a little bit from that plan it’s a huge pain in the ass. I’m not trying to say that you absolutely shouldn’t consider them; just that if you know what you’re doing then there are far better options.

I ended up going with Linode. You’ll have to be moderately technically savvy to pull it off, but there are step by step tutorials on everything you need to do to set up your server. $10/mo for a way better service that, if needed, could handle a ton of blogs and a ton of traffic (so long as you’re caching your content). Yes, it takes a little more time for a basic setup. But a customized setup ends up taking way less time. Because it’s your own virtual server and you can just do whatever you want with it. I didn’t make the choice for the savings, but I’m saving about $15/mo by using Linode + CloudFlare instead of Bluehost.

Site Design

I wanted a design that made the reader focus almost exclusively on the articles, and for those articles to be extremely easy to read. And so I focused on having the most user-friendly, intuitive site I could think of, not caring about pizazz. eg blue links, purple visited links, large-ish fonts, minimal distractions, no ads, etc. The “minimalist design” that resulted is simply a product of those desires. I never approached it like “my site is going to be so minimalist, bro!”


A custom theme I made based on HTML5 Blank WordPress Theme by Todd Motto. That template theme is awesome as a starting point.

Font Choice

After trying a ton of different fonts, I ended up going with Verdana for the whole site. In the modern web age where Proxima Nova, Open Sans, and thousands of other beautiful fonts are available to me, of course I go with a boring-ass system font. Not the most elegant font in the world, but when paired with proper line heights, proper font size and a proper number of characters per line, it’s extremely readable. How to Tune Typography Based on Characters Per Line by @pearsonified gives a very thorough rundown of all that stuff. And using a system font lets me get a huge boost in performance as well as avoiding the dreaded Flash of Unstyled Text; the rest of the site is insanely fast, so I didn’t want to be waiting on the fonts.

Font Update: I’m now using PT Serif for the body, PT Sans for side notes and PT Sans Caption for the H1.

My initial reason for not going with custom fonts was speed. And speed was a huge concern in my implementation. Here’s how I was able to keep my site scorching fast and still use custom fonts:

  1. I ran each font through Font Squirrel and used custom subsetting to only include the glyphs I need. I won’t be writing in Spanish, for example, so I don’t need all the characters with tildes and accents. That saved a lot.
  2. There are five total custom fonts being loaded (including the different weights and styles). Three I consider critical and are loaded initially. The other two are non-critical, and are loaded asynchronously with JavaScript. That’s a 40% reduction in critical rendering size right there.
  3. I implemented a technique invented by filament group to gracefully handle font loading without blocking the critical rendering path. This technique currently doesn’t work with Safari, but that’s not all bad because Safari (and devices with Safari) generally has some gorgeous font rendering.
  4. I use cookies to remember whether or not the fonts have been loaded, so there is no flash of unstyled text on a reader’s subsequent visits.

And with all that, I was able to keep my 99/100 PageSpeed Insights score.


No Comments

Mainly because I don’t feel like moderating comments. Also because for the first year or two of this blog I’ll probably have little to no comments, which would serve as negative social proof. Those are just two of the many arguments against comments as outlined by Matt Gemmell.

No Social Share Buttons

Sam Solomon is done with social media buttons. So am I. The comment concern regarding negative social proof applies here as well.

If readers are too lazy to copy and paste the URL, and write a few words about your content, then it is not because you lack these magical buttons.

Oliver Reichenstein of Information Architects

No Contact Form

My email address is on the bottom of every post. For anybody who has a deep desire to get in touch with me that’s probably plenty. For people who only have a shallow desire to contact me – like the fine folks who offer their SEO services every day – anything beyond a simple contact form generally turns them away.

WordPress Plugins

These are the plugins I’m using. In alphabetical order, not order of importance.

  • Async Javascript by Dave Clough – to async the javascript, naturally.
  • Autoptimize – used mainly as an easy way to render all of my CSS in the head of the document. Because my CSS file is only 7KB and it’s not worth blocking rendering for that.
  • CloudFlare – makes interaction with my CloudFlare account a lot smoother.
  • Google XML Sitemaps by Arne Brachhold – to appease the search gods. Are sitemaps still a thing? I don’t even know anymore.
  • RS FeedBurner by Scott Allen – so people can subscribe through Google’s FeedBurner service if they so desire.
  • WP Meta SEO by JoomUnited – because the mega popular SEO plugins are too feature-packed and too clunky.
  • ZenCache – because there’s no reason your server should have to recreate – on every single visit – a bunch of pages that almost never change. Blogs should be served up as static HTML files. Ridiculously huge speed improvements.
  • Not a plugin, but I also signed up for and installed MailChimp.

Google Analytics Customization

If you’re starting a blog you probably want to write articles that people like. In order to do that, you need to collect data so you can see what people are consuming and what they’re not. And if you’re going to collect and rely on data, you sure as shit better spend a few minutes and make sure that that data is as clean as possible.

  1. I followed these Google Analytics best practices, most notably:
    • Created a backup, raw, unfiltered view just in case I break anything.
    • Created a filter to excluded traffic from all of my IPs.
  2. I followed this guide to make sure I get as little spam data as possible, most notably:
    • Created a filter to only include traffic from hostname
    • Created two Analytics properties and only used the second, that way my tracking id ends in “-2” instead of “-1”, which gets rid of the bulk of Ghost Referral Spam.
    • Created a campaign source filter to exclude a list of known spammy referral sources.
  3. I prevented the Google Analytics code from showing up when I’m logged in. Granted, the IP exclusion above should take care of most of this, but this is still a good practice for when my IP changes or for when I visit a coffee shop. So the tracking code in my footer looks like this:
    <?php if (!is_super_admin()) { ?>
      <!-- analytics code here -->
    <?php } ?>
  4. I implemented my own version of adjusted bounce rate. Because, especially on a blog, traditional bounce rate is a really dangerous metric to be using. Some people will come to your article via search, read the entire 12-minute article, and then leave. You probably don’t want to be counting those people as bounces. So I wrote a short jQuery snippet to make sure that any reader who spends at least 15 seconds on the page and scrolls at least 25% down the page does not count as a bounce. Here’s the code for that:
    var minimum_scroll_percentage = 0.25;
    var minimum_visit_duration = 15000;
    var recheck_frequency = 500;
    function send_engagement_event(){
      var top_of_window = $(window).scrollTop();
      var document_height = $(document).height();
      var window_height = $(window).height();
      if  ((top_of_window/(document_height-window_height)) > minimum_scroll_percentage) {
          //if I'm logged in then I don't have tracking isntalled. And I don't want the rest of the JS on the page to break because of this.
          ga('send', 'event', 'Engagement', Math.round(minimum_visit_duration / 1000) + ' seconds + ' + (minimum_scroll_percentage * 100) + '% Scroll');  
        eligible_to_send_engagement_event = false;

And those’re the basics of my setup.

YOU On Purpose

Get my most intentional thoughts in your inbox every Thursday morning by subscribing to YOU On Purpose, my super duper awesome newsletter that's all about unleashing your awesomeness. And look forward to a fun little challenge at the end of each email.

Get one email every Thursday morning. Never any spam.