site history

This is the 5th iteration of, and the second with a design I actually like. Unfortunately the other design I was satisfied with was written when I was 10, so I have no real history to share.
You didn't miss much.

The last version of was thrown away in around 2006 or so. I've come back to hosting myself because of a dissatisfaction with blogging software, both in user interface and in the creative process. I won't claim that this is a better architecture, but the goal is to lower the barrier between having a thought and sharing it by reducing repetitive and mechanical work as much as possible, and this works for me.

about me

I'm a Canadian living mostly in San Francisco, sometimes in St. Louis.

For fun I hack up hare-brained projects as they strike me, only a few of which have any staying power. The oldest project still running is this might be offensive, the most active is Switch

In the past I've worked as a bus boy, cook, salesman, mechanic, carpenter, forklift operator, and software developer. I've cleaned up vomit for minimum wage in New York and I've flown a Cessna 172 on a 5 hour lunch from SMO → SBA → SMO. I have never been unhappy with a job.

Out of habit I use serial commas and Canadian English. As the grandson of an English teacher and the partner of a linguist I tend to be pedantic about language, so please report any errors you find.


The design of this blog is based heavily on andre torrez' blog, though I saw the icon set first on FilePile. Andre was not just permissive, but encouraging as I stole his design. other inspiration came from The Ministry of Type and Michael Sippey.

On the right platforms, this site uses Monaco for code and fixed-width text, Georgia for timestamps, and Helvetica for everything else.

The backend of this site is entirely custom-built, and I call it Composing Stick, after the tool in typesetting. Here's how it works:

Create a post with the shell script blog-new and a directory is prepared for it containing everything you need:


post.html is a snippet of almost-HTML to be wrapped in a post container when published.
the engine understands a few macros:

  • Text enclosed in a <ref> tag is an immediate footnote, <ref label="foo" /> is a footnote with text defined elsewhere in the post, itself referenced by its label, and <ref label="foo">bar</ref> defines the footnote text for the label (and does not emit a footnote marker).
  • The string local:// is replaced with the path to the post's directory, so images for the post can live next to the post html. root:// behaves similarly.
  • Ordinal suffixes are superscripted automatically
  • The macro tag <caption> is converted into the appropriately classed div

series.txt contains a newline-separated list of the series to which the post belongs. it may be empty or nonexistent.

Optionally you can add a timestamp.txt file to your directory. it should contain an absolute date, and the format is not strict. it will recognize 2009-9-10 22:32:32, Thu Sep 10 22:32:32 PDT 2009, but it won't recognize "my 33rd birthday". if it doesn't have a time in it, this file should not exist and will be set automatically when you publish your post.

If you are posting images or other local media in your post, they should go in this directory as well. in post.html, refer to them as local://filename.ext and the engine will do the right thing

If your EDITOR environment variable is set, then the blog-new script will open the new post folder so you can start writing immediately.

Run the shell script blog-preview and a new file is added to your post's data folder named preview.html. what you see is what you will get when you publish.

Once it's time to publish, run the shell script blog-publish and the engine will rebuild the index, feed, browse page, each affected tag page, and construct your post's page. If you make any changes to your post, just run blog-publish again.

Behind the scenes, the engine is just some shell scripts, PHP, and a SQLite database. While the database is not strictly necessary if you are only generating static pages, it allows for your blog to have dynamic features if you want them.

share and enjoy

Site content copyrighted under a Creative Commons Attribution-Noncommercial license

Source code featured in posts is released to the public domain unless otherwise noted.