diff --git a/plugins/category_list_tag.rb b/plugins/category_list_tag.rb
new file mode 100644
index 0000000..e8f91b1
--- /dev/null
+++ b/plugins/category_list_tag.rb
@@ -0,0 +1,32 @@
+# hacked from http://www.dotnetguy.co.uk/post/2012/06/25/octopress-category-list-plugin/
+module Jekyll
+  class CategoryListTag < Liquid::Tag
+    def initialize(tag_name, markup, tokens)
+      @tagcloud = (tag_name == 'category_tag_cloud')
+    end
+    def render(context)
+      html = ""
+      categories = context.registers[:site].categories.keys
+      categories.sort.each do |category|
+        posts_in_category = context.registers[:site].categories[category].size
+        len = 0.6 + posts_in_category * 0.1
+        category_dir = context.registers[:site].config['category_dir']
+        category_url = File.join(category_dir, category.gsub(/_|\P{Word}/, '-').gsub(/-{2,}/, '-').downcase)
+        if @tagcloud
+          html << "<li style='list-style-type:none;display:inline;' class='category'><a style='font-size:#{len}em' href='/#{category_url}/'>#{category}</a></li> "
+        else
+          posts_str = (if posts_in_category < SUB_ONE_THOUSAND.size then SUB_ONE_THOUSAND[posts_in_category] else '100+' end)
+          posts_str += (if posts_in_category == 1 then ' post' else ' posts' end)
+          html << "<article><h1><a href='/#{category_url}/'>#{category}</a></h1><span class='post-count' data-count='#{posts_in_category}'>#{posts_str}</span></article>"
+        end
+      end
+      html
+    end
+    # stolen from the humanize gem :)
+    SUB_ONE_THOUSAND = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty', 'twenty-one', 'twenty-two', 'twenty-three', 'twenty-four', 'twenty-five', 'twenty-six', 'twenty-seven', 'twenty-eight', 'twenty-nine', 'thirty', 'thirty-one', 'thirty-two', 'thirty-three', 'thirty-four', 'thirty-five', 'thirty-six', 'thirty-seven', 'thirty-eight', 'thirty-nine', 'forty', 'forty-one', 'forty-two', 'forty-three', 'forty-four', 'forty-five', 'forty-six', 'forty-seven', 'forty-eight', 'forty-nine', 'fifty', 'fifty-one', 'fifty-two', 'fifty-three', 'fifty-four', 'fifty-five', 'fifty-six', 'fifty-seven', 'fifty-eight', 'fifty-nine', 'sixty', 'sixty-one', 'sixty-two', 'sixty-three', 'sixty-four', 'sixty-five', 'sixty-six', 'sixty-seven', 'sixty-eight', 'sixty-nine', 'seventy', 'seventy-one', 'seventy-two', 'seventy-three', 'seventy-four', 'seventy-five', 'seventy-six', 'seventy-seven', 'seventy-eight', 'seventy-nine', 'eighty', 'eighty-one', 'eighty-two', 'eighty-three', 'eighty-four', 'eighty-five', 'eighty-six', 'eighty-seven', 'eighty-eight', 'eighty-nine', 'ninety', 'ninety-one', 'ninety-two', 'ninety-three', 'ninety-four', 'ninety-five', 'ninety-six', 'ninety-seven', 'ninety-eight', 'ninety-nine', 'one hundred']
+  end
+end
+
+Liquid::Template.register_tag('category_list', Jekyll::CategoryListTag)
+Liquid::Template.register_tag('category_tag_cloud', Jekyll::CategoryListTag)
+
diff --git a/sass/_partials.scss b/sass/_partials.scss
index 99c28b6..48397a9 100644
--- a/sass/_partials.scss
+++ b/sass/_partials.scss
@@ -4,5 +4,6 @@
 @import "partials/sharing";
 @import "partials/syntax";
 @import "partials/archive";
+@import "partials/category";
 @import "partials/sidebar";
 @import "partials/footer";
diff --git a/sass/partials/_category.scss b/sass/partials/_category.scss
new file mode 100644
index 0000000..62ce5d5
--- /dev/null
+++ b/sass/partials/_category.scss
@@ -0,0 +1,65 @@
+#category {
+  #content > div { &, > article { padding-top: 0; } }
+}
+#blog-categories {
+  article {
+    padding: 1em 0 1em;
+    position: relative;
+    background: $img-border bottom left repeat-x;
+    &:last-child {
+      background: none;
+    }
+    footer { padding: 0; margin: 0;}
+  }
+  h1 { color: $text-color; margin-bottom: .3em; }
+  h2 { display: none; }
+  h1 {
+    font-size: 1.5em;
+    a {
+      @include hover-link;
+      color: inherit;
+      &:hover { color: $link-color-hover; }
+      font-weight: normal;
+      display: inline-block;
+    }
+  }
+  a.category, .post-count {
+    @extend .sans;
+    color: $text-color-light;
+  }
+  color: $text-color-light;
+  .entry-content { display: none; }
+  .post-count {
+    font-size: .9em;
+    line-height: 1.2em;
+    .month, .day { display: inline-block; }
+    .month { text-transform: uppercase; }
+  }
+  p { margin-bottom: 1em; }
+  &, .entry-content { a { @include link-colors(inherit, $link-color-hover); }}
+  a:hover { color: $link-color-hover; }
+  @media only screen and (min-width: 550px) {
+    article { margin-left: 5em; }
+    h2 {
+      margin-bottom: .3em;
+      font-weight: normal;
+      display: inline-block;
+      position: relative; top: -1px;
+      float: left;
+      &:first-child { padding-top: .75em; }
+    }
+    .post-count {
+      position: absolute;
+      text-align: left;
+      right: 0em;
+      top: 1.8em;
+    }
+    .year { display: none; }
+    article {
+      padding:{left: 0; bottom: .7em;}
+    }
+  a.category {
+    line-height: 1.1em;
+    }
+  }
+}
diff --git a/source/_includes/custom/navigation.html b/source/_includes/custom/navigation.html
index 14e05aa..0488bd0 100644
--- a/source/_includes/custom/navigation.html
+++ b/source/_includes/custom/navigation.html
@@ -1,5 +1,6 @@
 <ul class="main-navigation">
   <li><a href="{{ root_url }}/">Blog</a></li>
   <li><a href="{{ root_url }}/blog/archives">Archives</a></li>
+  <li><a href="{{ root_url }}/blog/categories">Categories</a></li>
   <li><a href="{{ root_url }}/about">About</a></li>
 </ul>
diff --git a/source/blog/categories/index.html b/source/blog/categories/index.html
new file mode 100644
index 0000000..4cd6722
--- /dev/null
+++ b/source/blog/categories/index.html
@@ -0,0 +1,22 @@
+---
+layout: page
+title: "Blog Categories"
+comments: false
+footer: true
+---
+
+<div id="blog-categories">
+  {% category_list %}
+</div>
+
+<!-- display a tag cloud, we're so 2.0 -->
+<article>
+    <header>
+        <h1 class="entry-title">Tag Cloud</h1>
+    </header>
+    <div id="blog-tag-cloud">
+        <ul>
+          {% category_tag_cloud %}
+        </ul>
+    </div>
+</article>
