Principles · The following are important:
The words and pictures here are generally not AI-generated; the rare exceptions are clearly labeled.
The blog is plain HTML+CSS, with a few snippets of handcrafted JavaScript for minor on-screen fine-tuning. This is the best way to deliver on the World Wide Web and should be used unless there’s a reason it can’t be.
I have no plans to open-source any of the code discussed below, because I’m not proud of it.
Details · I write ongoing in an XML dialect that is mostly HTML with a few little extras; I edit with Emacs but any old text editor would do.
The essay fragments that make up ongoing are organized by date into a directory tree (visible in the URIs), and each is filed into one or more hierarchical categories; you can navigate around both the date and category apparatus.
The paragraph font is FF Tisa Web Pro, delivered via Typekit; I wrote the process up.
Since I'm a hopeless geek, I couldn't possibly use any one of the excellent
personal-web-site or blogging tools out there; it's
all done with a Perl script imaginatively named ong.pl
, less than three thousand lines in total, that
maintains a MySQL database containing
basic metadata for each essay.
The Perl script runs over the source tree, figures out what needs to be
updated, generates any new
notes, and always regenerates the top-level page and RSS/Atom feeds.
It's not rocket science, there are less than 3,000 lines of Perl representing
weeks not months of effort.
Then there’s the comment system, which is under 1,000 lines of Ruby; its design is brutally minimal, involving no databases or framework code.
The little picture on the right that changes every so often involves some JavaScript voodoo.
A lot of the work is in handling the pictures, which exist in three sizes. Some are resized by hand but often it’s ImageMagick. I used to add my own drop shadows, but modern CSS takes care of that.
The JavaScript code that makes the expended versions of the pictures go away is generated by GPT-4.
The text used to be right-justified but eventually I became convinced that that hurt readability. So now I don’t have to think about hyphenation.
One virtue of the setup is that it works exactly the same on my MacOS laptop staging environment and the Debian box where ongoing lives. The blog is entirely served out of static files, but… no wait. If you can possibly serve something like this that way, you should. Linux contains literally engineer-millennia of investment in making the filesystem fast in and of itself, and caching hot files intelligently. Ongoing runs on a very basic VPS and stands up to the load when something I write catches fire and gets fetched a few hundred thousand times. Because static files.
Anyhow, static files, but the production process depends crucially on MySQL, ImageMagick, and many big ol’ Perl libraries. Getting all this software to work together is dead easy on the Debian box, but a major pain in the butt on my Mac. For many years I was depending on Homebrew, but recently switched to MacPorts, which has less trouble getting Perl to play nice with MySQL.
The layout tries pretty hard to be good clean CSS; the original 2003 version, stolen from the best, namely Eric Costello and Tantek Çelik, survived until 2011; an intermediate big step is described in Reflowing. Well, except then I figured out how to expand pix into the left margin because size matters. But eventually I gave up on mastering modern CSS without being a serious student and in 2023 paid someone to fix mine.
Also, there's a DOCTYPE
declaration that claims the output is
XHTML 1.1 and the W3C validator
seems to agree, so to the extent that’s virtuous, so is
ongoing.
I've got it all terribly automated so I can start a new entry, proof an entry, and publish it to the website with single key-chords in Emacs; I recognize lots of people wouldn't be OK with that.
On the "pro" side I can type in any HTML weirdness that strikes my fancy, which might be a "con" except for the XML processor in the pipeline helps keep me honest.
Header Graphics · Occasionally I get mail asking “what’s that picture behind the title?
This is the first header graphic ongoing ever had. It’s a close-up of a piece of oriental carpet in my Mom’s collection. For the first couple of years after launch, it was tiled across the top, until I got tired of looking at the same thing all the time; and it’s still the basis of the little diamond-shaped ongoing icon that might be appearing right now in your browser’s address bar.