Middleman

This blog is made with Middleman, but I tried out three other static blog generators before I settled on Middleman: Pelican, Jekyll, and Octopress.

Once I decided I wanted to make a static blog, Jekyll was the first software I thought of. However, I then considered that if I wanted to extend whatever package I was using, I might be better off with something written in a language I was familiar with, so I started with Pelican instead, which is written in Python. After a few hours of reading the documentation and playing with it, I found two problems with Pelican that put me off it.

  1. I found Pelican too complex for my needs. I tried to make my own, very minimal theme for Pelican starting from Pelican’s “simple” theme, but “simple” had so many features that I found myself intimidated by the vast default functionality, which I felt obligated to account for in my theme. For a taste, here’s the <head> from the simple theme’s base.html (I wrapped some long lines):

    <head>
        {% block head %}
        <title>{% block title %}{{ SITENAME }}{% endblock title %}</title>
        <meta charset="utf-8" />
        {% if FEED_ALL_ATOM %}
        <link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_ATOM }}"
              type="application/atom+xml" rel="alternate"
              title="{{ SITENAME }} Full Atom Feed" />
        {% endif %}
        {% if FEED_ALL_RSS %}
        <link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_RSS }}"
              type="application/rss+xml" rel="alternate"
              title="{{ SITENAME }} Full RSS Feed" />
        {% endif %}
        {% if FEED_ATOM %}
        <link href="{{ FEED_DOMAIN }}/{{ FEED_ATOM }}"
              type="application/atom+xml" rel="alternate"
              title="{{ SITENAME }} Atom Feed" />
        {% endif %}
        {% if FEED_RSS %}
        <link href="{{ FEED_DOMAIN }}/{{ FEED_RSS }}"
              type="application/rss+xml" rel="alternate"
              title="{{ SITENAME }} RSS Feed" />
        {% endif %}
        {% if CATEGORY_FEED_ATOM and category %}
        <link href="{{ FEED_DOMAIN }}/{{ CATEGORY_FEED_ATOM|format(category.slug) }}"
              type="application/atom+xml" rel="alternate"
              title="{{ SITENAME }} Categories Atom Feed" />
        {% endif %}
        {% if CATEGORY_FEED_RSS and category %}
        <link href="{{ FEED_DOMAIN }}/{{ CATEGORY_FEED_RSS|format(category.slug) }}"
              type="application/rss+xml" rel="alternate"
              title="{{ SITENAME }} Categories RSS Feed" />
        {% endif %}
        {% if TAG_FEED_ATOM and tag %}
        <link href="{{ FEED_DOMAIN }}/{{ TAG_FEED_ATOM|format(tag.slug) }}"
              type="application/atom+xml" rel="alternate"
              title="{{ SITENAME }} Tags Atom Feed" />
        {% endif %}
        {% if TAG_FEED_RSS and tag %}
        <link href="{{ FEED_DOMAIN }}/{{ TAG_FEED_RSS|format(tag.slug) }}"
              type="application/rss+xml" rel="alternate"
              title="{{ SITENAME }} Tags RSS Feed" />
        {% endif %}
        {% endblock head %}
    </head>
    

    In retrospect I probably shouldn’t have allowed myself to be deterred by this. I should have just started gutting the theme, but at the time I interpreted the need to do this as a smell that this was the wrong tool for me.

  2. Pelican’s development server rubbed me the wrong way. This is a local web server that you run locally so that you can see changes to your site rendered “instantly.” When I first started the server, it didn’t tell me what port it was on, which was just annoying. The server also seemed to crash sometimes when I did something bad, such as a syntax error in a template (or maybe the configuration file, I can’t remember). Then I sometimes found myself unable to restart or stop the server with ./develop_server.sh (restart|stop).

Perhaps these problems were not so grievous, but I wasn’t invested in Pelican so I decided to see if I would be happier with Jekyll. I had some problems with Jekyll, too, and I also wondered if I actually should use a blog generator that had more features than the very minimal Jekyll.

In retrospect I regret the time wasted due to my indecision on this question of “minimalism versus features,” and my shifting goals may have led to an especially unfair evaluation of one or more of these software packages.

I tried Octopress next, which adds atop Jekyll a slew of features for blogging. Naturally, I had one of the same complaints that I had with Pelican: too complex by default. I also wondered at the fact that Octopress seemed to be using an old version of Jekyll. The final nail in the coffin was when I started reading complaints about long build times with Jekyll.

I cast about for some new software and came upon the static website generation category on the Ruby Toolbox1, where Jekyll is listed as by far the most popular software in that category, for some definition of “popularity.” Runner-up was Middleman, something I hadn’t heard of. I decided to check it out, and ended up using it for this blog.

What I liked about Middleman

Middleman also seems faster than Jekyll to me, but that’s purely subjective.

Middleman hit a sweet spot for me, combining simplicity and optional (rather than by-default) functionality. Also consider, though, that I was probably tired of exploring static blog generators. I was anxious to get to writing.

My use of Middleman is nothing too special. I’m keeping my Middleman site in Git, but I’m not inclined to publish it at this point, as I’m not excited about the idea of potentially leaking private information, such as my deployment configuration or posts that I don’t intend for public consumption. I will, however, write in the future about the construction of this blog, including tidbits on Middleman.

  1. 8.186, “An initial the in [website titles] should be lowercased in midsentence.” I love The Chicago Manual of Style.