My website is now its own social media account
Five years ago I wrote about making this website come to life by connecting it to social media. The idea was, and still is, that my writing lives here, and the conversation about it should show up here too. For most of those five years, the connections ran through other people’s services: webmention.io collected the comments, Bridgy and later Bridgy Fed carried my posts out to Twitter, the fediverse and Bluesky, and carried the replies and likes back.
Last week I cut those out. This site is now its own fediverse account, its own Bluesky account, and it receives its own webmentions. Nothing sits between you and it except the protocols.
Five years ago I wrote about making this website come to life by connecting it to social media. The idea was, and still is, that my writing lives here, and the conversation about it should show up here too. For most of those five years, the connections ran through other people’s services: webmention.io collected the comments, Bridgy and later Bridgy Fed carried my posts out to Twitter, the fediverse and Bluesky, and carried the replies and likes back.
Last week I cut those out. This site is now its own fediverse account, its own Bluesky account, and it receives its own webmentions. Nothing sits between you and it except the protocols.
Why#
I wanted the experience to be self-contained. When somebody replied to a post, the reply went to Bridgy Fed, which turned it into a webmention, which went to webmention.io, which my build picked up on its next run. Every one of those hops was a place where things could go quiet without anybody noticing.
And I wanted to push the boundary of what I can do with self-hosted web publishing and social media on one small server. The site had already grown webmention push notifications and a little mobile posting pipeline. The obvious next question was: how much of the social part can live here too? It turns out, pretty much all of it.
Let me be clear about Bridgy Fed, though: it is a gift to the open web. It did exactly what it promised for a year and a half, and its migration tools are the reason this move was possible at all. If you want your website on the fediverse this afternoon, Bridgy Fed is still the answer.
The new setup#
There is one static website, plus three small services.

A webmention receiver. A small Rust service now accepts webmentions for stephanhagemann.com, verifies that the source really links to the target, stores the source, and keeps a copy of the author’s photo so comments don’t depend on somebody else’s avatar server. The same service was already sending the push notifications for new comments, so it is now the one place where every interaction lands.
A fediverse account. A Fedify service makes this site a fediverse actor. The handle is now the short one: @stephan@stephanhagemann.com. My favorite part is that a post’s URL is the post. Ask for /posts/<slug> with a browser and you get the page. Ask for it with an ActivityPub Accept header and you get the object that Mastodon sees. There is no second copy somewhere under a bridge’s domain. Replies, likes, boosts and quotes arrive in the service’s inbox and go straight into the webmention store, next to the webmentions proper.
A Bluesky account on its own PDS. The Personal Data Server is Bluesky’s own, unchanged, running as one more container. The account kept its identity (the DID), so the handle, the posts and the followers all came along. An adapter publishes new posts to the PDS and polls its notifications for replies, likes, reposts and mentions, which end up in the same store as everything else.
Then there is the thing that didn’t change: the site itself. Posts are still Markdown files in a git repository, and the site is still static, rebuilt regularly. The services read the build’s output and deliver it; they don’t own anything. A reply from Mastodon shows up on the post page at the next build, like it did before. Slowcial, as I called it when I tested the posting pipeline last year, is still the right speed for me and this website.
What moved and what got lost#
The fediverse migration is an ActivityPub Move: the old account tells its followers’ servers “I am now over there,” and the servers follow the new account on your behalf. Some of them did. If you followed this site before and the follow didn’t make it, please search for @stephan@stephanhagemann.com and follow again. I’d love to see you back!
What the Move does not carry is the other direction. The accounts I followed through Bridgy Fed stayed behind, and the Bridgy Fed account is gone now. I rebuilt the list by hand, and in the process gave it a home that cannot get lost again: the people this site follows are a YAML file in the repository. The service follows exactly that list, on whichever network a handle belongs to, and collects what those accounts post into a timeline on a private page. Following somebody now means a git commit. I get more joy out of that than I probably should.
What this is not#
This is not a Mastodon client. I do not act as the account from a phone app. The private timeline is rudimentary, and there is no reply button (yet). When I want to answer somebody, I write a reply post here, and the services deliver it to the thread it answers, on the fediverse or on Bluesky. The site is the account, and everything the account does is something the site published.
Chatter
Replies arrive as webmentions via the IndieWeb.