2026

I've changed the Library page to be a little more streamlined, and I've added a bunch of new features:

  • List, Cards, Compact, and Covers views: All sub-pages that actually display books now have these four views to choose from. List is... a list (surprise), Cards are the same as before, but now you can also view the books in the Compact view (smaller front cover and only the title), and Covers (only the front cover).
  • Pagination: Almost all of the sub-pages (except really short ones) are now properly paginated, with options to choose how many items are displayed per page.
  • Filters and sorting: Every sub-page now has appropriate filtering options (and even some advanced ones), and a plethora of sorting options (even some fun ones to do with the covers; see below).
  • Search: There was a search option before, but it was weak and didn't include the option to search the whole catalogue at once, which you now can.
  • Cookies: The state of the filtering and sorting that you do are now persisted in cookies that live for 1 year, so you don't have to redo it all when you browse around.

I wanted to have a tiny view of the front covers (the Covers view) for a specific reason, namely to be able to sort books by visual features of the front covers. I've currently implemented three of them, but I plan on adding more:

The current maximum per page is 500, so make sure to go through the pages if you want to see the full effect. I'm very tempted to add the choice of no limit, because it's really cool to be able to view absolutely every book in these new modes. We'll see.

It's here! The long-awaited total revamp of my website! I call it Concordance. I'm stoked. Most of the changes are, in fact, on the back-end, but they enable me to much more easily maintain my website, and in particular, they enable me to drastically expand it. Most notable for returning viewers is not only the new coat of paint, but also the new navigation bar. It's now a proper tree, with nodes and leafs, which can be as deep as I want it to be. And every page has a canonical URL which is totally separate from its position in the tree, so if I want to re-arrange things in the tree, I can do that without fear of breaking links.

Also new is the sticky breadcrumbs at the top for easily identifying where you are in the tree, which I'm very happy with.

The Library page (formerly Books) has been heavily reworked, now having lots more ways to browse, sort, and filter, thanks to a complete rethinking of how to structure the relations in the database. Without going too much into the details, it involved a lot of normalization and the creation of some junction tables which really should have been there from the beginning (like the separation of author from contributor, and contributor from role), and the implementation of sound keys (particularly foreign keys) to ensure data integrity.

There are many small changes here and there (mostly to do with navigation and styling), but no new content per se. I did finally integrate the two Off-site pages Llamaphobia and USN, which were formerly just their own sub-domains.

For those interested, here's a list of technical things that have changed:

  • I made a home-brewed front-loader to resolve URLs and load in proper content, instead of loading header and footer templates into every static page. This means I have full control over what can be reached by a naked URL by putting stuff in a public vs. private section in my web hotel (if I ever change my mind about which section something should be in, I can simply move it). This also means I can make custom plugin helper functions for specific pages that use more advanced routing (like the new Library page, formerly Books). An .htacces file directs legacy URLs to my new front-loader, which handles legacy links, so no old links should be broken. (If they are, please let me know.)
  • I now consistently use PHP's PDO (PHP Data Objects) to handle all database interactions, in addition to prepared statements. This is technically not necessary since all database calls that are public-facing (like Search features) are for fetching only, but this is a new layer of security that I didn't have before. (Though the old system did use mysqli::real_escape_string, which was better than nothing, but now with prepared statements, I don't even have to think about it.)
  • I use cocur/slugify (with some tweaks) extensively for all URLs, especially for the Library page. For instance, the URLs for all the detail pages of individual books are now in the form {slugged-title-in-kebab-case}--{author-last-name} instead of the old {book_id}. So e.g. 78 now becomes the-caves-of-steel--asimov which is much more readable.
  • I upgraded from MathJax v2 to v4 (I skipped v3). There's a lot of new features in v4 that I eventually want to take advantage of, to be explored more thoroughly when I write more math-heavy pages, which is coming.

All this makes me incredibly happy, mainly because I don't have to maintain two separate codebases (a headache), but also because I've streamlined so many janitorial tasks that I previously had to do manually, that I'm free to spend my programming energy on more fun things, like new content!

There are 2 posts for 2026.