I use XMPP since a few years in the way it was supposed to be used:
- federated
- multiple devices with different client software
- own server
It certainly isn't perfect, as there are a lot of 'classic' clients which lack the modern extensions (e.g. OMEMO [1], Carbons, MAM).
Clients ranked by personal preference:
- Conversations: very good, Android only, Downside: no calls (neither audio nor video)
- Gajim: 'classic' client, requires a few additional modules (slightly better than Pidgin when is comes to pictures)
- Pidgin: 'classic' client, requires a few additional modules
- Dino: very good Desktop client on paper (XEP wise), sadly it is lacking a few important desktop integration features like a tray icon, but as those should be easy to implement that client has a lot of potential.
- ChatSecure: iOS, Downsides: I never really got it to work properly. Without server side Push Notification extension it only received messages when the app was open. With the extension it worked for a few minutes, but still not what I would consider usable.
- Jitsi: certainly could be a good client, but at the moment it has no OMEMO support and therefore I stopped testing it.
While I am not a particular Matrix fan, I can recommend their Matrix vs. XMPP comparison:
https://matrix.org/docs/guides/faq.html#what-is-the-differen...
It basically boils down to: In 2012 XMPP was lacking some basic functionality required for mobile use-cases, so they went to build something technologically very different (Matrix). In the meantime, XMPP has developed its own extensions to support those use-cases and now we have two technologically very different solutions, set to solve similar use-cases.
[1]: https://omemo.top
EDIT: removed the indention from the list