# Firebase vs. Firestream vs. XMPP The Chat SDK is backend agnostic. That means that the UI can be made to support any type of messaging server. To do this, we need to provide a network adapter to allow the Chat SDK UI to communicate with the messaging server. Currently, network adapters are provided for three different backends: ### Firebase The Firebase network adapter provides a full messaging experience using Firebase Realtime Database including: - User Accounts - User Search - 1-to-1 chat - Groups, Moderation - Presence - Supports Android and iOS - Uses Firebase Realtime database - Max 200k concurrent users ### Firestream Firestream is a new messaging API we've developed. [Firestream](https://github.com/chat-sdk/firestream-android) is designed to be a light-weight messaging API for Firebase Realtime and Firestore. The Firestream library is stand-alone so it can be used with Chat SDK or alone. Since Firestream doesn't provide any user management features, the Firestream network adapter for Chat SDK uses the Firebase network adapter to handle user accounts, search and presence. Then the [Firestream library](https://github.com/chat-sdk/firestream-android) provides the messaging functionality - User Accounts (Provided by Firebase Network Adapter) - User Search (Provided by Firebase Network Adapter) - Presence (Provided by Firebase Network Adapter) - 1-to-1 chat - Groups / Moderation - Supports Android, iOS, JavaScript, TypeScript, Node.js - Uses Firebase Realtime database for user accounts, search and presence - Uses Firebase Realtime **or** Firestore for messaging - Max 200k concurrent users (2m for Firestore) ### XMPP The XMPP network adapter allows Chat SDK to inteface with any XMPP server. XMPP is a standard messaging protocol which powers some of the biggest messaging apps in the world including: WhatsApp, Skype, Messenger. Chat SDK is compatible with a wide range of open-source XMPP servers including: ejabberd, OpenFire, Prosody, Tigase, MongooseIM. - User Accounts - User Search - Presence - 1-to-1 chat - Multi-user chat / Moderation - Supports Android and iOS - Max 2 million concurrent users per node ## So which is the best? Each of these options has strengths and weaknesses. There isn't any one that's the best but each may be better in a certain situation. I'll start by talking about XMPP because it has some special properties. I would recommend using XMPP for the following cases; - You need your app to scale massively. XMPP can support over 50 million monthly users per node. - You need to operate without an internet connection. i.e. over an intranet. XMPP doesn't require an internet connection to function - You want to operate in mainland China. Google services aren't available in China and you can easily host your XMPP server in a Chinese datacenter. - You need to self-host for data sensitivity reasons or because of data regulations - You need to interface with an existing XMPP network. - You have server skills and want to save money on hosting. XMPP will work out cheaper than Firebase The downside of XMPP is that the server setup and maintenance is more complicated. In general, if you have any of the above requirements, I would recommend XMPP. If not, then the decision is between Firebase and Firestream. Firestream has two main advantages at the moment. Firstly, Firestream has a light-weight API for JavaScript and Node.js. That makes it ideal if you need to add in chat bots or link the chat to an existing backend server. The second advantage is that Firestore can scale much further than Firebase Realtime. If you have your own user-management system, then you could just user Chat SDK and Firestream for the messaging part of your app allowing it to scale to a much higher number of concurrent users. If you have an app with fewer than 10 million monthly users that mainly targets iOS and Android and want a library that's fully featured and easy to setup and run. I would recommend the Firebase backend.