I’m a fan of self-hosted Matrix server. You can get a dozen of bridges for those stubborn people that refuse to leave messenger/whatsapp/telegram (at a loss of encryption, and they still get your convos, but at least you don’t have their spyware on your mobile and you can have everything in one app), while also being decentralized.
Self-hosting a server is actually really, really easy. It took me like half an hour, because there is an amazing Matrix Ansible Deploy script, that has a pretty easy to follow documentation, and is also one of those super-rare projects that just works. Even if I forgot to update my server for several months, I could literally “just update”, and the script is clever enough to figure out what changed, tell me what I need to update in the config files (which are still only like four rows of stuff I needed to setup), and it is a really smooth experience.
It works simillarly to an IRC. You have a server, that server can have channels, I think it can even do voice. But, unlike IRC, you can also use your server to talk to people on other servers, similar to how Fediverse works - if I have a server hosted on myserver.com, and someone else has a public room on server otherserver.com, I can either join the room@otherserver.com or message person@otherserver.com, all from my account on myserver.com.
And bridges are basically just bots that run on your own server, and by scraping websites/using API of the service your bridging they create a private room i.e Messenger@myserver.com, with subrooms per chat, and the bot then sends every message it recieves signed into your messenger account to the room, and vice versa - anything you send there will it forward to the real messenger, basically allowing you to chat with people on messenger through your matrix server. Which solves the problem of “Each of my friend is using different messaging service, can I have them all in one app? (The app being Matrix client)”.