Colophon

This site is generated with a Rust program, from a directory structure that looks like this:

/pages/index.md
/pages/colophon.md
/pages/...
/notes/<subtopic>/<note>.md
/static/style.css

This structure makes it easy to update the site with a common text editor, as opposed to a web interface normally found in blog engines. There’s support for articles and updates, but it’s difficult to maintain a steady stream of substantial, write-once content.

Pages and notes are written in Markdown, to make adding emphasis, code, headings, and links easy. The Rust program uses pulldown-cmark to convert the Markdown to HTML and Askama to incorporate that HTML into templates that provide a consistent look and feel for each page.

To publish the site, I push the resulting HTML and CSS to GitHub, which Netlify makes available across the internet. The HTML and CSS is left un-minified or compressed, so it’s easier to inspect for curious visitors. I made a short update script to automate the process of committing the changes both to the Markdown source repository (site-content) and HTML result repository (site-out):

#!/bin/sh

set -o pipefail
set -o errexit
set -o nounset

msg="$*"
len=`echo "$msg" | wc -c | sed -E 's/^ +//'`
if [ $len -gt 50 ]; then
	> /dev/stderr echo "error: message is $len characters"
	exit 1
fi

if [ -z "$(git -C site-content status --porcelain)" ]; then
	> /dev/stderr echo error: site-content is clean
	exit 1
fi

if [ -z "$(git -C site-out status --porcelain)" ]; then
	> /dev/stderr echo error: site-out is clean
	echo consider implementing automatic rebuild
	exit 1
fi

git -C site-content add .
git -C site-content commit -m "$msg"

git -C site-out add .
git -C site-out commit -m "$msg"
git -C site-out push

The site doesn’t use any JavaScript or resources from other domains and there are no referral links or cookies.

The 404 page includes this HTML for a JavaScript-less site-specific search:

<form class="search" action="https://www.duckduckgo.com/" method="GET">
	<input name="sites" type="hidden" value="mattwidmann.net">
	<input name="q" type="text">
	<input type="submit" value="Search">
</form>

Updated on 12 September 2021.