This page documents how this territory came to be built.

Tech Stack

This site is built with the Hexo static blog framework, using Pug as the template language. The theme is hexo-theme-ares, which I forked and reworked from hexo-theme-hermes.

The site used to be hosted on Netlify and protected by Cloudflare -- now it's self-hosted on an IONOS VPS! Yes, I've written an article about digital sovereignty, but given the reader experience and my wallet, a US-based VPS provider was the only option left...

The site's source code is public, see here. A backup lives here.

Webmention

This site has Webmention set up -- a W3C Recommendation that lets different sites notify each other about mentions, replies, and interactions, functioning like a decentralized comment system.

How to Interact with This Site

Some posts are cross-posted to my GoToSocial account @cytrogen@gts.cytrogen.icu when published. You can reply, like, or boost these posts directly on the Fediverse, and those interactions get converted into Webmentions via Bridgy, which then show up automatically at the bottom of the corresponding post.

You can also write a post on your own blog or site linking to an article here -- as long as your site can send Webmentions, this site will receive and display the notification.

Technical Implementation

This site receives and stores Webmentions through webmention.io, while Bridgy bridges Mastodon replies, likes, and boosts into standard Webmentions. At build time, the site pulls data from webmention.io, groups it by type (replies, likes, boosts, mentions), and renders it statically into the post pages. A job on the VPS checks for new Webmentions every 30 minutes and patches the changes directly into the corresponding page's HTML, without a full rebuild. Posts themselves are marked up with Microformats2 (h-entry, h-card, etc.) so that Webmention senders can parse the content correctly.

Email Comments

This site has an email-based comment system attached below each post, modeled on how mailing lists work: write an email to leave a comment, and reply to someone else's comment by email too. It's experimental and hasn't been fully battle-tested for stability -- if you just want to reach me, the email address on the contact page is the safer bet.

How to Interact with This Site

Each post's comment section shows a dedicated address in the form post-{post ID}@blog.cytrogen.icu. Email it directly to leave a comment -- the subject line doesn't matter, and the body is your comment. The first time you comment, your address goes into a moderation queue; once approved, it's whitelisted, and from then on your comments show up immediately as long as the email passes SPF/DKIM checks.

Once a comment goes live, it's forwarded like a mailing list to the other commenters on that post, and recipients can just reply to join the discussion. If you no longer want notifications for a given post, there's an unsubscribe link in the notification email. The reply link next to each comment generates an address encoded with that comment's own identifier -- replying to that address threads your message precisely under that comment, whether you're a longtime participant or a total stranger, with no need to be a subscriber first.

Only your name is shown publicly; your email address is never displayed.

Technical Implementation

Emails are received by a self-hosted Stalwart mail server and, via an MTA Hook fired at the DATA stage, forwarded to a long-running Node.js process. It parses out the post ID (and, for precise replies, the parent comment identifier encoded in the address) and writes the result to a local JSON file, with comments from new senders landing in a pending queue. A scheduled job running every 5 minutes reassembles approved comments into a nested discussion tree, generates static JSON for the page to read, and forwards new comments to the other participants on that post. Comment nesting is resolved first from the parent comment identifier encoded in the address, and only then from the email's own In-Reply-To header -- because mailto links can't reliably pre-fill a header like that, and only a precisely encoded address guarantees that anyone can reply directly to one specific comment.

Fonts

Body text uses Georgia and Times New Roman for Latin characters, and Source Han Serif (CN/JP) with Noto Serif (SC/JP) for Chinese.

Headings use Open Sans for Latin characters and Noto Sans (SC/JP) for Chinese, falling back to the system default sans-serif.

Code uses JetBrains Mono, supplemented by Source Han Code JP and the system default monospace font.

Content Map

This site mainly carries three kinds of content:

  1. The Idea Iteration monthly column, see category. Note that I don't publish it on a fixed schedule -- usually it comes out around the end of the month it covers;
  2. Technical posts;
  3. Personal musings -- could be about anything, honestly, and it shows.

Subscribing

You can subscribe to this site via RSS.