Jeff Johnson (My apps, PayPal.Me)

Blogging without a blogging engine

November 2 2022

Many years ago I had a self-hosted WordPress blog, but that became a pain because I had to keep installing WordPress security updates to patch vulnerabilities. Also, I had to customize the WordPress code somewhat to suit my preferences. For a few years I stopped blogging entirely, and when I eventually restarted I decided that I wanted a very low maintenance blog. So dispensing with all blogging engines, I created the simplest possible blog that I could write "by hand". If you're thinking of self-hosting your content — it's wise to avoid becoming dependent on giant, impersonal, globally centralized services — then you can design your own simple blog too if you have a little technical knowledge. If you're intimidated by the blogging engine choices, you can just choose none of the above!

I write all of my blog posts in plain HTML using BBEdit. It doesn't suck.® I start a blog post with a template, which looks like this.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="style.css">
<meta name="viewport" content="initial-scale=1.0">
<title>TITLE</title>
</head>
<body>
<nav><a href="index.html" title="The Desolation of Blog">Articles index</a></nav>
<header><a href="https://lapcatsoftware.com">Jeff Johnson</a> (<a href="https://underpassapp.com">My apps</a>, <a href="https://www.paypal.me/JeffJohnsonWI">PayPal.Me</a>)</header>

<h1>TITLE</h1>
<h3>DATE</h3>
<p></p>

<header><a href="https://lapcatsoftware.com">Jeff Johnson</a> (<a href="https://underpassapp.com">My apps</a>, <a href="https://www.paypal.me/JeffJohnsonWI">PayPal.Me</a>)</header>
<nav><a href="index.html" title="The Desolation of Blog">Articles index</a></nav>
</body>
</html>

I fill in the blog post title in <title></title> and <h1></h1>, the date in <h3></h3>, and start writing the text in <p></p>. There's no JavaScript at all, so writing a blog post requires only knowledge of HTML syntax.

I also add an entry for the blog post to the index.html file. This is simply a table row with the date, file name of the blog post, and title.

<tr><td>DATE</td><td><a href="FILE">TITLE</a></td></tr>

It's really that simple! When I'm finished writing the blog post, I upload the file along with any images or file attachments to my web server, and then I upload the modified index.html file with the new blog post entry.

My blog is totally static, which means that it can easily withstand massive traffic surges caused by Fireballing or the Hacker News front page. These have both happened to me! No sweat. My site remained responsive the whole time.

What about RSS, you ask? It should comes as no surprise at this point that I also write my RSS by hand. This is a bit more "dangerous", because unlike HTML, XML is completely unforgiving, so you need to be careful. I personally use the W3C Feed Validation Service to check my RSS before I publish it. There are actually a few different RSS feed formats; the two most popular are Atom and — just to be confusing — RSS. The choice doesn't matter much, and either one is supported by every feed reader. I personally prefer Atom for my blog. So I have an atom.xml file on the server too. The RSS looks like this at the beginning.

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>The Desolation of Blog</title>
<subtitle>The personal blog of Jeff Johnson.</subtitle>
<author>
<name>Jeff Johnson</name>
<uri>https://lapcatsoftware.com/</uri>
</author>
<id>http://lapcatsoftware.com/articles/</id>
<link rel="self" type="application/atom+xml" href="https://lapcatsoftware.com/articles/atom.xml"/>
<link rel="alternate" type="text/html" href="https://lapcatsoftware.com/articles/index.html"/>

<updated>2022-11-01T18:25:00Z</updated>

I need to update the <updated></updated> date whenever I publish a new blog post. In the RSS feed, each entry also starts with a template.

<entry>
<title>TITLE</title>
<id>URL</id>
<link rel="alternate" href="URL"/>
<published>DATE</published>
<updated>DATE</updated>
<content type="html"><![CDATA[

]]></content>
</entry>

The CDATA section allows me to copy the HTML of the blog post and paste it into the XML of the RSS feed without having to escape the HTML.

In summary, here's my process for writing a new blog post.

  1. Create a new HTML file from a template
  2. Add a new table row to the index.html file
  3. Add new entry from a template to the RSS feed
  4. Copy the HTML from the blog post into the feed entry
  5. Update the feed updated date
  6. Upload the files to my web server
  7. git commit

Oh yeah, I keep my whole blog in a git repository.

I've been doing this for almost ten years now, and I think it works great for me. I accomplished my goal of having a very low maintenance blog. For the technically inclined who are looking for a low maintenance blogging option, I can recommend the "no engine" solution. You don't need an engine to start blogging!

Jeff Johnson (My apps, PayPal.Me)