Changelog

I have begun keeping a sporadic list of things I change on the website as a timeline/chronology of the evolution of this site. This is primarily for my own use so I can quickly glance back and glean some context about when and why I might have made a change. I’ve opted to post it publicly to the site in case anyone else finds it interesting.

Switched map tiles provider from Thunder Forest Outdoors to maptiler.

Much prefer the topographic styling of these maps. They even offer a set of sattelite tiles if I decide I want that option in the future.

Before and after:

  .then(() => {
    var map = L.map('map');
    L.tileLayer('https://tile.thunderforest.com/outdoors/{z}/{x}/{y}.png?apikey=APIKEY', {
        maxZoom: 19,
        attribution: null
    }).addTo(map);
  .then(() => {
    var map = L.map('map');
    L.tileLayer('https://api.maptiler.com/maps/topo-v2/{z}/{x}/{y}.png?key=APIKEY', {
        maxZoom: 19,
        attribution: null
    }).addTo(map);

Created a ‘main’ feed to supplement automatic collections

Previously the main feed on the site, linked to from the <head>, was ‘everything’ but this is a bit of a firehose with all my quotes, notes, nonsense, and links et al, so I’ve created a ‘main’ feed with a few chosen collections included. Currently it mimics the front page.

You can of course still pick and choose which specific collection/tag feeds you want to subscribe to from the feeds page.

Finished the migration of the last lingering photographs and figures/images out of the static assets directory and into my TOML manifests.

Switched to TOML.

Previously I was using a pseudo-YAML for document frontmatter and JSON for the asset manifests. I’ve switched both to TOML, partly for it’s simpler parsing but really entirely because I much prefer its readability.

Now every document and asset is contained in TOML documents. A blog post is itself a completely valid TOML document that easily serialises into a Python struct. This has the advantage of bringing stricter validation to all data, and also opens up opportunities to build documents from structured data — something I’ve been wanting to do with data for the walk among other things.

The only issue I have with TOML is that there is no spec compliant way to have multiple TOML documents in a single file. Eventually this limitation may drive me back to YAML, but I don’t regret the migration at all. Now that I’m using a strict schema it will be trivial to migrate to JSON5, YAML, or even XML in the future if I wanted to.

Replaced my previous hand rolled site search that bruteforced an ungainly blob of JSON. Opted for pagefind as I knew I wanted to stick with static search that I can compile at buildtime. Will tweak styles later but you can see it working already at the search page.

Much faster and more robust.

By default it grabs the title from the first <h1> on the page which strikes me as odd, and doesn’t work for because not all my pages — like those I call nonsense — have a <h1>, so I added one of its data attributes to the title element in my document head template and set the result icon to my site favicon for all pages that have no images:

<head>
    {% block head -%}
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="generator" content="The humble hands of Silas" />
    <meta data-pagefind-default-meta="image[content]" content="/favicon.png" />
<title data-pagefind-meta="title">
    {%- block title -%}
        {% if page -%}
            {{ page.title -}}

Added dependency:    pagefind
Removed dependency:  my terrible javascript skills

Used Anthropics Claude 3.5 Sonnet LLM to iterate on a new JavaScript lightbox/gallery for my site that solves the quirks and annoyances of my previous attempt. Namely it now closes on browser-back as users expect, prevents scroll when the lightbox is open, and a couple other things. Simon Willison is right, this level of assistance is a magical boost when it comes to quick development of discrete code/tools.

Removed dependency: lightboxjs

Deprecated and removed the somewhat ambiguous id:: substitution reference in favour of slug:: so that it is always clear what a reference will be substituted with. This change also obviated the need for the misc:: handler, so that was culled from the code too.

Made created a required metadata element, removing previous behaviour whereby it could be omitted and auto populated using the published field.

Switched from separating YAML metadata in a for loop, to using the Python Frontmatter library.

Added dependency:   Python Frontmatter
Removed dependency: PyYAML

Replaced author metadata element with creator as I gradually formalise the metadata terms used in my own infrastructure. creator generalises much better to a broader media set. For example: if I’m referencing a video then author does not make a great deal of sense.

MILESTONE 100,000 words! Here, on this little site of mine. Six figures of attempts at speaking.

Added the lightgallery library to the site for multi-image galleries, replacing my previous self built solution.

While I slightly mourn adding a dependency, it’s all self-hosted, and the resulting lightbox is much more robust and suited to the growing audience of this site.

Added pillow-heif to build requirements to support compressing/processing HEIC images. For the time being HEIC/HEIF images are turned into JPEGs as browsers don’t natively support them.

Fix: Non-modal images no longer appear clickable via cursor and opacity shift

Dropped Cloudflare.

This site was previously hosted via Cloudflare Pages, today I migrated back to a server that I control.

Switched from markdown to Djot (See SEP 13: Switch to a more reasonable source markup language) for lightweight document markup. Djot offers many conveniences in terms of consistency and reasonability.

This change required syntactical tweaks be made to virtually all documents, but the pay off in terms of having a thoughtfully considered, simple, robust syntax feels significant.

In Djot raw HTML has to be explicitly declared. This has numerous advantages, again mostly having to do with predictability. No longer is it a guessing game as to whether output will be mangled or needs escaping.

Speed of HTML generation has been improved despite a rough implementation that currently shells out to an external Djot parser (Jotdown) as there is no Djot parser currently written for Python.

Not logging a specific change, simply recording here that the average full site build time now exceeds 2.5 seconds. This is with a total of 84457 words published to the site across 5 document types, 17 document classes, 28 document tags, and with 182 internal links between documents. Not any kind of problem, but thinking long term it makes sense to finish implementing SEP 35: Incremental builds in order to maintain the tight, iterative feedback loop of revise/rebuild that works so well for me.

10:52:29 Imported modules in 0.143 seconds
10:52:29 Setup environment in 0.0 seconds
10:52:29 Defined functions in 0.0 seconds
10:52:30 Ingested documents in 0.552 seconds
10:52:30 Inserted substitutes in 0.139 seconds
10:52:31 Generated HTML in 1.191 seconds
10:52:31 Built backlinks in 0.003 seconds
10:52:31 Built collections in 0.002 seconds
10:52:32 Wrote out HTML files in 0.403 seconds
10:52:32 Built feed stylesheet in 0.002 seconds
10:52:32 Built feeds in 0.129 seconds
10:52:32 Built sitemap in 0.003 seconds
10:52:32 Copied assets in 0.015 seconds
10:52:32 Processed assets in 0.015 seconds
10:52:32 Built in 2.604 seconds

Implemented the first incarnation of document transclusion, allowing me to include whole documents from within other documents.

Removed hand drawn lines introduced a year ago, they only add clutter.

Comprehensive metadata overhaul. Implemented the — long ago proposed — document types to the site taxonomy, as well classes.

🏗 SEP 26: Make page/site metadata accessible from HTML

MILESTONE 75,000 words on the site.

Fixed footer to bottom of viewport. Besides being more visually consistent when documents are short, also allows for paging between short documents (changelogs, nonsense, etc) using the navigation links in the footer as they are always in the same place (unless a document is longer than the view height).

Partial rewrite, significant changes to major subsystems.

Overhaul backlink extraction in order to drop BeautifulSoup as a dependency, (See ✅ SEP 16: Extract backlinks from plaintext). New system works on the plaintext documents directly which offers greater flexibility, consistency, as well as being lighter and faster.

Add collision checking (✅ SEP 14: UUID collision checking) amongst UUIDs, necessary for several reasons including effects on SEPs 12 and 16.

Add insert_substitutes(): function for all pre-processing of plaintext prior to HTML conversion. The major component within is currently the implementation of internal UUID referencing.

Overhaul build_html() function into a new, leaner, simpler generate_html() function made possible by the changes above.

Secondary benefit: 30% faster builds

MILESTONE 50,000 words published on the site.

Subset Inter font family, reducing font assets from 312KB to 60KB.

Implemented stylesheet cache-busting by appending the MD5 hash of the stylesheet as a [URL query string].

Fixed backlinks not all populating due to KeyError

Added a /humans.txt page. Had come across them before, but credit to Dave Gauer and his humans.txt for prompting me to add one of mine own.

Added the Inter font, prefer it’s spacing and readability. Currently only supporting WOFF2 as unsupported clients can always fall back to system defaults. My only gripe with Inter is I feel its italic type is much too subtle for a sans-serif font.

Added ‘breadcrumbing’ to all leaf posts, making it easier to navigate ‘back up the tree’ of a series or return to parent category.

Integrated some art that I admire into the ‘hub’ pages of the site.

Added nonsense, my little tumblog/twitter/microblog/stream of unconsciousness page, another room to fill with words and noise.

Removed handwritten font face, realising that it doesn’t suit my design principles, chiefly my desire for a cruft-free reading experience.

Reverted change to feeds made on Mar 20, 2022.

Take silasjelley.com/feeds/notes for example, why not place its feed at silasjelley.com/notes/feed? In that example I agree that the latter structure is just as elegant and useful as the former. But what if I want to create arbitrary feeds such as a feed that combines the notes and glossary collections? Where would I put that? Situating all feeds beneath silasjelley.com/feeds allows for taxonomical freedom. In this case: silasjelley.com/feeds/notes+glossary.

Crossed 25,000 words published on this little post-it note of a website.

Added a handwritten font face to be used for <time> elements.

Added a questions page containing a few questions I would love to receive other people’s input on.

Introduced hand-drawn-style lines for underlines and horizontal rules to break up the hard edges of the site.

Changed feed path URIs from the form /feeds/collection to /collection/feed to make them more intuitively discoverable.

Added a page to guide visitors in how to use this site.

Added a now page, cribbed from Derek Sivers.

Added search to the site.