Recently I was permanently locked out of my proprietary messenger due to some unfortunate circumstances around 2FA. I took it in stride though. For years switching to XMPP had been on my todo list. Standardized, decentralized, end-to-end encrypted; whats not to like? Well…
Using XMPP as a messenger has a bit more hidden complexity to it than meets the eye. XMPP by default is about as featureful as IRC. No encryption, no file sharing, just a plain transfer protocol. XMPP gets its good features from XEPs. These are extensions built on top of the XMPP protocol that provide all kinds of functionality needed for a modern messenger like end-to-end encryption, profile pictures, media sharing, even voice calls.
The problem is that:
For many of the most important XEPs like the ones that add message encryption, no modifications are needed on the XMPP server’s part. It all happens client side. The nail in the coffin of XMPP is that there are no cross platform open source client. That means the clients on Android support a different set of XEPs than the ones on Windows, and on iPhone, Mac, etc. There is no cohesive standard for modern XMPP messengers that is widely enforced. Unless all the clients settle on supporting the same set of XEPs, someone is going to have a broken experience. So, unless you are ready to excommunicate the iPhone users among us and live the very lonely life of a hermit, XMPP is off the table. You can see a list of client software and their feature support below.
Now to touch on user experience. Setting up Prosody, the XMPP server I chose, wasn’t too bad. I used lots of clients during testing and Dino was probably the nicest looking, but it doesn’t work with self-signed SSL certificates. In most other clients like Conversations and Gajim they give the user a warning with the option to trust the certificate. Dino does not, it refuses to work without a CA cert. Conversations had a pretty average user experience. Gajim is dead ugly (this matters to normal users).
So due to bad cross platform and even cross client incompatibility, XMPP is off the table.
The next chat solution I settled on after giving up on XMPP was Matrix. Specifically the Element Matrix client. I’ll spoil the surprise upfront by telling you that I did choose to use Matrix for my chat solution. On the surface it seems like Matrix has all of the benefits XMPP offered: decentralized, standardized, open, and has end-to-end encryption. So why didn’t I choose Matrix from the start? The short version is that Matrix is a lot heavier than XMPP; the Element app is slow, the server software is written in Python and its also slow, and the setup is much more complicated.
I’ve been using Matrix/Element with my group for some time now, and it has managed to be just okay enough that I didn’t lose any friends over it. But that doesn’t mean Matrix is good.
Note that the following complaints may just apply to the Element client, not the Matrix protocol itself.
There are also the more technical issues like the meta-data leakage issue of the Matrix protocol, but I’m not going too in depth here. On a more positive note, the Matrix developers have been working on a better server implementation for a while now which promises much better performance. In addition fixing some of those UI complaints would not take much effort and would significantly improve the sanity of the user experience. One thing that I don’t think anyone is working on is a Matrix server installer/setup wizard. That would have greatly benefited me since I just wanted a vanilla setup, and the setup process seems much more involved than you would expect. The docs were okay but there is no comparison between reading docs and running an installer. Overall, if you have a day to spend tinkering with Matrix, I do think its worth setting up. Just be prepared for a less than consumer grade experience.
The mediocre Matrix experience has me trying even more chat solutions. In particular peer-to-peer apps like Briar, Jami, Session, and Quiet. I will be writing another post about those apps after I test them.