3 This blog is manually built and updated with the aid of GNU Make (see
 
   4 `GNUmakefile`; requires `deno` as well as `rsync` >= 3). The commands
 
   8 make blog # builds the blog
 
   9 make dry-sync # optional; to see what will be updated
 
  10 make sync # syncs the changes and also updates the remote repo
 
  13 `make dry-sync` and `make sync` will refuse to run if the working tree
 
  14 isn’t clean or if the last‐modified time of `.grass` is less than the
 
  15 commit time of the latest commit—this is to ensure that the remote
 
  16 repository and the built website don’t differ. `.grass` is touched each