Meta notes about this website. (See also: About.)


This site is built using Jekyll with custom layouts, plugins and scripts.

Bidirectional links are generated by a modified version of a plugin provided by the Digital garden Jekyll template.

I had two goals in mind when deciding how to build this website:

  • Short-term: Bootstrap the site using familiar tools.
  • Long-term: Build custom tools to fit my needs.

Jekyll was the best choice for me to get started: I’ve used it before, and it’s customisable enough to hack together something with unique requirements. In the process of building this site, I’ve made some open-source contributions to Jekyll and the Rouge syntax highlighter. Later, I hope to open-source the customisations I’ve made for this website.

Deployment process

I use this shellscript (named to deploy changes to the website:

set -eu

deploy() {
  rsync -achvz --progress --delete-after --exclude '.DS_Store' \
    "${BUILD_DIR}/" "${REMOTE_HOST}:${REMOTE_PATH}/" "$@"

printf '\n== DRY RUN ==\n'
deploy --dry-run

printf 'OK to deploy? [yN] '
read -r answer
[ "$answer" = 'y' ] && deploy

This script uses rsync to efficiently upload files from my local machine to the web server. First it performs a trial run (or dry run), showing which changes it would make; then, it prompts to confirm the changes.

The script requires three environment variables:

The hostname of the server, e.g. This can be an alias defined in ~/.ssh/config.
The full path to the website on the server, e.g. /var/www/
The relative path to the files you want to upload, e.g. build.

The script makes two connections to the server because of the initial dry run. However, you can reuse the initial connection using SSH multiplexing.1

To simplify the deployment process, I use a Makefile like this:

REMOTE_PATH = /var/www/

	JEKYLL_ENV=production bundle exec jekyll build -d build

deploy: build
	BUILD_PATH=build bin/

.PHONY: build deploy

With this, I can run make deploy to build and deploy changes to the website.


Fonts used on this website include: