As per my last post, I am now in full control of this blog's faculties. A big motivation here was to start working towards incorporating various IndieWeb features, generally at my own pace and with my own considerations for how I want things to work.

The first step in that direction is having some support for webmentions, which really means "doing several distinct things that, together, constitute participation in an ecosystem that we call webmentions as a gestalt entity." Webmentions really are just a way of notifying a website that you linked to it—if you're old enough to know what a "pingback" is, webmentions are basically pingbacks but hopefully perhaps without the problems that plagued that system.[1]

Theoretically, you can just add a little metadata to your website page templates that points to an API endpoint that can receive webmentions (which is provided as a service by Webmention.io). You can then just treat webmentions as notifications you can see on that service.

But in practice, you want some way to display webmentions on your website, so that you can "close the loop" as it were. It's easy to treat webmentions just as private notifications, but it's nicer to be able to show them off! I need the social proof that people like and approve of the things I write!

I decided to set this up in a fairly "relaxed" way. This blog is a static website built with Eleventy; I have it set up so that it's automatically built on a server, rather than building it on my machine and uploading it somewhere to be hosted. When that build step happens, it fetches webmention data from Webmention.io and incorporates it into the static pages. This will happen whenever I update the blog by hand, but I also have a cron job[2] running to auto-rebuild the blog every six hours, which means that new webmentions should eventually appear without human intervention. This is in a sense a very dumb way to do things but in another, higher sense it's a very smart way to do things; I'd call this the "slow social" if I was able to purchase the domain name slow.social, which sadly I am not. "Sometime in the next six hours" is, I think, a very reasonable timeframe for comments to appear on the blog.[3]

For my own implementation I heavily referenced Reilly Spitzfaden's post on the subject, A Quick Guide to Everything I Know about Webmentions. Reilly used Eleventy to build her website, so a lot of the code she shares I was able to directly adapt. Natalie (nex3) also had a useful conceptual writeup on her own blog, which is really a more focused follow-up to her longer essay A Sociable Web. What I have working so far is very simple but the nice thing about all this piecemeal "microformat" stuff is how incremental you can be with it... I do not think the whole "indieweb" concept functions if the demand is that you have to monolithically implement every aspect of the system all at once or it falls apart!

As for sending webmentions, well, uh. After this blog post finishes building I am just going to use curl to send the relevant ones. There's an existing package of command-line tools for sending webmentions but alas they are written in Python and I am spiritually opposed to ever typing pip install into a terminal.

Anyway, ultimately: you are now on the hook to webmention me, ideally this post specifically, so I don't look like a fool. Thanks in advance!


  1. In truth it's unclear to me what, if any, anti-spam mechanism exists for webmentions. If nothing else, I think webmentions can't be used as a DDoS amplification tool? ↩︎

  2. Technically it's a Forgejo runner, but anything you can configure with */30 9-17 * * 1-5 style syntax is a "cron job", to me. ↩︎

  3. In practice, I think the Nice Way To Do This is to statically fetch most webmentions and then use client-side javascript to backfill more recent ones. I also think long-term you probably want to store older webmentions in their original json representation in the git repo along with the website, meaning that you're not demanding so much from webmention.io's database because you can only fetch stuff that is newer than the most recent one you have already stored. Both of these are optimizations for a putative future where I really am getting a lot of webmentions on the regular, though. ↩︎