My XMPP eXperiences

Page last updated: October 20, 2021

I've been using XMPP for some weeks now, and have recently decided it'd be great to document both the bright side and the pitfalls and minor setbacks of the protocol/clients that support it - basically, my whole experience with moving most of my friend/acquaintance circle from Telegram to XMPP. I also use this page as generic notes on "how to achieve the thing I want but forgot how to do".

Let's start with the basics.

Client of choice: Psi+

I've tried Profanity for a short time but didn't really get to like it, and Psi+ has a cool old-ish interface. Not too whitespace-y in the message window, and generally a delight to look at, by my weird standards&tastes. Has an OMEMO plugin, too. Honestly, I have an unhealthy relationship/obsession with it

Other good clients (based on people in my contact list): Gajim (implements some things even better than Psi+, but I'm reluctant to switch; I don't like Gajim's design much), Dino (god, the interface... but it works! and even sends images to Psi+, how cool is that?), Conversations and (these two are Android-only).

Server of choice: Disroot

No particular reason for this decision, it's just that I already had an email address at Disroot and decided to not register one more account. Disroot's privacy policy seems sane too (although there are things I'm slightly unhappy with).

Other good servers (based on people in my contact list): (no issues whatsoever),,, Dismail seems good too and I have an account lying around (because of an email address, same as Disroot), but I've never used it much.

See a better comparison of XMPP servers here and here

OMEMO-encrypted 1:1 chats

These are mostly super easy. Generate a key, convince the other party to do the same and exchange those keys. Most mainstream clients have this functionality built-in or in the form of a plugin. Then OMEMO should probably work after one press of an "OMEMO encryption" button. Well, that's more or less how it worked for me, anyway.

The "OMEMO-encrypted MUC (groupchat)" incident

These are tricky to set up. Basically, you need to make a normal groupchat, and then make it "non-anonymous" (meaning that JIDs can be viewed by anyone) and "members-only". (Almost) every client will have something like that in the settings of the groupchat.

After that, just give people the name of the groupchat & the password if it has any (in this case you'll also have to add their JID to some member list), or as an alternative "invite" them (the painless way).

Some clients also have issues with fetching encrypted groupchat history. Well, Conversations, and Gajim sure don't have any issues, so it's good to switch. But I would never take my own advice here, so I'm trying to fix Psi+'s OMEMO plugin to log groupchats. Almost done...

UPD: all done! Scroll to see a "how-to" on this.

Also, some clients seem to require adding everyone from the groupchat to their contact list. But I still haven't figured which ones. Psi+ and, it seems. You can have "hidden" contacts in Psi+, though.

OMEMO-encrypted MUC/groupchat logging

1. Enable the Conference Logger and OMEMO plugins.

2. Now you hopefully have a "chat history" button in the toolbar of your groupchat window, just above the message input area. Click on it.

3. ????

4. PROFIT!!!!

Image sending

I can't, for the life of me, figure out how to do it. When I do, I'll write this section down. Just as a placeholder, here are client->client connections that work (in my experience):

And here's what doesn't work:

Everything else is untested as of now. Judging by Psi+'s logs, there's something wrong with the Jingle transfer...

Syncing OMEMO keystores with different clients

Dunno how to do it, sorry. This might be an issue for people participating in any OMEMO-encrypted groupchats and logging in with another client. Too lazy to check if there are any XEPs that would help solve this.

This page is under construction. I'll add more stuff later. For any corrections/additions, contact me on XMPP by decoding aXdha3VyYS50b21va29AZGlzcm9vdC5vcmc= (base64)