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


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. Tokio provides a multi-threading runtime for regenerating notes, allowing I/Os to be scheduled asynchronously and multiple CPUs to help convert notes.

To publish the site, I push the resulting HTML and CSS to GitHub, which Netlify makes available across the internet. The HTML and CSS are small enough to leave un-minified, 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):


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

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

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

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

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-free site-specific search:

<form class="search" action="" method="GET">
	<input name="sites" type="hidden" value="">
	<input name="q" type="text">
	<input type="submit" value="Search">

Updated on 30 November 2021.