The Quick and Easy Guide to Jabber/XMPP
Why XMPP matters
XMPP (also known as Jabber) is the Internet Standard for instant messaging.
- It supports modern chat features in a standardized and interoperable way (unlike IRC). Features include -
- Multi-device support, offline messages, multi-line messages, message styling, end-to-end encryption, message correction, deletion, replies, receipts, read markers, typing notifications…
- Contact and room synchronization, avatars, file transfer, image previews, stickers, message reactions, encrypted audio and video calls, message threads…
- It's federated, rather than centralized (unlike Telegram, Discord, Signal, Slack, …). That makes it resistant to enshittification - if one operator shuts down, or goes evil/anti-user 1 …as commercial services are so prone to - see Google, Facebook, Reddit, StackOverflow, and many more. , you can switch servers and continue to access the rest of the network and using your existing apps.
- It has a diverse ecosystem of freedom-respecting software clients and servers. (Unlike Discord, Slack, …)
- It's easy and lightweight to self-host. (Unlike Matrix.) This has given rise to a thriving network of public servers.
Matrix servers are resource- and maintenance-heavy to run, which has resulted in most of the Matrix community being concentrated around the matrix.org server. The cost of running a Matrix server regularly forces smaller, community-run servers to give up on it, who often fall back to XMPP.
That effectively makes Matrix a centralized protocol, with all the drawbacks that implies. If or when the matrix.org service shuts down or becomes anti-user, there will not be enough community-run servers to take in any refugees.
- The clients are also lightweight and performant. (Again, unlike Matrix.)
- The protocol is governed by a privacy-conscious community (the XSF) rather than a single company.
- It has bridges to other chat protocols, so you can use any XMPP client for all your chats.
Getting started
The easiest way
The easiest way to join the XMPP network is to install Quicksy from the Google Play Store or the Apple App Store. It uses your phone number for registration, contact discovery, and password recovery. The Quicksy account works like any XMPP account and can be used from any XMPP client.
I recommend Quicksy to the majority of people who
- don't want to spend time selecting a server,
- don't use a password manager, 2 For some reason, most public XMPP servers don't provide any kind of account recovery. The upside is that you don't even need to provide an email address to register. The downside is that people who don't use password managers are quite likely to get locked out of their account. and
- don't mind using their phone number to register.
If that's you - install Quicksy, and skip ahead to check out some more clients to use your Quicksy account with.
If that's not you, you need to select a server, make an account, and install a client. 3 Even if your account is not on Quicksy, you can still use Quicksy to associate your account with a phone number. That makes it easier for your Quicksy contacts to discover your account.
Select a server and make an account
Public server recommendations may be found at providers.xmpp.net or compliance.conversations.im/old. Some servers support registering from the client (called In-Band Registration - IBR), others require you to register on their website to prevent spam.
If you're interested in self-hosting a private server, Snikket aims to make it really simple. It also rebrands popular XMPP servers and clients to provide an experience similar to centralized services. 4 Users don't install app Foo on Android and app Bar on iOS, and you don't need to explain that all the apps and services work together…everything is just "Snikket".
Snikket and conversations.im also offer paid hosting.
Install a client
For clients, we recommend…
- On mobile devices
- Monocles Chat or Cheogram 5 Monocles Chat and Cheogram are both forks of Conversations. Cheogram has some additional features. Monocles Chat has even more, and takes many cues from WhatsApp. for modern Android devices
- Yaxim or Bruno for old/low-end Android devices
- Monal or Siskin for iOS
- Convo for KaiOS/JioPhone
- On the desktop
- Movim (social-network-like) and Converse.js in the browser 7 Prose (similar to Slack or Discord) is very new and incomplete, but worth keeping an eye on.
More clients can be found at xmpp.org/software. Avoid clients with poor support for XMPP, such as Pidgin and Thunderbird.
Getting help
You can join the JoinJabber General Chat to ask any XMPP questions you may have.
Sharing XMPP links
At this point, you probably want to share your XMPP address (also known as "Jabber ID", or "JID") with others, so they can reach you on XMPP.
A JID looks like you@yourserver.tld
- just like an email address.
For Quicksy users, it looks like +<2-digit country code><10-digit mobile number>@quicksy.im
, e.g. +919876543210@quicksy.im
However, it's probably better to share an XMPP link instead. There are two kinds of XMPP links -
xmpp: URIs, e.g. xmpp:me@myserver.tld for 1:1 chat, or xmpp:mychannel@myserver.tld?join for joining a channel.
These are supported by most (if not all) XMPP clients. But they aren't supported in most non-XMPP software, and may not be clickable there. (Tell the developers of such apps to add support for XMPP links 🙂)
However, xmpp: URIs aren't very useful if the recipient doesn't have an XMPP client.
Using web invitation links, e.g. https://xmpp.link/#me@myserver.tld for 1:1 chat or https://xmpp.link/#mychannel@myserver.tld?join for joining a channel.
xmpp.link is just one invite service. You can also use others, like join.jabber.network, or host your own instance of easy-xmpp-invitation.
Web invitation links are supported everywhere, and can be opened even if the recipient doesn't have an XMPP client installed. The invitation page also suggests clients based on the user's operating system.
However, the recipient's browser needs to support JavaScript for the invitation to work, and these web invites don't work with Tor Browser (where the ability to launch external applications is disabled).
Channels and group chats
Channels and group chats on XMPP (also known by their collective technical name - "Multi-User Chats", or "MUCs") can take a few different forms.
Semi-anonymous and non-anonymous MUCs
In semi-anonymous MUCs, only moderators can see your Jabber ID (JID) - so only moderators can DM you, add you as a contact, or invite you to other MUCs. This helps protect members against spam and harassment from other members.
If you want to DM a member of a semi-anonymous MUC (without having their JID), you can use whispers (also known as MUC PMs) to exchange JIDs. Note that whispers may be disabled in some MUCs.
In non-anonymous MUCs, your JID is visible to all members of the MUC. Some features - like end-to-end encryption and read markers - are only available in non-anonymous MUCs.
Public and private MUCs
Anyone can join a public MUC (also known as a "channel"), whereas private MUCs (also known as "group chats") are invite-only.
Moderated channels
Some channels may also be moderated - that means new members can't send messages by default, and mods have to grant them voice manually. This is very effective against spam.
In moderated channels, you can ask for voice by whispering to the moderators. Monocles Chat and Gajim (among others) have special support for easily sending a voice request to all moderators of a channel.
Public channel recommendations
You can use search.jabber.network to find public channels. Most XMPP clients have a channel search feature, too.
Here are some channels I can recommend. Please read their rules before you post.
Non-technical channels
- The news channel and the news discussion channel
- The Art Café, for admirers & creators of all arts. A place to share and discuss literature, poetry, music, sound, painting, illustration, comics/graphic novels, photography, sculpture, dance, theatre, film, TV, games, crafts…
- Wanderer's Inn, the channel for travelers, their stories, and their gear
- The gaming channel, a safe space for gaming discussion
- The anime and manga channel, a safe space for fans of anime and manga
- The channel for vegans, with frequent food pictures and cooking discussions
- The Little Project Hub - dedicated to physical DIY projects, including gardening, housing, woodworking, welding, 3D printing, car tuning, etc.
- The channel for DnD and other tabletop RPGs
- The anarchism channel
- The channel for natural sciences
- The philosophy channel
- The channel for Nonviolent Communication / Compassionate Communication
- The Mental Health Chat, a safe space to talk about mental health
- The channel for LGBTQIA+ and their allies.
- The channel for Indians and Indophiles
- The bicycles channel, hosted by a professional bicycle repairer. Has some velomobile users too.
- The XMPP Railway Yard - a channel for fans of trains. Very active, and just a little crazy.
- The public transit channel
- The carnuts channel for car-lovers
Technical channels
- The JoinJabber channel, a safe space for XMPP users and developers
- Tinkerspace, a safe space for programming and general tech discussion
- The Guix channel
- The Emacs channel
- The Lisp channel (for Common Lisp, Scheme, Emacs Lisp, Clojure, PicoLisp, and others)
- The Open Hardware Chat
- The channel for LineageOS and other Android ROMs
- The channel for postmarketOS
- The Free Software Community of India
- The Mechanical Keyboards channel
Bridges
If you don't know what bridges, IRC, or Matrix are, skip ahead to the final section.
Bridging to IRC
You can join IRC channels by joining #<channel>%<IRC server>@<Biboumi server>
. For example -
#commonlisp%irc.libera.chat@irc.jabberfr.org
In addition to irc.jabberfr.org, hmm.st is another public Biboumi instance.
Similarly, you can send PMs to <username>%<IRC server>@<Biboumi server>
. For example, to register your nickname on OFTC, send a message to -
nickserv%irc.oftc.net@irc.jabberfr.org
For more information, check out the Biboumi user documentation.
Persistent IRC connections
You probably want to make Biboumi's connection to an IRC channel persistent. That way, you will remain in the IRC channel, even if your XMPP client is disconnected. That prevents sending excessive joins and parts to the IRC channel if you have a patchy network, and you won't miss the room history when disconnected.
For that, you may need to make a one-off configuration for each channel using an XMPP client which supports Ad-Hoc Commands (AHC). These include -
- Converse.js or Movim (web)
- Gajim (desktop)
- open an IRC channel, click on the overflow menu - "Execute Command" - "Configure a few settings for this IRC channel" - enable "Persistent"
- Monocles Chat (Android)
- open an IRC channel, and tap on the "Commands" tab - "Configure a few settings for this IRC channel" - enable "Persistent"
- Poezio or Profanity (terminal)
Bridging to Matrix
You can speak to Matrix users by adding <user>_<domain>@<Bifrost server>
as a contact. For example -
alice_matrix.org@aria-net.org
You can join Matrix rooms by joining #<room>#<Matrix server>@<Bifrost server>
. For example -
#malleable-systems#matrix.org@aria-net.org
Some rooms need a different syntax, such as the OSM IRC channel -
#_oftc_#osm#matrix.org@aria-net.org
In addition to the aria-net.org
Bifrost instance, there's also one on matrix.org
, but it has fewer features.
You can also bridge a Matrix and an XMPP room together, so that the XMPP room is discoverable to XMPP users via search.jabber.network, and if either one goes down, the other keeps running as usual.
- Invite
@_bifrost_bot:aria-net.org
to the Matrix side - Type
!bifrost bridge xmpp-js <XMPP room domain>.<tld> <XMPP room name>
You can join The Lighthouse for help with the aria-net.org bridge.
The downsides of bridges
While bridges are rather fashionable at the moment, there are several serious issues with them that conventional wisdom usually downplays.
In most cases, bridges are developed and encouraged only as far as they can help existing communities move to somebody else's ecosystem. The one controlling the new ecosystem is usually a heavily-funded party with the motive of poaching users. These parties may have you convinced (through excellent marketing) that their motives are purely altruistic, but look even a little closer and the façade fizzles away.
Downsides of bridges in general
- Spam
- Downtime, resulting in dropped messages
- Messages arriving out of order
- Being restricted to the mutually-supported subset of functionality.
- Bridges may expose your XMPP address to all participants.
- Bridges in general destroy any data sovereignty/privacy assurances you might otherwise have had. This is important even for public rooms. This is especially relevant when bridging to proprietary networks, but also when bridging to Matrix.
Downsides of bridges to proprietary software
- Bridges keep us stuck in the past instead of improving things. Instead of helping people get away from legacy, proprietary, or centralized networks, bridges help people stay on them. They can even encourage people to move away from free networks to proprietary/centralized networks.
Downsides of Matrix bridges in particular
- As with Matrix itself, Matrix bridges give a false sense of increased population - typically a 10:1 ratio of ghost users to real users. Plenty of people fall for this trick and are tempted to bridge to Matrix. Obviously, this inflated participant count does not result in an actual increase in activity.
Matrix-XMPP bridges change XMPP links to Matrix links, so Matrix users don't have to leave Matrix to use XMPP.
On the other hand, the same bridges don't similarly translate Matrix links for XMPP users, thereby encouraging them to join Matrix.
This gives further weight to the suspicion that bridges are really a means of poaching users.
- Matrix bridges (just like Matrix servers) require significant server resources and human effort (in maintenance) to run. Low-resource community-run bridges may thus suffer from significant downtime. They can also take an age to connect to.
Bridges are antithetical to my aim of moving people from proprietary and centralized networks to federated networks of freedom-respecting software. Thus, I prefer to be in unbridged XMPP rooms, and to get existing communities to move to XMPP.
Further reading - https://www.freie-messenger.de/en/matrix/gedanken/#bridges
How to bring people to XMPP
Proprietary and centralized platforms currently dominate the instant messaging world. A lot of people prefer to use these platforms rather than XMPP. If we care about wresting back control of our communications, it is imperative that we fix this.
It basically boils to this - use XMPP for everything.
Do as many of the following as possible -
- Minimize the value you create for other platforms, by…
- Making yourself harder to reach there, e.g. checking them less often than XMPP, replying on them less quickly than XMPP, etc.
- Minimizing your activity on them, e.g. using them only to invite others to XMPP.
- Quitting them entirely.
- Increase the value you create for XMPP, by…
- Making XMPP your primary means of communication.
- Actively participating in XMPP communities.
- Informing people that you prefer to be contacted over XMPP. If asked, tell them why.
- Helping onboard friends, family, colleagues, students, etc to XMPP. If necessary, introduce them to mutual contacts, and channels they may be interested in.
- Don't tell them to "use XMPP" - tell them to "install Quicksy [from the Play Store/App Store]". That takes care of selecting a client and a server in one go, while also providing contact discovery and easy password recovery. Tell them about alternative clients and "XMPP" (the underlying protocol) later.
- Moving existing communities, teams, companies, etc to XMPP.
- Choosing XMPP as the primary chat for new communities, teams, companies, etc.
- Tell others to engage in the same steps above.
This is an easy way to contribute to freedom-respecting software and privacy-respecting technologies, without requiring the skills of a programmer, translator, or designer. 8 Of course, XMPP clients are also - like most FOSS projects - in need of developers, translators, and designers.
Those suggestions come from experience - they are proven to work, provided you possess the necessary spine and steadfastness. Here's how I've applied these measures personally.
- I'm not on WhatsApp, Telegram, Instagram, or Discord, so if people want to talk to me they have to use XMPP…or fall back to SMS, which is very limiting.
- When I first joined, many channels of my interest were missing. I made 9 of the channels I listed above, publicized them so people would join them, talked to channel participants to increase activity, and minimized my participation in IRC and Matrix. (Most of my activity on IRC these days is aimed at encouraging people to try and move to XMPP.)
- As a frequent organizer of OpenStreetMap mapping parties, I onboarded many people to XMPP, and made the OSM India XMPP channel. I announce these parties in XMPP channels multiple weeks in advance; in channels bridged to (proprietary) Telegram or (unsustainable) Matrix, I announce them one week before the party…and I make sure to tell them to join the XMPP channel to get informed sooner 🙂
- I've been part of efforts to spread awareness of XMPP at local FOSS conferences.
The more people who use and promote XMPP exclusively, the sooner we get a world where freedom-respecting, privacy-conscious, federated, and sustainable communication becomes the norm.