XMPP - The Best Chat Protocol

The eXtensible Messaging and Presence Protocol (XMPP) is an open standard for real time communications.

Most notabily it is used for messaging.

It's tiny, fast and has many of the features you wouldn't expect from a protocol which had it's initial version released in 1999.

The things keeping XMPP alive are the XEPs. They're extensions to the core XMPP spec.

what does XMPP do right?

federation

Other chat apps like WhatsApp and Discord are centralized. One company owns all the servers. Even if you do manage to make your own server you can't chat with people on other ones.

XMPP isn't like the rest. An XMPP user on one server can chat with an XMPP user on another.

encryption

XMPP supports E2EE via XEP-0384 (OMEMO).

It's cryptographically deniable and is based on the gold standard of encryption for chats: the Signal Protocol.

freedom

Anybody can make their own client or server for XMPP. All they need to do is follow the spec.

file uploads

HTTP File Uploads - XEP-0363

File uploads on XMPP are simple. Your file is uploaded to an HTTP file server and publicly accessible for anyone with the link. You then just send that link as a message.

This is automated in most modern clients.

There's no file mirroring bullshit. The files are only stored on the uploader's homeserver.

servers

XMPP servers are lightweight. Prosody uses just 10 MB of RAM on my VPS!

In contrast, XMPP's main "competitor protocol", Matrix's lightest production ready server (tuwunel) uses about 1.2GB of RAM for me.

Prosody used ~2GB / 490 MB of block IO on an instance that's been running for a week. tuwunel used 5 terabytes / 20 GB.

what XMPP can't do

calls

XMPP has the XEP-0166, commonly known as Jingle.

This supports 1:1 calls. Some clients support it, most don't. Conversations, Monocles and Dino all support it. Gajim does not.

Group calls don't work anywhere really. XEP-0272 defines the spec for Multiparty Jingle (Muji). However, it isn't implemented in any popular client.

spaces

Spaces are groups of chatrooms. Think of them like Discord servers (fun fact: Discord servers are called Discord servers because of IRC).

XMPP currently doesn't have support for them. However, there is development going on.

XEP-0503 (Server-side spaces) would allow group chat clustering. It's still an Experimental XEP. The XMPP Standards Foundation must approve it before it becomes an "official XEP".

i'm in, let's get XMPP!

Great! Let's get XMPP going!

pick a client

Check out the XMPP client list.

I recommend Gajim for desktop and Monocles for Android.

pick a provider

A provider hosts a homeserver. This is where you will make your account.

Check out this server list.

I'm just gonna quickly recommend a few ones:

self hosting

Check out Prosody. It's a lightweight, open source and modern XMPP server.

You can find other XMPP server implementations here.

setting everything up

gajim

Open Gajim. You should see the setup wizard.

Gajim Log in screen

If you have an account simply log in. If you used disroot.org use your main disroot credentials.

Most servers use in-client registration instead of a custom web-based form.

Press Sign up.

Gajim Sign up screen

Type in the address of your provider and click Sign Up. Fill out the form and click Sign Up.

Congradulations! You have an XMPP account now!

For more information on how to use Gajim see the documentation.

XMPP basics

XMPP addresses (JIDs) follow the same format as E-Mail addresses: username@yourprovider.org

For example: justzvan@justzvan.xyz

A group chat in XMPP is called a MUC (Multi User Chat).

From now on, this guide will focus on Gajim.

Starting a DM or joining a public MUC

Gajim sidebar header

Press the + icon and then press Add Contact. Enter the address of the XMPP user you're trying to contact (or the MUC you're trying to join).

joining a MUC

If you entered a public MUC address you'll see this screen:

Gajim join MUC screen

Press Join. You're in the MUC now!

starting a DM

If you entered the address of another XMPP user you'll get this screen:

Gajim Add Contact

Press Add Contact.

A chat window will open. In the bottom right corner press the little padlock and select OMEMO to enable E2EE. This is VERY important.

The user you tried to contact will get a Contact Request.

Gajim contact request

the end

Here you go! You now have an XMPP account and know the basics!

Wow did this take a long time to write.