Map of the square and stationary Earth

Uriel is a minimalistic, stable, feature complete static site generator, written in Python.

Named for the archangel Uriel in the novel Unsong, whose job was to perform the fantastic and mundane work necessary to keep the world functioning.

Built to last for years without requiring any maintenance. It is feature complete, and only depends on Python and rsync, with no third-party module dependencies. That means that it won't break unexpectedly years from now, after you've built a site around it.

As long as you can still get a working copy of python3 and rsync, your site will still build the same way in the future.




Example Project - Boyd‘s Toast

The example project is intentionally simplistic and ugly, so that you won‘t be tempted to use it directly as a template for your own site.

Appreciate its raw simplicity, free from extraneous distractions. Figure out how it works. Then build your own web site from scratch, with your own superior and fashionable HTML, CSS, and refined sense of style.


  • Generates a static website you can host on pretty much any web server
  • Minimalistic philosophy and approach
  • Useful error messages
  • Built-in tag index system
  • Built-in breadcrumb navigation support
  • Flat URL support to make some or all content nodes top-level URLs
  • Inheritance and override system for content node settings and values
  • Optional dynamic naming of static files (to force browser cache misses for CSS and JavaScript files when content changes)
  • RSS feed generator, with ability to include or exclude content nodes from feed
  • sitemap.xml generator, with ability to include or exclude content nodes from sitemap
  • Minimalistic robots.txt generator
  • Ability to include unmodified static files
  • Ability to selectively override dynamically generated files with static files when necessary
  • Simple but flexible templating system
  • Supports a variety of useful built-in node/template replacement parameters
  • Supports arbitrary user-defined Python code in node/template replacement parameters
  • Supports arbitrary user-defined Python code in lifecycle handlers during generation
  • Ability to generate static pages dynamically from user-defined Python code
  • Implemented in pure Python 3, with no module dependencies
  • Stable platform to build on
  • Feature complete
  • Minimal dependencies (python3, rsync)
  • GPL version 3 license

Why another static site generator? Why this one? Because I wanted an extremely stable platform to build my own web sites on, that I would be able to maintain and understand many years into the future. For this project, simplicity and stability is prioritized over new features.

This web site is built with Uriel (along with various local Soju extensions). The photo gallery is a good example of the sort of non-trivial local customizations that can be built on top of Uriel.

If you prefer something with a maximal feature set, and all the latest features, this probably won‘t be for you.

On the other hand, this system is so simple that it will pretty much keep working indefinitely, without any ongoing maintenance. For me, this is the main appeal.



Uriel Cheat Sheet

Quick Start

Download and install Uriel

(You can also use it from a different path without root privileges.)

wget https://nathanrosenquist.com/uriel/uriel-1.0.1.tar.gz
tar -xzvf uriel-1.0.1.tar.gz
cd uriel-1.0.1/
sudo cp uriel /usr/local/bin/uriel
sudo chown root:root /usr/local/bin/uriel
sudo chmod 755 /usr/local/bin/uriel

Create a Uriel project directory for your new web site

uriel my-first-website

You just created the beginning of your new web site. In the “my-first-website” directory you just created, go look around at your new web site project directory.

The “public” directory is the generated web site, which is completely regenerated every time. Everything else in the directory outside of “public” is part of the project files. See the Uriel README and Uriel Cheat Sheet for more details.

A Makefile was generated in the root of your new website project directory. Type `make` after you make any changes to the project files to regenerate everything in the “public” directory.

cd my-first-website

When you're happy with your new masterpiece, copy all of the files under the “public” directory to the document root of your web server, e.g.:

rsync -av --delete public/ example.com:/path/to/my-first-website/public/