7d7b1c625d52 jilcrow

Moar.
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Tue, 30 Nov 2010 19:06:42 -0500
parents a54e97c153ae
children b2dfe584ddcd
branches/tags jilcrow
files DESIGN.markdown DESIGN.mdown content/404.html content/404.markdown content/about.html content/about.markdown content/blog/index.markdown content/blog/moving-from-django-to-hyde.markdown content/feed.html content/index.html content/index.markdown content/resume.html layout/_flatpage.html layout/_post.html layout/_splash.html layout/skeleton/_atom.xml layout/skeleton/_base.html layout/skeleton/_body.html layout/skeleton/_index.html layout/skeleton/_innerindex.html layout/skeleton/_innerlisting.html layout/skeleton/_listing.html layout/skeleton/_listingitem.html layout/skeleton/_root.html templates/about.html templates/archive_year.html templates/base.html templates/entry-list.html templates/entry.html templates/home.html templates/page.html

Changes

--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DESIGN.markdown	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,13 @@
+Some notes on the design, mostly for myself.
+
+Images
+======
+
+Full images for posts should be 580 pixels wide (or less) and a multiple of 25
+pixels tall.
+
+Headers
+=======
+
+Blog and project content block should use h2 and lower. h1 elements are
+reserved for the layout.
--- a/DESIGN.mdown	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-Some notes on the design, mostly for myself.
-
-Images
-======
-
-Full images for posts should be 580 pixels wide (or less) and a multiple of 25
-pixels tall.
-
-Headers
-=======
-
-Blog and project content block should use h2 and lower. h1 elements are
-reserved for the layout.
--- a/content/404.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-{% extends "_flatpage.html" %}
-
-{% hyde
-    title: "Not Found"
-    exclude: True
-%}
-
-
-{% block article %}
-
-OH GOD HOW DID THIS GET HERE SOMEONE IS NOT GOOD WITH LINK
-==========================================================
-
-{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/content/404.markdown	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,4 @@
+title: "Not Found"
+
+OH GOD HOW DID THIS GET HERE SOMEONE IS NOT GOOD WITH LINK
+==========================================================
--- a/content/about.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-{% extends "skeleton/_base.html" %}
-{% hyde
-    title: "About"
-%}
-
-{% block content %}
-    <img src="/media/images/self.jpg" class="self right" />
-
-    <div id="leaf-title"><h1>{{ page.title|safe|typogrify }}</h1></div>
-    
-    <div id="leaf-content">
-        {% filter typogrify %}
-            {% markdown %}
-I'm **Steve**. I'm from **[Rochester, NY][rochester]**.  
-I do a lot of different things.
-
-If you want to get in touch with me you can [email
-me](mailto:steve@stevelosh.com) or find me on [BitBucket][], [GitHub][],
-[Twitter][], [Forrst][], or [Flickr][].
-
-[rochester]: http://rocwiki.org/
-[Twitter]: http://twitter.com/stevelosh/
-[Flickr]: http://www.flickr.com/photos/sjl7678/
-[BitBucket]: http://bitbucket.org/sjl/
-[GitHub]: http://github.com/sjl/
-[Forrst]: http://forrst.com/people/stevelosh/
-
-
-Programming
------------
-
-I went to [Rochester Institute of Technology](http://rit.edu/) for a degree in
-Computer Science.
-
-I've done a lot of different things in the field so far. Right now the things
-that are captivating me are artificial intelligence and clean, simple,
-*useful* web applications.
-
-I find programming beautiful. That might sound strange, but there are aspects
-of programming and math that I can't describe any other way.
-
-You can take a look at my [projects][] to see some of the major stuff I've
-worked on, or cut to the chase and look at [my BitBucket account][BitBucket].
-
-[projects]: /projects/
-
-Photography
-----------
-
-I like photographing people. Other things as well, but especially people.
-I tend to gravitate toward the "art" aspects of photography more than the
-"journalism" aspects, but I can appreciate both.
-
-I shoot digital and film (35mm and medium format) depending on my time limits
-and mood. I develop film in my bathroom and print it in a rented darkroom.
-When I print digital I use a lab nearby; I don't have the money for a
-professional printer just yet.
-
-I post most of what I take on [my Flickr account][Flickr].
-
-Dancing
--------
-
-I teach blues dancing here in Rochester as part of [Lady Luck Blues][].
-I starting blues dancing a few years ago and haven't stopped since. My favorite
-aspect of dancing is connection and blues seems to bring that out more than any
-other dance.
-
-I've also been swing dancing for about seven years. My first love is Lindy Hop; I
-go to classes, workshops and exchanges as often as my schedule and budget will
-allow.
-
-Lately I've begun getting my feet wet in tango. Whether it'll ever become as
-important to me as blues or Lindy remains to be seen.
-
-[Lady Luck Blues]: http://ladyluckblues.com/
-
-Music
------
-
-I play electric and upright bass. I've played in a metal band in the past, but
-right now my focus is on jazz and blues.
-
-I DJ at swing and blues dances fairly often. My taste is pretty broad, and
-I'll cater to whatever the floor wants, but I tend to personally enjoy
-slightly down-tempo, small-group music. Let me know if you need a DJ for a
-dance.
-
-About the Site
------------
-
-If you want to know more about my site you should check out the [project
-page](/projects/stevelosh-com/) about the original version and my [blog
-post][hyderewrite] about how I rewrote it.
-
-[hyderewrite]: /blog/2010/01/moving-from-django-to-hyde/
-            {% endmarkdown %}
-        {% endfilter %}
-    </div>
-{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/content/about.markdown	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,86 @@
+title: About
+template: about
+
+I'm **Steve**. I'm from **[Rochester, NY][rochester]**.  
+I do a lot of different things.
+
+If you want to get in touch with me you can [email
+me](mailto:steve@stevelosh.com) or find me on [BitBucket][], [GitHub][],
+[Twitter][], [Forrst][], or [Flickr][].
+
+[rochester]: http://rocwiki.org/
+[Twitter]: http://twitter.com/stevelosh/
+[Flickr]: http://www.flickr.com/photos/sjl7678/
+[BitBucket]: http://bitbucket.org/sjl/
+[GitHub]: http://github.com/sjl/
+[Forrst]: http://forrst.com/people/stevelosh/
+
+
+Programming
+-----------
+
+I went to [Rochester Institute of Technology](http://rit.edu/) for a degree in
+Computer Science.
+
+I've done a lot of different things in the field so far. Right now the things
+that are captivating me are artificial intelligence and clean, simple,
+*useful* web applications.
+
+I find programming beautiful. That might sound strange, but there are aspects
+of programming and math that I can't describe any other way.
+
+You can take a look at my [projects][] to see some of the major stuff I've
+worked on, or cut to the chase and look at [my BitBucket account][BitBucket].
+
+[projects]: /projects/
+
+Photography
+----------
+
+I like photographing people. Other things as well, but especially people.
+I tend to gravitate toward the "art" aspects of photography more than the
+"journalism" aspects, but I can appreciate both.
+
+I shoot digital and film (35mm and medium format) depending on my time limits
+and mood. I develop film in my bathroom and print it in a rented darkroom.
+When I print digital I use a lab nearby; I don't have the money for a
+professional printer just yet.
+
+I post most of what I take on [my Flickr account][Flickr].
+
+Dancing
+-------
+
+I teach blues dancing here in Rochester as part of [Lady Luck Blues][].
+I starting blues dancing a few years ago and haven't stopped since. My favorite
+aspect of dancing is connection and blues seems to bring that out more than any
+other dance.
+
+I've also been swing dancing for about seven years. My first love is Lindy Hop; I
+go to classes, workshops and exchanges as often as my schedule and budget will
+allow.
+
+Lately I've begun getting my feet wet in tango. Whether it'll ever become as
+important to me as blues or Lindy remains to be seen.
+
+[Lady Luck Blues]: http://ladyluckblues.com/
+
+Music
+-----
+
+I play electric and upright bass. I've played in a metal band in the past, but
+right now my focus is on jazz and blues.
+
+I DJ at swing and blues dances fairly often. My taste is pretty broad, and
+I'll cater to whatever the floor wants, but I tend to personally enjoy
+slightly down-tempo, small-group music. Let me know if you need a DJ for a
+dance.
+
+About the Site
+-----------
+
+If you want to know more about my site you should check out the [project
+page](/projects/stevelosh-com/) about the original version and my [blog
+post][hyderewrite] about how I rewrote it.
+
+[hyderewrite]: /blog/2010/01/moving-from-django-to-hyde/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/content/blog/index.markdown	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,3 @@
+title: Blog
+template: entry-list
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/content/blog/moving-from-django-to-hyde.markdown	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,454 @@
+title: "Moving from Django to Hyde"
+snip: "Another year, another rewrite."
+date: 2010-01-15 20:14:00
+flattr: true
+
+Almost exactly one year ago I posted a blog entry about how I [rewrote this
+site][rewrite] using [Django][]. It's a new year, and once again I've
+rewritten the site.
+
+If you've visited my site before you may have noticed some small style tweaks.
+I've cleaned up a few things and I think the site looks better overall. The
+biggest change, however, is that I completely rewrote the core -- this time
+with [Hyde][].
+
+Hyde is a "static site generator" written in [Python][], similar to
+[Jekyll][], [Blatter][] and [Pilcrow][]. I chose it over the others because
+it's written in Python (unlike Jekyll), more flexible than Blatter and more
+mature than Pilcrow.
+
+Rewriting an existing site that gets a decent amount of visitors is different
+than creating a new site from scratch, so I decided to write this entry to
+describe some of the issues I ran into and how I tackled them.
+
+[Django]: {{links.django}}
+[rewrite]: /blog/2009/01/site-redesign/
+[Hyde]: {{links.hyde}}
+[Python]: {{links.python}}
+[Jekyll]: http://jekyllrb.com/
+[Blatter]: {{links.blatter}}
+[Pilcrow]: http://inky.github.com/pilcrow/
+
+[TOC]
+
+Why Static?
+-----------
+
+There are a couple of reasons I decided to switch to a static site.
+
+### Less Memory Needed
+
+I use [WebFaction][] for my web hosting, and with my current plan I have a
+limit on how much memory I can use at any given time. Each Django site takes
+up around 20mb of memory on the server.
+
+By switching to a static set of HTML pages for my site I save those 20mb so I
+can use them for something else (like a staging site for another project). My
+site doesn't particularly *need* all of the functionality Django can provide,
+so I figured I'd switch to a static site and save the memory.
+
+[WebFaction]: {{links.webfaction}}
+
+### Static Pages are Faster
+
+My site doesn't get an enormous amount of traffic, so the Django instances
+weren't really working very hard. Still, serving a static page through Apache
+or nginx is always going to be faster than running it through Django.
+Faster-loading pages is always a good thing, even if the speed increase isn't
+very large.
+
+### Easier to Maintain
+
+This is the main reason I switched. Previously, to edit a blog entry I would
+log in through Django's admin interface and edit the entry. With Hyde, I
+simply edit a file (or create a new one) on my machine and then run a single
+command to publish it.
+
+Another problem with the old site is that I needed to be connected to the
+internet to get to the admin interface, so I couldn't update entries (or
+publish new ones) offline. I usually have an internet connection, but
+occasionally I don't. Now I can edit as much as I like on my own machine and
+only need a connection to publish the finished product.
+
+### Easier to Backup
+
+One more advantage of Hyde is that the site structure *and* content are all
+held in the same place. I keep everything in a [Mercurial][] repository, and
+so every time I push that repository somewhere it creates a full backup of the
+site's code *and* content. If WebFaction's server catches on fire I still have
+everything on my local machine (and on BitBucket).
+
+I've toyed around with backing up Django's database tables when I had my old
+site, but this new method is far less work.
+
+[Mercurial]: {{links.mercurial}}
+
+Getting Started
+---------------
+
+I wanted a fresh start when I was rewriting the site, so I went ahead and
+created a brand new folder and Mercurial repository for it.
+
+I used `hyde --init` to lay out a skeleton in the new folder. Then I stripped
+out a lot of the default items that get added with `--init` and created the
+directory structure I wanted to use, with stubs for each of the main content
+files I knew I'd need.
+
+Finally, I went ahead and filled some of the basic values in the `settings.py`
+file.
+
+Layout and Styling
+------------------
+
+Once I had a skeleton in place I started working on layout of the site.
+
+### Cleanup
+
+The templates created by `hyde --init` are functional, but when you look at
+the code they're a mess. The indentation is strange and inconsistent and
+there's trailing whitespace all over the place. I like clean code so I sat
+down and cleaned everything up before I started making any real changes.
+
+### Rewriting the Layout and Styles
+
+After I finished cleaning up the templates I duplicated the HTML structure and
+styles of the old site from scratch. The old site had gone through a bunch of
+iterations and I was a bit sloppy in my editing, so there was a lot of cruft
+that had snuck in. I wanted a truly *fresh* start for the site, so I buckled
+down and did it all again.
+
+### A New CSS Framework
+
+Previously I used the [Blueprint CSS framework][blueprint] to make laying out
+the site easier. Blueprint is a great framework, but it's more powerful than I
+need for a site as simple as this one. The site now uses [Aardvark Legs][aal],
+which is a much simpler framework that simply sets up a great vertical rhythm
+and leaves you free to lay out the horizontal structure yourself.
+
+### Pagination
+
+Before the rewrite the list of blog entries used to be paginated. Hyde
+supports pagination but I decided against using it because I simply don't
+write enough to make it necessary. All the blog entries are now listed on a
+single page, which means that you can use Cmd+F to find an article if you're
+looking for something specific.
+
+[blueprint]: http://www.blueprintcss.org/
+[aal]: {{links.aardvarklegs}}
+
+Using Fabric to Type Less
+-------------------------
+
+I realized very quickly that typing `hyde -g -s . && hyde -w -s .` would get
+old pretty quickly, so I installed [Fabric][] and wrote a fabfile.
+
+Fabric is a tool written in Python that lets you define tasks and execute them
+by running `fab taskname`. Fabfiles are pure Python, so you can build larger
+tasks out of smaller ones very easily and do just about anything you want.
+It's similar to [ant][], but without the excessive over-engineering.
+
+You can view the [current fabfile][fabfile] on BitBucket. At the time of this
+entry it looks like this:
+
+    :::python
+    from fabric.api import *
+    import os
+    import fabric.contrib.project as project
+
+    PROD = 'sjl.webfactional.com'
+    DEST_PATH = '/home/sjl/webapps/slc/'
+    ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+    DEPLOY_PATH = os.path.join(ROOT_PATH, 'deploy')
+
+    def clean():
+        local('rm -rf ./deploy')
+
+    def regen():
+        clean()
+        local('hyde -g -s .')
+
+    def serve():
+        local('hyde -w -s .')
+
+    def reserve():
+        regen()
+        serve()
+
+    def smush():
+        local('smusher ./media/images')
+
+    @hosts(PROD)
+    def publish():
+        regen()
+        project.rsync_project(
+            remote_dir=DEST_PATH,
+            local_dir=DEPLOY_PATH.rstrip('/') + '/',
+            delete=True
+        )
+
+The task I use most often while developing is `fab reserve`, which regenerates
+the site and then starts serving it so I can view the result in a browser.
+
+I use `fab smush` whenever I add new images. This runs [smusher][] on all of
+the images to optimize them without reducing quality.
+
+When I'm ready to publish changes to the live site I run `fab publish`, which
+will regenerate my local version and copy it up to the WebFaction server.
+
+[Fabric]: {{links.fabric}}
+[ant]: http://ant.apache.org/
+[fabfile]: http://bitbucket.org/sjl/stevelosh/src/tip/fabfile.py
+[smusher]: http://github.com/grosser/smusher
+
+Moving the Content
+------------------
+
+The content of the old site (blog entries, projects, and static pages like the
+[about page][]) was fairly easy to migrate over to the new one, because both
+versions use [Markdown][] to format the text.
+
+First I created an empty file for each page with a filename that matched the
+"slug" (last part of the URL) of the old page. Then I manually copied over the
+title, creation time and content for every page. I could have written a script
+to do this, but I don't have enough pages on the site to make it worth the
+time.
+
+[about page]: /about/
+[Markdown]: {{links.markdown}}
+
+Converting the Comments
+-----------------------
+
+At this point the new site was looking very much like the old one. The styles
+were (roughly) matching and the blog posts, entries, and static pages were all
+rendered nicely.
+
+The next big task was migrating all of the comments. Since the new site is
+static it can't handle dynamic content like comments on its own, so I decided
+to use [Disqus][]. I use Disqus for the comments on the [hg tip][] site and
+it's very nice. For that site I used it from the beginning, but for this
+rewrite I needed to somehow import all the old comments.
+
+To migrate the comments over I used [django-disqus][], but there was a small
+snag that I needed to deal with first.
+
+When I first wrote the old site I was just getting back into Django after not
+using it for a long time. I didn't know about Django's built-in comment
+models, so I created my own. They weren't as good as Django's, but they did
+the job and I didn't care enough to change them.
+
+This became a problem when it was time to import the old comments into Disqus.
+django-disqus only supports importing comments from Django's built-in comment
+models. To work around this I first had to convert the old comments into
+Django's built-in ones. I wrote a [small, hacky Python
+script][convert-comments] to do it:
+
+    :::python
+    #!/usr/bin/env python
+    
+    from django.core.management import setup_environ
+    import settings
+    setup_environ(settings)
+    
+    from markdown import Markdown
+    from django.contrib.comments.models import Comment
+    from django.contrib.sites.models import Site
+    from stevelosh.blog.models import Comment as BlogComment
+    from stevelosh.projects.models import Comment as ProjectComment
+    
+    
+    mdown = Markdown()
+    
+    site = Site.objects.all()[0]
+    blog_comments = BlogComment.objects.filter(spam=False)
+    project_comments = ProjectComment.objects.filter(spam=False)
+    
+    for bc in blog_comments:
+        c = Comment()
+        c.content_object = bc.entry
+        c.user_name = bc.name
+        c.comment = mdown.convert(bc.body)
+        c.submit_date = bc.submitted
+        c.site = site
+        c.is_public = True
+        c.is_removed = False
+        c.save()
+        # print 'http://%s%s' % (site.domain, c.content_object.get_absolute_url())
+    
+    for pc in project_comments:
+        c = Comment()
+        c.content_object = pc.project
+        c.user_name = pc.name
+        c.comment = mdown.convert(pc.body)
+        c.submit_date = pc.submitted
+        c.site = site
+        c.is_public = True
+        c.is_removed = False
+        c.save()
+        # print 'http://%s%s' % (site.domain, c.content_object.get_absolute_url())
+
+Yes, it's ugly. No, I don't care. It was run once or twice locally and once on
+the live server. It worked and I'll never need to run it again.
+
+Once I had the comments converted I could use django-disqus to migrate them.
+The import went very smoothly -- I ran one command and after a couple of
+minutes everything was in Disqus. Once that finished it was just a matter of
+adding the Disqus JavaScript to one of the templates.
+
+[Disqus]: http://disqus.com/
+[hg tip]: {{links.hgtip}}
+[django-disqus]: http://github.com/arthurk/django-disqus
+[convert-comments]: http://bitbucket.org/sjl/stevelosh/src/da98105753a1/convert-comments.py
+
+Rewriting the Old URLs
+----------------------
+
+Since I was pretty much starting from scratch with this rewrite I decided to
+clean up the URL structure of my blog. Previously a blog entry's URL looked
+like this:
+
+    :::text
+    http://stevelosh.com/blog/entry/2009/08/30/a-guide-to-branching-in-mercurial/
+
+The `/entry/` part of the URL was useless -- it just took up space, so I got
+rid of it. The year and month are useful to get an idea of how old an entry is
+just by looking at the link, so I left them in. The day, however, probably
+doesn't matter that much, so I took it out.
+
+The new URLs look like this:
+
+    :::text
+    http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/
+
+The problem with rewriting the URL structure is that there are already links
+around the web pointing at my entries. I didn't want those old links to break,
+so I crafted an [`.htaccess` file][htaccess] that would rewrite the old URLs
+into the new ones:
+
+    {% templatetag openblock %} if GENERATE_CLEAN_URLS {% templatetag closeblock %}
+    RewriteEngine on
+    RewriteBase {% templatetag openvariable %} node.site.settings.SITE_ROOT {% templatetag closevariable %}
+    
+    # Old URLs
+    RewriteRule ^blog/entry/(\d+)/(\d\d)/\d+/([^/]*)/?$ /blog/$1/$2/$3/ [R=301,L]
+    RewriteRule ^blog/entry/(\d+)/(\d)/\d+/([^/]*)/?$ /blog/$1/0$2/$3/ [R=301,L]
+    
+    {% templatetag openblock %} hyde_listing_page_rewrite_rules {% templatetag closeblock %}
+    
+    # listing pages whose names are the same as their enclosing folder's
+    RewriteCond %{REQUEST_FILENAME}/$1.html -f
+    RewriteRule ^([^/]*)/$ %{REQUEST_FILENAME}/$1.html
+    
+    # regular pages
+    RewriteCond %{REQUEST_FILENAME}.html -f
+    RewriteRule ^.*$ %{REQUEST_FILENAME}.html
+    
+    {% templatetag openblock %} endif {% templatetag closeblock %}
+
+Most of that file is the stock Hyde `.htaccess` file -- the two lines under `#
+Old URLs` are the ones that I added. It took me a while to get it right
+because I don't work with Apache's `mod_rewrite` very often, but it was worth
+it to avoid breaking all of the old links.
+
+[htaccess]: http://bitbucket.org/sjl/stevelosh/src/tip/content/.htaccess
+
+Creating an RSS Feed
+--------------------
+
+I had an RSS feed for the old site which Django made very easy to set up. I
+definitely needed a feed for the new site, and fortunately Hyde provides a
+simple sample template that can be used to make an ATOM feed.
+
+I cleaned up the whitespace and formatting of that template a bit, adjusted a
+few variables for my needs, put it on [FeedBurner][] and everything was ready.
+
+[FeedBurner]: http://www.feedburner.com/
+
+Merging the Repositories
+------------------------
+
+The last step before I was finished was to merge the old and new repositories
+together so I wouldn't lose any of the history. It's probably not *too*
+important to keep the old site's history around, but I put a lot of work into
+it over the past year and it has some sentimental value.
+
+Fortunately it's very easy to [combine Mercurial repositories][combinerepos].
+I just pulled the old repository into the new one, merged the old head into
+the new one while discarding all the changes, and pushed it up to BitBucket.
+
+[combinerepos]: http://hgtip.com/tips/advanced/2009-11-17-combining-repositories/
+
+Still to Come
+-------------
+
+At this point I felt the site was ready to be released, so I set up a new site
+on WebFaction and used Fabric to deploy it.
+
+I'm very happy with the result, but there are still a few things I'm going to
+fix/change in the future.
+
+### "Ago" Dates
+
+**UPDATE:** This is done. I've started using [timeago.js][] to render the
+"ago" dates.
+
+If you look at the top of each blog entry and project there's a line beneath
+the title that looks something like:
+
+    :::text
+    Posted on Monday, November 16, 2009 (1 month, 3 weeks ago).
+
+The `(1 month, 3 weeks ago)` part of that line is something that I really
+appreciate on blogs. When they just list the date I always have to do the math
+in my head to figure out roughly how old something is.
+
+With a static site, however, those times will quickly become inaccurate if I
+don't regenerate and publish the site regularly. I'm still thinking about the
+best way to work this out.
+
+One option is to use a cron job on the WebFaction server to regenerate the
+site every day, which would keep the times *fairly* accurate.
+
+Another option would be to use a bit of JavaScript to calculate and render the
+time when the page is loaded. This would make it *completely* accurate but
+wouldn't work if someone is browsing with JavaScript turned off.
+
+[timeago.js]: http://timeago.yarp.com/
+
+### Categories
+
+**UPDATE:** I've added categories.  Check out [this changeset][categorycset] to see what I had to do.
+
+Right now all the blog entries (and projects) are listed in a single
+chronological list. It would be great to break them up into categories so
+people can easily find the articles they're interested in.
+
+Hyde supports categories but I haven't spent the time to learn how to use them
+yet. I also need to figure out a way to work a list of categories into the
+design without cluttering things up too much.
+
+[categorycset]: http://bitbucket.org/sjl/stevelosh/changeset/08d7552b6237/
+
+### Use LessCSS
+
+**UPDATE:** This is done.  The main style file now uses LessCSS.
+
+[LessCSS][] is a language that extends CSS with some useful features like
+variables, mixins, operations and nested rules. It can make the styles of a
+site much, much cleaner.
+
+Hyde includes a LessCSS "processor" that will automatically render your
+LessCSS files into normal CSS. I'm planning on rewriting the site's styles in
+LessCSS and using the processor once I get some free time.
+
+[lesscss]: {{links.lesscss}}
+
+View the Code
+-------------
+
+The code is on [BitBucket][bb-repo] and [GitHub][gh-repo]. Feel free to poke
+around and see how I've set things up. If you have questions or suggestions
+I'd love to hear them!
+
+[bb-repo]: http://bitbucket.org/sjl/stevelosh/
+[gh-repo]: http://github.com/sjl/stevelosh/
--- a/content/feed.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-{% extends "skeleton/_atom.xml" %}
\ No newline at end of file
--- a/content/index.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-{% extends "_splash.html" %}
-
-{% hyde
-    title: ""
-%}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/content/index.markdown	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,3 @@
+title: ' '
+template: home
+
--- a/content/resume.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-{% extends "_flatpage.html" %}
-
-{% hyde
-    title: "Résumé"
-    exclude: True
-%}
-
-{% block article %}
-
-I'm Steve. I'm a programmer from Rochester, NY. I graduated from [Rochester
-Institute of Technology][rit] in 2008 with a Bachelor's degree in [Computer
-Science][ritcs].
-
-I'm currently most interested in rapid web development, version control, and
-artificial intelligence. I'm not looking for full time work at the moment but
-I'm available for interesting freelance projects.
-
-If you'd *really* like to get to know me you should look at the [projects][]
-and [blog posts][] I've written, or cut to the chase and look at my [code][].
-
-[rit]: http://rit.edu/
-[ritcs]: http://www.cs.rit.edu/
-[projects]: /projects/
-[blog posts]: /blog/
-[code]: http://bitbucket.org/sjl/
-
-## Skills & Interests
-
-I'm passionate about programming. It may sound odd, but there are aspects of
-programming that I find beautiful (in every sense of the word).
-
-### Languages
-
-My favorite programming language at the moment is [Python][]. It's elegant,
-readable, powerful, and makes it easy to *get things done*.
-
-I've also had experience with [Java][], [C][], [C++][], [Lisp][], [SQL][] and
-[PL/SQL][], [JavaScript][], [Groovy][], and [bash scripting][]. I've used a
-number of markup and templating languages, including [XHTML][], [XML][],
-[CSS][], [JSON][], [Markdown][], [Django][]'s template system, and [Jinja2][].
-
-In my free time I'm working on learning [R][].
-
-[Python]: http://www.python.org/
-[Java]: http://java.sun.com/
-[C]: http://en.wikipedia.org/wiki/C_(programming_language)
-[C++]: http://en.wikipedia.org/wiki/C%2B%2B
-[Lisp]: http://en.wikipedia.org/wiki/Lisp_(programming_language)
-[SQL]: http://en.wikipedia.org/wiki/SQL
-[PL/SQL]: http://en.wikipedia.org/wiki/PL/SQL
-[JavaScript]: http://en.wikipedia.org/wiki/JavaScript
-[Groovy]: http://groovy.codehaus.org/
-[bash scripting]: http://www.gnu.org/software/bash/
-[XHTML]: http://www.w3.org/TR/xhtml1/
-[XML]: http://www.w3.org/XML/
-[CSS]: http://www.w3.org/TR/CSS/
-[JSON]: http://www.json.org/
-[Markdown]: {{links.markdown}}
-[Jinja2]: http://jinja.pocoo.org/2/
-[R]: http://www.r-project.org/
-
-### Web Development
-
-For web development I gravitate toward the [Django][] framework. Django bills
-itself as "The Web framework for professionals with deadlines" and this
-strikes a chord with me.
-
-I've used the [CherryPy][] framework for smaller (but still dynamic) projects
-that don't need the additional functionality of Django.
-
-I hate writing repetitive, difficult-to-maintain code. Even when writing
-completely static websites I prefer to take advantage of templating languages.
-To do that I use [Hyde][] and [Blatter][], both of which generate static HTML
-from templates.
-
-I've used several CSS frameworks including [Blueprint][], [Tripoli][] and
-[aardvark legs][]. Of these I now prefer aardvark legs because it makes
-setting up a beautiful vertical rhythm simple and doesn't impose itself on the
-horizontal layout.
-
-When writing [JavaScript][] I use [jQuery][] to eliminate a lot of the
-tediousness and create elegant code.
-
-[Django]: {{links.django}}
-[CherryPy]: {{links.cherrypy}}
-[Blueprint]: http://www.blueprintcss.org/
-[Tripoli]: http://devkick.com/lab/tripoli/
-[aardvark legs]: {{links.aardvarklegs}}
-[Hyde]: http://github.com/lakshmivyas/hyde
-[Blatter]: {{links.blatter}}
-[jQuery]: http://jquery.com/
-
-### Version Control
-
-I think version control is essential for a project of almost any size, and
-lately the concepts behind it have captured my interest.
-
-In my personal work I use [Mercurial][] (usually with [BitBucket][]). I've
-[contributed][] several minor patches to the Mercurial core and written two
-extensions: [hg-prompt][] and [hg-paste][].
-
-I know my way around [Subversion][], [CVS][], and [git][] as well.
-
-[Mercurial]: {{links.mercurial}}
-[BitBucket]: http://bitbucket.org/
-[Subversion]: http://subversion.tigris.org/
-[CVS]: http://www.nongnu.org/cvs/
-[git]: http://git-scm.com/
-[contributed]: http://selenic.com/repo/hg/log?rev=Steve+Losh
-[hg-prompt]: /projects/hg-prompt/
-[hg-paste]: /projects/hg-paste/
-
-### How I Work
-
-For my personal work I use [Mac OS X][]. I'm comfortable in [Linux][] and can
-deal with [Windows][] (though I don't enjoy it).
-
-I use [TextMate][] and [vim][] for coding, [CSSEdit][] when designing,
-[Mercurial][] for version control, [t][] to manage my personal tasks, and
-deploy through [SSH][] with [fabric][].
-
-[Mac OS X]: http://www.apple.com/macosx/
-[TextMate]: http://macromates.com/
-[SSH]: http://en.wikipedia.org/wiki/Secure_Shell
-[fabric]: {{links.fabric}}
-[Linux]: http://www.linux.org/
-[Windows]: http://www.microsoft.com/WINDOWS/
-[vim]: http://www.vim.org/
-[CSSEdit]: http://macrabbit.com/cssedit/
-[t]: /projects/t/
-
-## Personal Projects
-
-You can find some of my pet projects on the [projects][] page.
-
-Lately I've been working on a few new things that aren't quite ready for
-general use, but are getting close:
-
-* [hg-review][]: a code-review extension for Mercurial.
-* [LindyHub][]: a site like BitBucket or GitHub for dancers.
-* [gorilla][]: a packaging system for Python.
-* [tinpan][]: a language-agnostic, vcs-agnostic continuous integration system.
-
-[hg-review]: http://bitbucket.org/sjl/hg-review/
-[LindyHub]: http://test.lindyhub.com/
-[gorilla]: http://bitbucket.org/sjl/gorilla/
-[tinpan]: http://bitbucket.org/sjl/tinpan/
-
-## Full-Time Work Experience
-
-I completed two six-month [co-ops][] while at [RIT][]. Since I graduated I've
-worked full time for about a year and a half.
-
-[co-ops]: https://www.rit.edu/about/coop_careers.html
-[RIT]: http://rit.edu/
-
-### Senior Software Engineer at [Dumbwaiter Design][DWD]
-
-*Henrietta, NY since January 2010.*
-
-At [Dumbwaiter][DWD] I work with our amazing designers to create beautiful websites backed by [Django][] and [Python][].
-
-[DWD]: http://dwaiter.com/
-
-### Software Engineer at [PAETEC][]
-
-*Fairport, NY from June 2008 to January 2010.*
-
-At [PAETEC][] I maintained and implemented new features for web applications
-in [Java][] using the [Oracle E-Business Suite][oebs] and worked on underlying
-[SQL][] and [PL/SQL][] code for our databases.
-
-[PAETEC]: http://paetec.com/
-[oebs]: http://www.oracle.com/applications/e-business-suite.html
-
-### Data Architecture Co-op at [Excellus BlueCross BlueShield][]
-
-*Rochester, NY from June 2007 to November 2007.*
-
-At [Excellus][] I developed software in [Java][] to interact with and manage
-databases of customer and provider information stored on a mainframe. I also
-created and updated [JUnit][] and [Jemmy][] tests for this software.
-
-[Excellus BlueCross BlueShield]: https://www.excellusbcbs.com/
-[Excellus]: https://www.excellusbcbs.com/
-[JUnit]: http://www.junit.org/
-[Jemmy]: http://jemmy.dev.java.net/
-
-### Managed Services Programmer at [RightNow Technologies][]
-
-*Pittsford, NY from June 2006 to November 2006.*
-
-At [RightNow][] I developed a set of tools to test the effectiveness of
-voice-automated telephone systems. These tools were written in a combination
-of [bash scripting][] and [Python][]. I assisted in generating statistics
-about the effectiveness of these systems for customers.
-
-[RightNow Technologies]: http://www.rightnow.com/
-[RightNow]: http://www.rightnow.com/
-
-## Contact Me
-
-If you'd like to get in touch with me, you can use any method you like.
-
-My **email address** is: <steve@stevelosh.com>  
-My **phone number** is: (570) 417-1392  
-My **skype username** is: steve.losh  
-My **mailing address** is: 150 Park Avenue, Apartment 7, Rochester, NY 14607
-
-You can also find me on [Twitter][], [Flickr][], [BitBucket][], [GitHub][],
-[BrightKite][], or [DjangoPeople][].
-
-[Twitter]: http://twitter.com/stevelosh/
-[Flickr]: http://www.flickr.com/photos/sjl7678/
-[BitBucket]: http://bitbucket.org/sjl/
-[GitHub]: http://github.com/sjl/
-[BrightKite]: http://brightkite.com/people/stevelosh/
-[DjangoPeople]: http://djangopeople.net/stevelosh/
-
-{% endblock %}
--- a/layout/_flatpage.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-{% extends "skeleton/_base.html" %}
-
-{% block content %}
-    <div id="leaf-title"><h1>{{ page.title|safe|typogrify }}</h1></div>
-    
-    <div id="leaf-content">
-        {% filter typogrify %}
-            {% markdown toc def_list %}
-                {% block article %}{% endblock %}
-            {% endmarkdown %}
-        {% endfilter %}
-    </div>
-{% endblock %}
\ No newline at end of file
--- a/layout/_post.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-{% extends "skeleton/_base.html" %}
-
-{% block extra_css %}
-    <link rel="stylesheet"
-          href="{{ site.url }}/media/css/pygments-monokai-light.css"
-          type="text/css" media="screen" charset="utf-8" />
-{% endblock %}
-
-{% block content %}
-    <div id="leaf-title">
-        <h1><a href="{{ page.url }}">{{ page.title|safe|typogrify }}</a></h1>
-    </div>
-
-
-    <div id="leaf-stats" class="group">
-        {% if page.flattr %}
-            <div class="flattr">
-                <a class="FlattrButton" style="display:none;" rev="flattr;button:compact;"
-                   href="http://stevelosh.com{{ page.url }}"></a>
-           </div>
-        {% endif %}
-        <p>
-            Posted
-            <span class="timeago"
-                  title="{{ page.created|date:"Y-m-d" }}T{{ page.created|date:"H:i:s" }}">
-            </span>
-            on {{ page.created|date:"F j, Y" }}.
-        </p>
-    </div>
-
-    <div id="leaf-content" class="{% block article_class %}{% endblock %}">
-        {% filter typogrify %}
-            {% article %}
-                {% filter typogrify %}
-                    {% markdown toc def_list codehilite %}
-                        {% block article %}{% endblock %}
-                    {% endmarkdown %}
-                {% endfilter %}
-            {% endarticle %}
-        {% endfilter %}
-    </div>
-{% endblock %}
--- a/layout/_splash.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-{% extends "skeleton/_base.html" %}
-
-{% block content %}
-    <div class="splash">
-        {% filter typogrify %}
-            <p>Hello, I'm Steve.</p>
-
-            <p>
-                I'm a programmer, photographer, dancer <span class="amp">&amp;</span>
-                bassist from Rochester,&nbsp;New&nbsp;York.
-            </p>
-
-            <p>
-                If you want to get in touch with me,
-                <a href="mailto:steve@stevelosh.com">email</a> is best.
-            </p>
-        {% endfilter %}
-    </div>
-{% endblock %}
--- a/layout/skeleton/_atom.xml	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-{% spaceless %}
-
-<feed xmlns="http://www.w3.org/2005/Atom">
-    <title>{% block title %}{{ site.name }}{% endblock %}</title>
-    
-    {% block self_url %}
-        <link href="{{ page.node.full_url }}/feed/" rel="self" />
-    {% endblock %}
-    
-    {% block site_url %}
-        <link href="{{ site.full_url }}"/>
-    {% endblock %}
-    
-    {% block feed_extra %}{% endblock %}
-    
-    <updated>{{ now|xmldatetime }}</updated>
-    
-    <id>{{ site.full_url }}/</id>
-    
-    {% recent_posts recents 4 page.blog_node %}
-
-    {% for post in recents %}
-        {% if not post.listing and not post.exclude %}
-            <entry>
-                <title type="html">{{ post.title }}</title>
-                <author><name>{{ site.author }}</name></author>
-                <link href="{{ post.full_url }}"/>
-                <updated>{{ post.created|xmldatetime }}</updated>
-                <published>{{ post.created|xmldatetime }}</published>
-                <id>{{ post.full_url }}</id>
-                {% block entry_extra %}{% endblock %}
-                <content type="html">
-                    {% filter force_escape %}
-                        {% render_article post %}
-                    {% endfilter %}
-                </content>
-            </entry>
-        {% endif %}
-    {% endfor %}
-</feed>
-
-{% endspaceless %}
--- a/layout/skeleton/_base.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-{% extends "skeleton/_root.html" %}
-
-{% block all %}
-<!DOCTYPE html>
-
-<html>
-    <head>
-        <link href='http://fonts.googleapis.com/css?family=OFL+Sorts+Mill+Goudy+TT:regular,italic' rel='stylesheet' type='text/css'>
-
-        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
-
-        <title>{% block title %}{% block extra_title %}{% endblock %}{{ page.title|safe }} / {{ site.name }}{% endblock %}</title>
-
-        {% block feeds %}
-            <link href="http://feeds2.feedburner.com/stevelosh"
-                  rel="alternate" title="{{ site.name }}"
-                  type="application/atom+xml" />
-        {% endblock %}
-
-        {% block css %}
-            <link rel="stylesheet" href="/media/css/aal.css"      type="text/css" media="screen" charset="utf-8" />
-            <link rel="stylesheet" href="/media/css/sjl.css"      type="text/css" media="screen" charset="utf-8" />
-            <link rel="stylesheet" href="/media/css/colorbox.css" type="text/css" media="screen" charset="utf-8" />
-            <link rel="stylesheet" href="/media/css/print.css"    type="text/css" media="print" charset="utf-8" />
-            {% block extra_css %}{% endblock %}
-        {% endblock %}
-
-        {% block js %}
-            <script src="/media/js/jquery.js" type="text/javascript"></script>
-            <script src="/media/js/jquery.timeago.js" type="text/javascript"></script>
-            <script src="/media/js/jquery.colorbox.js" type="text/javascript"></script>
-            <script src="/media/js/sjl.js" type="text/javascript"></script>
-            <script src="/media/js/print.js" type="text/javascript"></script>
-
-            <script type="text/javascript">
-                $(function() {
-                    $("a.rhythm").toggle(function() {
-                        $("body").addClass("rhythm");
-                    }, function() {
-                        $("body").removeClass("rhythm");
-                    });
-                });
-            </script>
-
-            <script type="text/javascript">
-            /* <![CDATA[ */
-                (function() {
-                    var s = document.createElement('script'), t = document.getElementsByTagName('script')[0];
-
-                    s.type = 'text/javascript';
-                    s.async = true;
-                    s.src = 'http://api.flattr.com/js/0.5.0/load.js?mode=auto';
-
-                    t.parentNode.insertBefore(s, t);
-                })();
-            /* ]]> */
-            </script>
-
-            {% block extra_js %}{% endblock %}
-        {% endblock %}
-
-        <link rel="openid.server" href="http://www.myopenid.com/server" />
-        <link rel="openid.delegate" href="http://stevelosh.myopenid.com/" />
-
-        <script type="text/javascript">
-          var _gaq = _gaq || [];
-          _gaq.push(['_setAccount', 'UA-15328874-2']);
-          _gaq.push(['_trackPageview']);
-
-          (function() {
-            var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-            ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-          })();
-        </script>
-
-    </head>
-
-    <body>
-        <div class="wrap">
-            <div class="top group">
-                <header>
-                    <a href="/">steve losh</a>
-                </header>
-
-                <nav>
-                    <a href="/blog/">Blog</a>
-                    <span class="sep">-</span>
-                    <a href="/projects">Projects</a>
-                    <span class="sep">-</span>
-                    <a href="/about/">About</a>
-                    <span class="sep">-</span>
-                    <a href="http://feeds2.feedburner.com/stevelosh">Feed</a>
-                </nav>
-            </div>
-
-            <div class="hr">&nbsp;</div>
-
-            <div class="content">
-                {% with page.node.ancestors|last as parent_node %}
-                    {% with parent_node.url as parent_url %}
-                        {% block content %}{% endblock %}
-                    {% endwith %}
-                {% endwith %}
-            </div>
-
-            <div class="hrb">&nbsp;</div>
-
-            <footer>
-                I'm also on
-                <a href="http://bitbucket.org/sjl/">BitBucket</a>,
-                <a href="http://github.com/sjl/">GitHub</a>,
-                <a href="http://twitter.com/stevelosh/">Twitter</a>,
-                <a href="http://forrst.com/people/stevelosh/">Forrst</a>
-                and
-                <a href="http://flickr.com/photos/sjl7678/">Flickr</a>.
-                I've got <a href="#" class="rhythm">rhythm</a>.
-            </footer>
-        </div>
-    </body>
-</html>
-{% endblock %}
--- a/layout/skeleton/_body.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-{% extends "skeleton/_base.html" %}
-
-{% block title %}{{site.name}} / {{ page.title }}{% endblock %}
-
-{% block content %}
-    {% block content_body %}{% endblock %}
-{% endblock %}
\ No newline at end of file
--- a/layout/skeleton/_index.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-{% extends "skeleton/_base.html" %}
-
-{% block content %}
-    {% for node in page.node.walk %}
-        {% include "skeleton/_innerindex.html" %}
-    {% endfor %} 
-{% endblock %}
\ No newline at end of file
--- a/layout/skeleton/_innerindex.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-{% extends "skeleton/_root.html" %}
-
-{% block all %}
-{%spaceless%}
-{% for list_page in node.pages %}
-    {% ifnotequal list_page node.listing_page %}
-        {% if not list_page.exclude %}
-            <div class="article">
-                <div class="title">
-                    {% with list_page.name_without_extension|remove_date_prefix|unslugify as default_title %}
-                        <h3>
-                            <a href="{{list_page.url}}">
-                                {{ list_page.title|default_if_none:default_title }}
-                            </a>
-                        </h3>
-                        {% if list_page.created %}
-                            <span>{{ list_page.created }}</span>
-                        {% endif %}
-                    {%endwith%}
-                </div>
-                {% render_article list_page %}
-            </div>
-        {%endif%}
-    {% endifnotequal %}
-{% endfor %}
-{%endspaceless%}
-{% endblock %}
\ No newline at end of file
--- a/layout/skeleton/_innerlisting.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-{% extends "skeleton/_root.html" %}
-
-{% block all %}
-{%spaceless%}
-
-{% for list_page in node.pages %}
-    {% ifnotequal list_page node.listing_page %}
-        {% if not list_page.exclude %}
-            {% include "skeleton/_listingitem.html" %}
-        {%endif%}
-    {% endifnotequal %}
-{% endfor %}
-
-{%endspaceless%}
-{% endblock %}
\ No newline at end of file
--- a/layout/skeleton/_listing.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-{% extends "skeleton/_base.html"%}
-
-{% block content %}
-    <div class="section-listing">
-        <ol class="group">
-            {% for node in page.node.walk reversed %}
-                {% include "skeleton/_innerlisting.html" %}
-            {% endfor %}
-        </ol>
-    </div>
-{% endblock %}
--- a/layout/skeleton/_listingitem.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-<li>
-    <a href="{{ list_page.url }}">
-        {% with list_page.name_without_extension|remove_date_prefix|unslugify as default_title %}
-            {{ list_page.title|default_if_none:default_title|safe|typogrify }}
-        {%endwith%}
-    </a>
-    <span class="snip">{{ list_page.snip|safe|typogrify }}</span>
-</li>
--- a/layout/skeleton/_root.html	Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-{% block all %}{% endblock %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/about.html	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,8 @@
+{% extends "base.html" %}
+
+{% block content %}
+    <img src="/media/images/self.jpg" class="self right" />
+    <div id="leaf-title"><h1>{{ title }}</h1></div>
+
+    {{ content }}
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/base.html	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,107 @@
+<!DOCTYPE html>
+
+<html>
+    <head>
+        <link href='http://fonts.googleapis.com/css?family=OFL+Sorts+Mill+Goudy+TT:regular,italic' rel='stylesheet' type='text/css'>
+
+        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+        <title>{{ head_title }}</title>
+
+        {% block css %}
+            <link rel="stylesheet" href="/media/css/aal.css"      type="text/css" media="screen" charset="utf-8" />
+            <link rel="stylesheet" href="/media/css/sjl.css"      type="text/css" media="screen" charset="utf-8" />
+            <link rel="stylesheet" href="/media/css/colorbox.css" type="text/css" media="screen" charset="utf-8" />
+            <link rel="stylesheet" href="/media/css/print.css"    type="text/css" media="print" charset="utf-8" />
+            {% block extra_css %}{% endblock %}
+        {% endblock %}
+
+        {% block js %}
+            <script src="/media/js/jquery.js" type="text/javascript"></script>
+            <script src="/media/js/jquery.timeago.js" type="text/javascript"></script>
+            <script src="/media/js/jquery.colorbox.js" type="text/javascript"></script>
+            <script src="/media/js/sjl.js" type="text/javascript"></script>
+            <script src="/media/js/print.js" type="text/javascript"></script>
+
+            <script type="text/javascript">
+                $(function() {
+                    $("a.rhythm").toggle(function() {
+                        $("body").addClass("rhythm");
+                    }, function() {
+                        $("body").removeClass("rhythm");
+                    });
+                });
+            </script>
+
+            <script type="text/javascript">
+            /* <![CDATA[ */
+                (function() {
+                    var s = document.createElement('script'), t = document.getElementsByTagName('script')[0];
+
+                    s.type = 'text/javascript';
+                    s.async = true;
+                    s.src = 'http://api.flattr.com/js/0.5.0/load.js?mode=auto';
+
+                    t.parentNode.insertBefore(s, t);
+                })();
+            /* ]]> */
+            </script>
+
+            {% block extra_js %}{% endblock %}
+        {% endblock %}
+
+        <link rel="openid.server" href="http://www.myopenid.com/server" />
+        <link rel="openid.delegate" href="http://stevelosh.myopenid.com/" />
+
+        <script type="text/javascript">
+          var _gaq = _gaq || [];
+          _gaq.push(['_setAccount', 'UA-15328874-2']);
+          _gaq.push(['_trackPageview']);
+
+          (function() {
+            var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+            ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+          })();
+        </script>
+    </head>
+
+    <body>
+        <div class="wrap">
+            <div class="top group">
+                <header>
+                    <a href="/">steve losh</a>
+                </header>
+
+                <nav>
+                    <a href="/blog/">Blog</a>
+                    <span class="sep">-</span>
+                    <a href="/projects">Projects</a>
+                    <span class="sep">-</span>
+                    <a href="/about/">About</a>
+                    <span class="sep">-</span>
+                    <a href="http://feeds2.feedburner.com/stevelosh">Feed</a>
+                </nav>
+            </div>
+
+            <div class="hr">&nbsp;</div>
+
+            <div class="content">
+                {% block content %}{% endblock %}
+            </div>
+
+            <div class="hrb">&nbsp;</div>
+
+            <footer>
+                I'm also on
+                <a href="http://bitbucket.org/sjl/">BitBucket</a>,
+                <a href="http://github.com/sjl/">GitHub</a>,
+                <a href="http://twitter.com/stevelosh/">Twitter</a>,
+                <a href="http://forrst.com/people/stevelosh/">Forrst</a>
+                and
+                <a href="http://flickr.com/photos/sjl7678/">Flickr</a>.
+                I've got <a href="#" class="rhythm">rhythm</a>.
+            </footer>
+        </div>
+    </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/entry-list.html	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+
+{% block content %}
+    <div class="section-listing">
+        <ol class="group">
+            {%- for page in pages %}
+                <li>
+                    <a href="{{ page.url }}">{{ page.title }}</a>
+                    <span class="snip">{{ page.snip }}</span>
+                </li>
+            {% endfor %}
+        </ol>
+    </div>
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/entry.html	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,34 @@
+{% extends "base.html" %}
+
+{% block extra_css %}
+    <link rel="stylesheet"
+          href="{{ root }}media/css/pygments-monokai-light.css"
+          type="text/css" media="screen" charset="utf-8" />
+{% endblock %}
+
+{% block content %}
+    <div id="leaf-title">
+        <h1><a href="{{ url }}">{{ title }}</a></h1>
+    </div>
+
+    <div id="leaf-stats" class="group">
+        {% if flattr %}
+            <div class="flattr">
+                <a class="FlattrButton" style="display:none;" rev="flattr;button:compact;"
+                   href="http://stevelosh.com{{ url }}"></a>
+           </div>
+        {% endif %}
+        <p>
+            Posted
+            <span class="timeago"
+                title="{{ date }}T{{ date }}">
+                FIXME
+            </span>
+            on FIXME.
+        </p>
+    </div>
+
+    <div id="leaf-content" class="{% block article_class %}{% endblock %}">
+            {{ content }}
+    </div>
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/home.html	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,18 @@
+{% extends "base.html" %}
+
+{% block content %}
+    <div class="splash">
+        <p>Hello, I'm Steve.</p>
+
+        <p>
+            I'm a programmer, photographer, dancer <span class="amp">&amp;</span>
+            bassist from Rochester,&nbsp;New&nbsp;York.
+        </p>
+
+        <p>
+            If you want to get in touch with me,
+            <a href="mailto:steve@stevelosh.com">email</a> is best.
+        </p>
+    </div>
+{% endblock %}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/page.html	Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,5 @@
+{% extends "base.html" %}
+
+{% block content %}
+    {{ content }}
+{% endblock %}