---
title: Ten Years of the Giant Robots Blog
teaser: 'Today marks 10 years of writing, editing, and publishing this blog, Giant
  Robots Smashing Into Other Giant Robots. Here''s a few things we did along the way
  to improve our happiness and the quality of the content.

  '
tags: analytics,automation,middleman,productivity,web
author:
- Dan Croak
- Joël Quenneville
- Gabe Berke-Williams
published_on: 2015-11-06
---

This blog,
[Giant Robots Smashing Into Other Giant Robots][blog],
is 10 years old today!

Let's look back and ponder.

[blog]: https://robots.thoughtbot.com

## The olden days

On November 6, 2005, the first two articles were posted to Giant Robots:
[The Correct Amount of Planning](https://thoughtbot.com/blog/the-correct-amount-of-planning)
and [Try Ruby!](https://thoughtbot.com/blog/try-ruby).

The first article was about keeping a mindset of moderation
and the second was an enthusiastic recommendation for what would become
one of our favorite programming languages.

thoughtbot was about 5-10 people
working above a futon store in Cambridge.
The team later moved to the 3rd floor of 41 Winter St,
the same building our Boston team is in today.

We ran <abbr title="OS X">FancyBSD</abbr> on fly white Apple laptops,
except [Mike](https://twitter.com/mikeburns),
who was running FreeBSD and convincing us Vim was cool.

![Mike, Dan, Joe, and Jason programming](https://images.thoughtbot.com/ten-years-of-the-giant-robots-blog/gWALWVlMRPW3uhG3QDJu_3352344178_bd462681c2.jpg)

The blog was run on [Mephisto](https://github.com/mephistorb/mephisto),
an open source blogging platform written in Ruby.
Perhaps we originally pulled the source from
[Rick Olsen's](https://github.com/technoweenie) classic
`svn.technoweenie.net` Subversion instance,
the home of many awesome early Ruby and Rails libraries.

Articles went quickly from someone's mind to their fingertips to
published on the blog,
sometimes followed the same day by an article advocating an opposing view.

The blog originally looked something like this:

![2005 blog](https://images.thoughtbot.com/ten-years-of-the-giant-robots-blog/NIvE6EayReawcfVO5vsu_2006-blog.png)

Classic articles in the 2005-2009 era included:

* [SwitchTower Gotchas](https://thoughtbot.com/blog/switchtower-gotchas)
  ("SwitchTower" was the original name of
  [Capistrano](http://capistranorb.com/))
* [What's the Deal with Rails' Polymorphic
  Associations](https://thoughtbot.com/blog/whats-the-deal-with-rails-polymorphic-associations)
* [bustin' out JOINs](https://thoughtbot.com/blog/bustin-out-joins)
* [NULLs. Can't Live with 'em Can't Live Without
  'em](https://thoughtbot.com/blog/nulls-cant-live-with-em-cant-live-without-em)
* [coding without ifs](https://thoughtbot.com/blog/coding-without-ifs)
* [ruby on fails](https://thoughtbot.com/blog/ruby-on-fails)
* [muck focking](https://thoughtbot.com/blog/muck-focking)
* [uno o dos](https://thoughtbot.com/blog/uno-o-dos)
* [Internbot Chronicles I](https://thoughtbot.com/blog/internbot-chronicles-i) by
  [Nick Quaranto](https://twitter.com/qrush),
  who would later go on to invent the term "fail whale",
  create [rubygems.org](https://rubygems.org),
  and tweet a lot about Phish couch tours.
* [When I Enter the Office, The Imperial March
  Plays](https://thoughtbot.com/blog/when-i-enter-the-office-the-imperial-march-plays)
* [Make Your Test Suite UNCOMFORTABLY
  FAST!](https://thoughtbot.com/blog/make-your-test-suite-uncomfortably-fast)
* [Mystery Guest](https://thoughtbot.com/blog/mystery-guest)
* [Spy vs. Spy](https://thoughtbot.com/blog/spy-vs-spy)

During this era,
the blog was the primary place where we announced
the release of open source libraries such as
[Paperclip](https://github.com/thoughtbot/paperclip),
[Shoulda](https://github.com/thoughtbot/shoulda),
[Factory Bot](https://github.com/thoughtbot/factory_bot), and
[Clearance](https://github.com/thoughtbot/clearance).

## The Tumblr era

The blog was on [Tumblr](https://tumblr.com) from August 2009-October 2013.
Our Tumblarity was high.

It looked something like this:

![2008 blog](https://images.thoughtbot.com/ten-years-of-the-giant-robots-blog/79aqXkVDQDOVkNvKl8P2_tumblr-blog.png)

Classic articles in this era included:

* [A Tmux Crash Course](https://thoughtbot.com/blog/a-tmux-crash-course),
  our all-time most viewed post
* [A Grand Piano For Your Violin](https://thoughtbot.com/blog/a-grand-piano-for-your-violin),
  which was about database indexes, obvi
* [Have You Ever... Faked It?](https://thoughtbot.com/blog/fake-it)
* [How Grep Got Its Name](https://thoughtbot.com/blog/how-grep-got-its-name)
* [thoughtbot and the Holy Grail](https://thoughtbot.com/blog/thoughtbot-and-the-holy-grail),
  where we began talking about our struggles to get JavaScript integration
  testing to work reliably
* [A safer apprenticeship than Johnny
  Tremain's](https://thoughtbot.com/blog/a-safer-apprenticeship-than-johnny-tremains),
  where we launched [apprentice.io](https://apprentice.io)
* [Controlling Color with Sass Color
  Functions](https://thoughtbot.com/blog/controlling-color-with-sass-color-functions),
  where we started falling in love with a CSS pre-processor
* [The Vim Learning Curve is a Myth](https://thoughtbot.com/blog/the-vim-learning-curve-is-a-myth)
* [Evaluating Alternative Decorator Implementations in
  Ruby](https://thoughtbot.com/blog/evaluating-alternative-decorator-implementations-in)
* [Remote Branch](https://thoughtbot.com/blog/remote-branch)
* [Types of Coupling](https://thoughtbot.com/blog/types-of-coupling)
* [Tell, Don't Ask](https://thoughtbot.com/blog/tell-dont-ask)
* [Four-Phase Test](https://thoughtbot.com/blog/four-phase-test)
* [Designing for iOS: Taming UIButton](https://thoughtbot.com/blog/designing-for-ios-taming-uibutton)
* [End-to-End Testing with RSpec Integration Tests and
  Capybara](https://thoughtbot.com/blog/rspec-integration-tests-with-capybara)
* [Sandi Metz' Rules For Developers](https://thoughtbot.com/blog/sandi-metz-rules-for-developers)
* [Running Specs From Vim](https://thoughtbot.com/blog/running-specs-from-vim)
* [How to Stub External Services in
  Tests](https://thoughtbot.com/blog/how-to-stub-external-services-in-tests)

During this era, we announced the release of open source libraries
[High Voltage](https://github.com/thoughtbot/high_voltage),
[Capybara Webkit](https://github.com/thoughtbot/capybara-webkit),
[Bourbon](https://github.com/thoughtbot/bourbon), and
[Griddler](https://github.com/thoughtbot/griddler).

We wrote a LOT about [Cucumber](https://cucumber.io/)
before moving our tests to RSpec and Capybara.

We announced on the blog
features to our products such as Hoptoad,
which would later be renamed [Airbrake](https://airbrake.io).
Those features included integration with the Lighthouse issue tracker,
then deploy tracking, then GitHub integration.

We began a tradition of writing [Thanksgiving thank you
articles](https://thoughtbot.com/blog/giving-thanks-2010).

We announced the opening of our [Stockholm](https://thoughtbot.com/stockholm),
[San Francisco](https://thoughtbot.com/san-francisco),
[Denver](https://thoughtbot.com/denver),
[Philadelphia](https://thoughtbot.com/philadelphia) and
[Raleigh](https://thoughtbot.com/raleigh) offices.

We didn't do much to promote the content except tweet about each article once.
We were publishing about 1-2 long-form articles/week.

We grew from about 10,000 readers/month to about 60,000 readers/month.

Some aspects that made Tumblr great for a business blog were:

* Simple team member access, each person has their own account
* Drafts of articles
* Schedule articles to be published at a certain time
* Ability to follow and be followed by other community members
* Ability to be featured by the platform

Some things that weren't working so well:

* The review process involved sharing a draft link in a chat room,
  making updates to the draft as chat comments came in
* The design and page load performance varied a bit more than we wanted

## The Middleman era

We then moved the blog to [Middleman](https://middlemanapp.com/),
a static site generator written in Ruby.
This era lasted from October 2013-February 2015.

Around this time, it looked like this:

![2013 blog](https://images.thoughtbot.com/ten-years-of-the-giant-robots-blog/YzlFkotFRDWfT9YRU7tF_middleman-blog.png)

Our primary goal was to have a GitHub-based blogging workflow,
which encouraged more contributions from our team,
who are all designers and developers.

We grew from 65,000 readers/month to 180,000 readers/month.

Some aspects that may have contributed to that success:

* Increasing the company size (and potential blog authors) by 50 people
* Dedicating every [Friday for investment
  time](http://playbook.thoughtbot.com/#investment)
* A workflow that allowed the team to contribute more often,
  closer to 3-4 articles/week
* A workflow that improved the quality of the articles;
  they were much better edited
* Intense focus on page load time to improve SEO, using
  [Google PageSpeed Insights][insights] to guide us and Fastly in a
  [DNS to CDN to Origin](https://thoughtbot.com/blog/dns-cdn-origin)
  configuration
* Cross-linking and tag-based archives
  that better exposed our history of articles
* Tightening up the workflow with
  [this Trello board](http://playbook.thoughtbot.com/#blog)
  to not forget to do a bit of promotion for each article
  (post to Hacker News, Reddit, etc.).

[insights]: https://developers.google.com/speed/pagespeed/insights/

We announced the opening of our
[New York City](https://thoughtbot.com/new-york-city) and
[Austin](https://thoughtbot.com/austin) offices.

During this transition,
we kept the Tumblr blog,
and moved it to a new domain,
[http://thoughtbot.tumblr.com](http://thoughtbot.tumblr.com).

Since then, we added a
[Zapier RSS-to-email zap][zap] to automatically post
our aggregated content from our blog, podcasts,
and [Weekly Iteration](https://thoughtbot.com/upcase/the-weekly-iteration) video
series.

[Tumblr provides a custom email address for each Tumblr blog][email]
so the zap sends an email for each new RSS entry.

[zap]: https://zapier.com/zapbook/rss/email/544/get-email-alert-from-rss-feed/
[email]: https://www.tumblr.com/docs/en/email_troubleshooting

We aggregated those sources at
[http://rss.thoughtbot.com](http://rss.thoughtbot.com)
with a custom
[open source RSS script written in Go](https://github.com/thoughtbot/rss).

The classic articles from this era included:

* [The Product Design Sprint](https://thoughtbot.com/blog/the-product-design-sprint)
* [No Newline at End of File](https://thoughtbot.com/blog/no-newline-at-end-of-file)
* [The Unix Shell's Humble If](https://thoughtbot.com/blog/the-unix-shells-humble-if)
* [sed 102: Replace In-Place](https://thoughtbot.com/blog/sed-102-replace-in-place)
* [Recursive Macros in Vim](https://thoughtbot.com/blog/recursive-macros-in-vim)
* [Back to Basics: HTTP Requests](https://thoughtbot.com/blog/back-to-basics-http-requests)
* [Manage Team and Personal Dotfiles Together with
  RCM](https://thoughtbot.com/blog/manage-team-and-personal-dotfiles-together-with-rcm)
* [Back to Basics: Writing Unit Tests
  First](https://thoughtbot.com/blog/back-to-basics-writing-unit-tests-first)
* [Thinking In Types](https://thoughtbot.com/blog/thinking-in-types)
* [Back to Basics: Regular Expressions](https://thoughtbot.com/blog/back-to-basics-regular-expressions)
* [SSL for Rails with Heroku and
  DNSimple](https://thoughtbot.com/blog/ssl-for-rails-with-heroku-and-dnsimple)
* [Laptop Setup for an Awesome Development
  Environment](https://thoughtbot.com/blog/laptop-setup-for-an-awesome-development-environment)
* [What Not to Ask](https://thoughtbot.com/blog/what-not-to-ask)
* [Gestalt Principles](https://thoughtbot.com/blog/gestalt-principles)
* [Real-World JSON Parsing with Swift](https://thoughtbot.com/blog/real-world-json-parsing-with-swift)
* [Animating with Keynote](https://thoughtbot.com/blog/animating-with-keynote)
* [PGP and You](https://thoughtbot.com/blog/pgp-and-you)
* [Ember is for Designers](https://thoughtbot.com/blog/ember-is-for-designers)
* [Writing Go in Vim](https://thoughtbot.com/blog/writing-go-in-vim)
* [Clear Your Mental Cache](https://thoughtbot.com/blog/clear-your-mental-cache)
* [North Star Metric](https://thoughtbot.com/blog/north-star-metric)

We announced the release of open source libraries
[rcm](https://github.com/thoughtbot/rcm),
[gitsh](https://github.com/thoughtbot/gitsh), and
[Liftoff](https://github.com/thoughtbot/liftoff).

We announced the release of
our Continuous Integration service for style checking,
[Hound](https://houndci.com),
and our form backend service, [FormKeep](https://formkeep.com).

We renamed our online training service to [Upcase](https://thoughtbot.com/upcase/join).

We began announcing the release of books such as
[Ruby Science](http://rubyscience.com/) and
[iOS on Rails](http://iosonrails.net/)
and announced new podcasts such as [The Bike Shed](http://bikeshed.fm/).

## The Maitre-d era

Here's the chat that led us away from static site generation:

> **Magnus G.** Ok, I have pushed to production on the blog. That was scary.
> Crossing my fingers I didn't burn anything down.
>
> **Joe F.** could we separate the content/code repos and trigger a reload of
> content via a GitHub post-receive hook?
>
> **Chad P.** it seems like something like that should be possible

Middleman let us review articles on GitHub, but scheduling posts for the future
was complicated.
Because Middleman is static,
future-dated posts wouldn't exist on production,
so we had to deploy on the day we wanted to publish.

Given how many people contribute to our blog,
this became untenable -- people were often on client work and
would forget to merge on a specific day.

We had a hacky solution that rebuilt Middleman every day
with a Heroku Scheduler job,
but we felt we needed a new platform.

In February 2015,
we [built our own blog engine][blog engine] named Maitre-d.
It is tailored to our preferred authoring workflow:
Markdown documents + GitHub pull requests.

Maitre-d abstracts away the technical architecture and deployment
aspects of the blog, allowing authors to focus on writing Markdown documents.
We have a separate repo that contains only Markdown documents for all the posts.

Maitre-d receives a webhook when new content is merged in the Markdown repo.
We extract the metadata (like tags and author),
save it to the database,
and serve it.

Maitre-d also handles auto-publishing articles based on the date in their
filename.
We kept page load fast by continuing to put everything behind
[the Fastly CDN][fastly].

Our readership stayed pretty stable with an average of 180,000 readers/month.

The blog currently looks something like this:

![2015 blog](https://images.thoughtbot.com/ten-years-of-the-giant-robots-blog/R66l32dlSgWj1VIH6rrx_maitre-d.png)

Some of the classic posts from this era:

* [Rails on Docker](https://thoughtbot.com/blog/rails-on-docker)
* [It's only Color](https://thoughtbot.com/blog/Its-only-color)
* [Build and test a blazing fast JSON API with Phoenix,
  an Elixir framework](https://thoughtbot.com/blog/testing-a-phoenix-elixir-json-api)
* [Xcode as a Prototyping Tool for
  Designers](https://thoughtbot.com/blog/xcode-as-a-prototyping-tool-for-designers)
* [Blurred Lines](https://thoughtbot.com/blog/blurred-lines)

[blog engine]: https://thoughtbot.com/blog/blog-in-markdown-deploy-with-webhooks
[fastly]: https://www.fastly.com/

During this era,
we announced our [Portland](https://thoughtbot.com/portland) office,
released the [pick](https://github.com/thoughtbot/pick),
[Ex Machina](https://github.com/thoughtbot/ex_machina), and
[Administrate](https://github.com/thoughtbot/administrate) open source projects,
and released the open source iPhone apps
[Tropos](http://troposweather.com/) and
[Rototo](http://playroto.to).

## Thanks for reading!

These past 10 years have been a labor of love for us,
fine-tuning our process and taking control of the tech as we go.
A company blog is a great place to work together as a team
and create something that codifies various ideas we have day-to-day.

Here's to the next ten years!

![User stats for the entire history of the blog](https://images.thoughtbot.com/lessons-learned-from-six-years-of-tuning-a-company-blog/m7ZXTopiRi6UjlZzEhwN_robots-user-history.jpg)
