More and more I find myself using the fediverse (based on ActivityPub) alongside Matrix, and the two protocols complement each other nicely in some ways. In other ways their differences seem needless and jarring, only getting in the way. I'd like to be able to offer my contacts the free choice of which protocol to use, depending on what kind of communication they intend (public-ish versus private or group-ish), without everything else being different — especially the user identifier/addressing but also many lesser issues such as the existence of user profiles.

I have long remained hopeful we'd get use profiles eventually. Conceptually it's not a big deal. So where are we now and where are we going?


I wrote this piece in response to a particular organisation that empowers local people to create tech solutions matching community values, on hearing they chose to use Discord because of its “usability”.

I was dismayed. To me, the choice embodies the opposite of the organisation's values.

“Discord is great for enabling our community,” people tend to say: it's “free”, and it's great to use, once you're inside. I know. Those are some more-or-less correct facts about it, on the surface.

So what's my beef with it? Why am I so upset that I spend hours writing this? Why can't I just see the value in it, see the pragmatic decision, see that using it benefits the community's work, and be happy for us all?

I nearly replied on the spot, a quick denigration of the decision, but I realised it deserves a much more detailed and balanced response. I think about this stuff all the time. I should be able to express my position clearly and helpfully.

My immediate reaction: I'm so fed up with seeing one supposedly public-values project after another locking itself in to yet another walled garden. I'm fed up with one supposedly open-participation community after another assuming I'm willing to subject myself to yet another Big Tech walled garden if I want to engage. There's a reason I ditched Google and the rest: because I care about using open tech, community-values tech. I care about not being forced into using and depending on a third party against my will, especially when that's a company working in opposition to my values.

You, the community organisers, will certainly have thought of this, I soon realised, and I suppose you decided you need to prioritise a higher level kind of community tech: getting people to work together to create something their community owns, even if they don't own the tools for doing so. That's the main goal of your work and I respect and admire your endeavour. Of course you have to focus on that, and make it possible for your contributors to focus on that.

First, I'll unpack why I'm dismayed. Second, how to keep the gate open (by bridging), as a practical and community-valued way forward if one portion of the community is going to be using Discord.


Last week I was setting up Draupnir on my matrix test rig, in order to become familiar with Draupnir deployment before I integrate it with PubHubs.

Now I need to address end-to-end-encryption (E2EE). PubHubs exclusively uses encrypted matrix rooms, and Draupnir doesn't yet have E2EE functionality built-in. (Why is that? Moderation in public rooms is Draupnir's main use case, and for several reasons public matrix rooms are usually not encrypted. However PubHubs is different.)

There is a generic solution for adding E2EE to a matrix bot, and it's called Pantalaimon, an “E2EE aware proxy daemon for matrix clients.” So this week I'm setting up Pantalaimon.


This week I'm setting up Draupnir on my matrix test rig, in order to become familiar with Draupnir deployment before I integrate it with PubHubs.

Very glad to be able to use matrix-docker-ansible-deploy's Draupnir setup to automate the majority of the Draupnir deployment.

I also want to automate, with Ansible, as much as possible of the set-up that is required before running that playbook. I aim to document here what I have done and open questions about it. The numbered steps here correspond to the manual instructions in that documentation linked above.


Last week

  • I officially received confirmation of funding. (Thank you, PubHubs team and Dutch government open-source funding team.)
  • I re-joined the project team after a summer break, having previously joined them as a volunteer, and joined a general meeting and a technical meeting.
  • I posted a short announcement/introduction on my blog.
  • I updated and re-started my own test-bed installation of Pubhubs components.
  • I made some progress on my Ansible installation scripting of Pubhubs components.
  • I joined the new pubhubs-hosted project discussion room, in a “stable test hub”, which we would like to use instead of Slack, both for reasons of living our values and to “eat our own dog food”.
  • In our pubhubs dev room, we discussed implementing email notifications using Synapse's built-in support, which would be very useful for us maintining a long-term conversation in the room; and we discussed briefly some privacy implications if we wanted to offer follow-up notifications by email, or in other ways, to users who would like to remain pseudonymous.

This Week

  • Get some part of my Ansible deployment tested and published?
  • Start self-hosting Draupnir (on a normal matrix server) to get experience of deploying and using it.

Tech note: Dependency Updates

Updates needed, since around June/July.

  • dependencies: NodeJS and NPM: update to later than Node 12 (which was installed via Debian 11 packages). I now install via Ansible role geerlingguy.nodejs, which in turn uses the nodesource.com APT repo, and currently defaults to Node 16.
  • dependencies: add package libssl-dev, required by Cargo openssl-sys package dependency (error was failed to run custom build command for openssl-sys v0.9.60).

PubHubs icon

#PubHubs #matrix


Rooted Software Ltd., September 2023

I am delighted to be joining the PubHubs project, working on adding moderation tools.

PubHubs icon

Public Hubs

The purpose of PubHubs is to enable real-world public organisations such as libraries, broadcasters, schools or health care, to provide online group communications for local citizens, in ways which match their real-world values and needs.


I am experimenting with sharing my diary entries with my family, using the awesome matrix-based FUTO Circles app. I write in an offline Diary app. My off-line diary is perfect for my diarying, and Circles is a great tool for sharing stories. What I want to do is combine them, posting my daily diary entries perhaps at the end of each day, as Stories (is that what we call them?) in a Circle.


Decentralised linking from the Web (HTTP contexts) to a matrix user or room.

Status: This is a proposed, draft specification for consideration by the matrix development community. This version was initially posted before any discussion or feedback.


Decentralised linking from the Web (HTTP contexts) to a matrix user or room.

Or, “Let’s decentralise matrix.to!”

What’s this?

Matrix is supposed to be a decentralised protocol [MATRIX]. While much of it is, an important part isn’t. Matrix uses matrix.to [SPEC-TO] as a centralised mechanism for linking and invitation to matrix resources from HTTP contexts.

We can do better than centralised.

This is a proposal to fix an important part of that problem.


I have been trying out a matrix-based blog comments system.

WriteFreely is a simple self-hosted blogging system. It uses Markdown for content. To let readers subscribe to follow new posts, it supports both RSS and ActivityPub (Fediverse). It has no comments system of its own.

Cactus Comments is a simple self-hosted comments system. It lets us add a comments section to any web page we control, such as a blog. It uses Matrix for the comments.

I describe a self-hosted deployment.