====== XMPP ======
[[https://xmpp.org|XMPP]], formerly Jabber, is a messaging protocol standard that is highly extensible. It is federated meaning there is not one central server but different servers can all communicate with each other, similar to how email works across multiple domains and email providers.
===== DevDungeon XMPP Server =====
DevDungeon runs an XMPP server as part of [[https://my.devdungeon.com/services|the DevDungeon infrastructure]]. The ''general@conference.devdungeon.com'' chat room is open to the public and anyone can join.
If you a member of the DevDungeon Virtual Hackerspace, you get your own account ''you@devdungeon.com''.
general@conference.devdungeon.com
===== Clients =====
For a longer list of available clients, check out [[https://new.xmpp.org/software/clients.html]].
** Profanity **
Profanity is a terminal client that supports HTTP file uploads and OTR/PGP/OMEMO encryption. It's a great client. I have a dedicated page: [[:terminal:profanity|Profanity - Terminal XMPP client]]
** Converse.js **
[[https://conversejs.org|Converse.js]] is a web-based and cross-platform client for XMPP that supports OMEMO encryption and HTTP file uploads. You can use their [[https://conversejs.org/fullscreen.html|hosted web client]] to login to any server (including the DevDungeon one). You can use their [[https://conversejs.org/fullscreen.html|hosted full-page version]] or the DevDungeon hosted web client at [[https://xmpp.devdungeon.com:7443/inverse/]] or you can download their [[https://github.com/conversejs/converse-desktop/releases|desktop version]]. If you're using the desktop version, the HTTP bind URL for DevDungeon server is ''https://xmpp.devdungeon.com:7443/http-bind/''.
** Psi+ **
Psi+ is a desktop client that supports PGP encryption and direct file transfer.
** Pidgin **
Pidgin is a desktop client that supports direct file transfer and OTR encryption (with a 3rd party plugin).
** Gajim **
Gajim is a desktop client that is cross-platform. It supports HTTP file uploads and OMEMO encryption.
** Spark **
[[https://www.igniterealtime.org/projects/spark/|Spark]] is a desktop client written in Java. It supports direct file transfer, has built-in translation features, and a screenshot feature.
** Thunderbird **
The Thunderbird email client also supports XMPP chat although not with a ton of features. It does support OTR encryption.
===== Servers =====
** Openfire **
[[https://www.igniterealtime.org/projects/openfire/|OpenFire]] is an XMPP written in Java. It has a feature-rich web interface. The project also has a Java library for XMPP named [[https://www.igniterealtime.org/projects/smack/|Smack]] and a Java desktop client for XMPP chat named [[https://www.igniterealtime.org/projects/spark/|Spark]]. Together, they provide a complete suite for XMPP. There are also a number of [[https://www.igniterealtime.org/projects/openfire/plugins.jsp|Openfire plugins]] that extend the server.
For instructions on setting up Openfire XMPP server, see: [[:other:openfire_setup|Openfire XMPP Server Setup]].
** Prosody IM **
https://prosody.im/ "Prosody is a modern XMPP communication server. It aims to be easy to set up and configure, and efficient with system resources. Additionally, for developers it aims to be easy to extend and give a flexible system on which to rapidly develop added functionality, or prototype new protocols.
Prosody is open-source software under the permissive MIT/X11 license."
** ejabberd **
https://www.ejabberd.im/ "Robust, Scalable and Extensible Realtime Platform
XMPP Server + MQTT Broker + SIP Service"
===== DNS Entries =====
You could simply use one A record for your server, like ''xmpp.devdungeon.com''. However, you might not want your account to be ''someone@xmpp.devdungeon.com'' and instead be ''someone@devdungeon.com'', but the host running your XMPP server may not correspond to the top level domain.
To allow the use of ''@devdungeon.com'' even though the XMPP server may be ''xmpp.devdungeon.com'', you can use SRV records in DNS. You can read more at [[https://wiki.xmpp.org/web/SRV_Records]].
Here are some examples showing the two records you'd need for a client and one for s2s.
_xmpp-client._tcp.devdungeon.com. 18000 IN SRV 0 5 5222 xmpp.devdungeon.com
_xmpp-server._tcp.devdungeon.com. 18000 IN SRV 0 5 5269 xmpp.devdungeon.com
# For conference rooms
_xmpp-server._tcp.conference.devdungeon.com. 18000 IN SRV 0 5 5269 xmpp.devdungeon.com.
* Service: xmpp-client
* Protocol: tcp
* Port: 5222
* Domain: devdungeon.com
* Target: xmpp.devdungeon.com (host providing XMPP)
* Service: xmpp-server
* Protocol: tcp
* Port: 5269
* Domain: devdungeon.com
* Target: xmpp.devdungeon.com (host providing XMPP)
* Service: xmpp-server
* Protocol: tcp
* Port: 5269
* Domain: conference.devdungeon.com
* Target: xmpp.devdungeon.com (host providing conference)
You can use ''dig'' to check a domain's records:
dig SRV _xmpp-client._tcp.devdungeon.com
dig SRV _xmpp-server._tcp.devdungeon.com