a very small static site generator
Go to file
Case Duckworth d29f07145a Copyedit
2019-06-30 23:55:54 -05:00
.gitignore Add .gitignore 2019-06-30 23:43:06 -05:00
lht "Naked" blocks must begin with "<" and end with ">" 2019-06-30 23:43:37 -05:00
LICENSE Add README and LICENSE 2019-06-30 23:42:27 -05:00
README.md Copyedit 2019-06-30 23:55:54 -05:00
unk Change names and shorter head/tail 2019-06-30 23:46:31 -05:00


a very small static site generator

UNK is an experiment in minimalism. It is a templating static site generator with an included markup language that all fits with 1000 bytes. There are three main scripts:

  • UNK, a bash script that applies the template to each page and publishes them to the output dir,
  • LHT, an awk script that serves as a (very) basic markup language, and
  • TM, the default template script for UNK.

UNK and LHT are 250 bytes each, for a total of 500 bytes. TM takes up the remaining 500 bytes of the target 1000 bytes. You are, of course, free to make the template file as large and involved as you like.



UNK takes a set of files in a directory, applies a template to them, and output them into another directory as HTML files ready for a server. To keep a very small size, UNK delegates most file processing to TM, the main template. It delegates by using an idea found in shab: each input file is read as a heredoc, which enables shell interpolation. So the template, as opposed to the engine, can do all the heavy-lifting of index generation and navigation and such.

Content goes into the following (hard-coded) directories:

  • I/, for written (__i__nput) content (the pages of the site),
  • S/, for static content (css, images, etc.), &
  • O/, for the (__o__utput) website, ready for rsyncing to a server.

If there is no TM in the directory where UNK is run, one will be created that will simply cat the file being processed.

The following variables are made available to TM:

  • FN: the FileName (with directories removed) of the file being processed
  • TT: the TiTle (the first line) of the file
  • BD: the BoDy (the rest) of the file

as well as this function:

  • X, for eXpand: the shab stand-in. It is much simpler than shab, and will fail if the template (or if it nests templates, one of the nested ones) has a ZZ on a line by itself, due to its heredoc nature.

and these aliases (though they're more an artefact of saving space in the script, but they can be used in templates):

  • c: cat
  • q: test
  • e: echo

As mentioned above, templates can be nested. Simply call another template from TM with the X function.


LHT stands for Less HyperText, because that's what you're writing when you're writing it (though not much less than HTML). Basically, blank lines are interpreted as <p> tag breaks, unless the previous source paragraph started with < and ended with >. It also has support for three inline spans:

  • *em* or _em_ as em
  • **strong** or __strong__ as strong
  • `code` as code.

Everything else is just HTML.

LHT was inspired, in part, by Writing HTML in HTML by John Ankarstrom, as well as some other articles I can't think of right now. I liked the idea, but some tags in HTML are just annoying to write over and over, and take me out of the flow of writing prose. So I fixed those few tags. The inline tags are definitely subject to change.


I was bored and decided I'd try to write a static site generator that could fit in a toot (500 characters). I wrote a few of them, making them smaller and smaller each time. By the end, I was left with a tiny script that delegated almost all the work to the template file. That script became UNK in this repo.

I was feeling pretty high on my horse after writing the tiny SSG, so I thought, maybe I could try for a tootable Markdown converter next -- boy, was I wrong about that. Markdown is way too complicated to fit in 500 bytes. So I just wrote the Really Important Parts: <p> and some inlines.


Copyright © 2019 Case Duckworth <acdw@acdw.net>.

This work is free. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See the LICENSE file for more details.

Why this license?

I was going to go with a stricter license like the GPL, but realized that

  1. this software isn't so important or time-consuming that I need others to credit me or redistribute the project under the same terms, and
  2. the GPL is way too long for a project like this. It's over 35 times bigger than the entirety of this project, not counting the content or this README. It would weigh down the entire undertaking. The WTFPL, by contrast, is a trim 443 characters, which is right in keeping with the smallness of this project.