Conversations logo

Conversations: The best open source XMPP client for Android

There are a fair number of XMPP (formerly known as ‘Jabber’) client options available for Android, and I thought I’d review the best of them: Conversations. For the unenlightened; XMPP is an open standard for messaging that allow users to chat with users on the same server or with users on other servers without any centralization.

This review was originally going to be titled “Review of Top 5 open source XMPP clients for Android”. Unfortunately, there aren’t five clients available of a sufficient quality for me to review. Beem, Xabber, and Yaxim were acceptable options some years ago, but the projects haven’t been updated in years, development seem to have crawled to a standstill or have been abandoned, and now fall short of modern client requirements. There are a few other client options available as well, but they’ve yet to reach a state of maturity before they could be considered serious options.

Heads up: This is going to be something as unusual as an almost entirely positive review! It’s a departure from the kind of reviews I normally write, but Conversations really is that good. And with that little introduction out of the way, let me get started on the actual review.

Dialog for adding account to Conversations app

Conversations start off with a good first impression when you logon to your messaging service. Every other app presents the user with a ton of different fields for server address, service port, username, and password. Conversations instead relies on DNS Service Discovery (DNS-SD) to auto-configure the client rather than overwhelming the user with manual configuration options. The user enter their Jabber ID (JID), which is in the format of an email address — an often is their email address too — and password. You can add multiple accounts later or manually configure server address and port if Conversations runs into a problem.

While every other XMPP client app on Android adhere to ‘traditional’ desktop client design conventions, Conversations follows the Material design guidelines on Android to the letter. The result is a simple messaging client that feels very familiar and intuitive to the platform, but maybe not to long-time users of XMPP.

The XMPP desktop clients all model 90s era messaging apps where you have a contact list with availability status indicators and a blinking indicator next to the contacts from whom you’ve received new and unread messages. The other XMPP clients on Android have all followed this model whilst most other messaging platform have stopped focusing on the contact list and instead moved focus to the list of active conversations sorted by recency. On mobile messaging platforms, this design pattern is followed almost without exception. The list of recent conversations that make up the main view of Conversations doesn’t contain availability indicators nor status messages, leaving a clean list of names and avatars. Conversations really is something as unusual as a XMPP client that behaves like users would expect a mobile messaging app to work.

Fictitious conversation in Conversations showing status message updates

Animation of read and typing notifications.

Inside conversation views, you get text notifications when the other party is typing a message or when they’ve read your messages. This conveys the essential information you’re typically looking for in the availability indicator, but not all contacts will a) share this information or b) have clients capable of sharing it. The Send button can optionally show the recipient’s availability status by colorizing it green for available orange for busy, red for away or black for offline. Most of the time it will be the default gray as the status is only queried on-demand when you go into a conversation. This is achieved using XEP-0352 Client State Indication to conserve battery and bandwidth, and I’ve found that I usually only wonder about someone’s status after a little time anyway. A slightly colorized button, of course, isn’t all that accessible and the color hues really aren’t friendly to the color blind. (See issue #1806.) A contact’s availability status is still the lowest common denominator in the protocol to assess whether your message have been received or not.

XMPP stands for Extensible Message and Presence Protocol. Extensible means that there is a simple core protocol for interacting server-to-server and client-to-server, and then there are protocol extensions called XEPs that add new functionality on top of the core protocol. For clients to perform at their best, they must implement a fair share of extensions and keep up with which extensions are trending in other clients.

Account details screen showing server capabilities

Checking which extensions are supported by the server and client can be a time consuming task. Conversations includes a server info screen that lists all the XEPs it needs and whether the server also supports them. This is invaluable for server administrators who want to offer their users the best possible mobile experience, and convenient for users who need to report client malfunctions to server operators. This is an advanced feature, but I’d really like to see it implemented in every other XMPP client! It would certainly have saved me time and frustration over the years to know what extensions a client supported and whether my server also supported it.

Mobile clients have two important requirements that aren’t as important to their desktop peers: bandwidth consumption as mobile subscriptions often pay per megabyte; and handling of slow, changing, and even temporarily unavailable network connections. A third requirement which is just as important to desktop clients is the ability to see full conversation history on multiple devices, something which isn’t supported natively in the core XMPP protocol. Neither Beam, Xabber, nor Yaxim addresses these problems directly and certainly don’t solve them; but Conversations really excels in these three important areas.

Through XEP-0198 Stream Management, Conversations can temporarily disconnect from a supporting server and reconnect to the same session. What this means in practice is that your contacts wouldn’t notice a thing if your client drops off the network for a short time when you drive into a tunnel or change network from your home Wi-Fi to cellular data. It also means the client and server can send a short nod to each other in acknowledgement when the client gets back online and reconnects rather than having the client and server reinitiate a new session and send lots of data back and forth. Messages sent while you’re disconnected are temporarily held on your server until you reconnect. It’s very seamless and you don’t send notifications to every contact when you go out of your home Wi-Fi’s range as you do with every other client.

The base XMPP standard doesn’t handle multi-client environments and message history across all their devices like users expect today. The two protocol extensions XEP-0280 Message Carbons and XEP-313 Message Archive Management sees to that, but client support is sparse. On Android, none of the apps really support it in a good way or have yet to implement it. I’ve had no problem with this while using Conversations, which I must say really is a first.

I’ll round off this review with a few random feature observations of some more advanced functionality:

Conversations also supports multi-user group chats (MUCs) also known as conferences. These conferences can be bookmarked and re-joined automatically, as may be required for example in a corporate environment or other settings where you always want to be available in a conference room. It works well enough, but the app can be slow to update in conferences with many participants and a high number of messages.

I was also pleasantly surprised when I tried adding a new contact. Conversations suggested to auto-complete my contact’s address as I typed it out against the list of networks my account is already connected to. In other words, the auto-complete drop-down will list domains of your existing contacts. This is a very nice little touch that will be one of those useful things few people will notice but everyone benefits from.

The XMPP URI protocol actually works! Giving out my direct contact details is a bit risky, but you can click on and it will open the Conversations app (assuming you’ve already installed it) and have it take you straight to a window where you can message me. As a long time web guy, I’ll admit to being a bit obsessed in URI schemas but this is the first XMPP app on Android who’ve bothered to support it!


Conversations is technically competent, well thought-out, easy to configure and use, … what is there not to like, really? It’s not perfect, but the app clearly shows that a lot of attention has been paid to the right design details all around the app; creating an unusually well designed app for a platform that isn’t known for high quality apps.

It’s such a good client that I wish it was available for more of my devices as well. I hope to see a desktop version of Conversations soon as I can’t be bothered with emulating Android apps on Windows or Linux for desktop use. The connectivity problems that mobile devices have also applies to laptops and tablets, and Conversations really solves these problems while providing a less distracting and visually appealing client. Conversations is the new gold standard for XMPP clients on any platform.

You can get Conversations for $3 USD on Amazon Appstore and Google Play Store. As Conversations is an open source project, you can get the source-code for free from the Conversation website or get the app for free of charge from F-Droid Market. Seeing how all previous XMPP client projects have withered and died off, I’d encourage everyone to buy the client from your Android app store of choice to keep the developers funded and motivated. It’s really worth the money if you’re looking for a well-behaved and polished XMPP client for Android.

Leave a Reply

Your email address will not be published. Be courteous and on-topic. Comments are moderated prior to publication.