hometools

al9000 Documentation

Or, how the al9000.com static site generator works
April 2026

Overview

These are my notes on the static site builder that runs al9000.com. I wrote it in Rust with MiniJinja providing the horsepower (MiniJinja being the Rust version of Jinja). The implementation is based of dozens of prior iterations built over the past several years.

The overall goal is to remove as much friction as possible from making web pages. And, not just blog posts, but pages with any given structure or content. The three keys that support that are:

  1. All content files are templates with the full range of MiniJinja features available for processing. Each one can output directly or be used as an include in another file.

  2. A global d variable is available in each template that contains the metadata from every content file as well as the data from every .json file on the site.

  3. TODO: Images don't require paths. They can be stored anywhere in the content tree and accessed with their filename alone.

Content Processing

Templates

Global Data

Page Metadata Access

File Path Data

The f variable holds file path data.

{
  "dir": [
    "docs"
  ],
  "dir_string": "/docs",
  "extension": "html",
  "name": "index.html",
  "path": [
    "docs",
    "index.html"
  ],
  "path_string": "/docs/index.html",
  "stem": "index"
}

Images

Open Graph Images

Filters

Functions

Local Tools

Standard Metadata

Standard page metadata tags I'm using:

Flags

Flags for customizing aspects of the pages are defined via a flags key in the TOML block. Individual templates are responsible for handling behavior changes from the flags. Currently, the only flag is:

Others will be added as necessary.

Templates can check for flags like:

== if "no-date" not in p.flags 
Show date here since no-date is not in the flags.
== endif