Updated 07-Mar-2026

- For XMPP clients, see XMPP Clients: Conversations, Dino.
- See also the Prosody IM chatroom itself.
Preamble
Note that after a year of using Snikket, I've installed Prosody (on which it is based) and find it to be more flexible, and more-or-less straightforward. Prosody is also super-easy to integrate with coturn for audio and video calls. Note that Movim and Jitsi Meet are two additional items that can be integrated as well, and at some point I may try these. For now, for my use case, a simple Prosody + coturn installation is quite suitable and consumes few resources.
Snikket is ok, but cannot make XMPP clients from a normal domain name, and needs to use a subdomain. Kinda lame. So, going with Prosody.
Prosody and Ejabberd are likely the most popular (along with Snikket) though there are a few others out there. For me, I found Ejabberd to be impenetrable, and Prosody to be pretty straightforward after you find a few bits of information out and about on the web (and an answered question in the public chatroom prosody@conference.prosody.im.
Install Prosody
sudo apt install lua-unbound
sudo apt install prosody
sudo systemctl status prosody
sudo ufw allow 5222,5269/tcp
sudo netstat -lnptu | grep lua
Configure Prosody
sudo nano /etc/prosody/prosody.cfg.lua
Managing Prosody
- Extensive (though sometimes cryptic or incomplete) Prosody docs
- prosodyctl command
- Configuring Prosody
- Port and network configuration
- STUN/TURN server with Prosody
- See esp: Using Prosody with coturn
- Prosody photo uploads configuration
DNS configuration in Prosody
Quite a few DNS entries need to be made.
Note: can use SRV DNS entries, or simply all A/AAA records, as I have done. Note that both IPv4 and IPv6 are needed, though perhaps IPv4 is no longer needed.
mcneill.info (I use the root server for addressing)
groups.mcneill.info (some use conference. instead)
pubsub.mcneill.info
share.mcneill.info (for file sharing)
turn.mcneill.info (for video/audio calls)
Can also check DNS with the prosodyctl command:
prosodyctl check dns
SSL Certificates
Prosody needs certs. LetsEncrypt certbot is fine for this purpose:
prosodyctl cert request example.com
Check on certs with:
prosodyctl check certs
Creating accounts in Prosody
- Use the
prosodyctlcommands- See also core.usermanager module
- Note that private groups generate a random address on creation. To create a private group with a specific address, instead create a Public group with the admin, then grant access to that group, which more-or-less makes it private.
- Try the console command:
muc:room("room@muc.host"):set_affiliation(true, "user@host", "owner");oradmin
- Try the console command:
- I didn't find the mod_groups tool to work for me.
- A third-party config file example (Comfy.guide)