This release brings supports for three new XEPs, fixes one specific bug
that was breaking poezio, and has a lot of internal improvements including
typing hings and documentation.
Real-time messaging sits at the centre of many modern digital products. From live chat and streaming reactions to betting platforms and collaborative tools, users expect communication to feel immediate and consistent.
When pressure builds, the system doesn’t typically collapse. It starts to drift. Messages arrive slightly late, ordering becomes inconsistent, and the platform feels less reliable. That drift is often the first signal that chat scalability is under strain.
Imagine a live sports final going into overtime. Millions of viewers react at once. Messages stack up, connections remain open, and activity intensifies. For a moment, everything appears stable. Then delivery slows. Reactions fall slightly out of sync. Some users refresh, unsure whether the delay is on their side or yours.
Those moments reveal whether the system was designed with fault tolerance in mind. If it was, the platform degrades predictably and recovers. If it wasn’t, small issues escalate quickly.
This article explores what breaks first in real-time messaging and how early architectural decisions determine whether users experience resilience or visible strain.
Real-Time Messaging in Live Products
Live products place real-time messaging under immediate scrutiny. On sports platforms, streaming services, online games, and live commerce sites, messaging is visible while it happens. When traffic spikes, performance issues are exposed immediately.
User expectations are already set. WhatsApp reports more than 2 billion monthly active users, shaping what instant communication feels like in practice. That expectation carries into every live experience, whether it is chat, reactions, or collaborative interaction.
Live environments concentrate demand rather than distribute it evenly. Traffic clusters around specific moments. Concurrency can double within minutes, and those users remain connected while message volume increases sharply. That concentration exposes limits in chat scalability far more quickly than steady growth ever would.
The operational impact tends to follow a familiar pattern:
Live scenario
System pressure
Business impact
Sports final
Sudden surge in concurrent users
Latency becomes public
Product launch
Burst of new sessions
Onboarding friction
Viral stream moment
Rapid fan-out across channels
Inconsistent experience
Regional spike
Localised traffic surge
Infrastructure imbalance
For live platforms, volatility comes with the territory.
When delivery slows or behaviour becomes inconsistent, engagement drops first. Retention follows. Users rarely blame infrastructure. They blame the platform.
Designing for unpredictable load requires architecture that assumes spikes are normal and isolates failure when it occurs. If you operate a live platform, that discipline determines whether users experience seamless interaction or visible strain.
High Concurrency and Chat Scalability
In live environments, real-time messaging operates under sustained concurrency rather than occasional bursts. Users remain connected, they interact continuously, and activity compounds when shared moments occur.
High concurrency is not simply about having many users online. It involves managing thousands, sometimes millions, of persistent connections sending and receiving messages at the same time. Every open connection consumes resources, and messages may need to be delivered to large groups of active participants without delay.
This is where chat scalability really gets tested.
In steady conditions, most systems appear stable. When demand synchronises, message fan-out increases rapidly, routing paths multiply, and coordination overhead grows. Small inefficiencies that were invisible during testing begin to surface. Response times drift. Ordering becomes inconsistent. Queues expand before alerts signal a problem.
High concurrency does not introduce entirely new issues. It reveals architectural assumptions that only become visible at scale. Concurrency increases are predictable in live systems. The risk lies in whether the messaging layer can sustain that pressure without affecting user experience.
Messaging Architecture Limits
The pressure created by high concurrency does not stay abstract for long. It shows up in the messaging architecture.
When performance degrades under load, the root cause usually sits there. At scale, every message must be routed, processed, and delivered to the correct subscribers. In distributed systems, that requires coordination across servers, and coordination carries cost. Under sustained traffic, small inefficiencies compound quickly.
Routing layers can become bottlenecks when messages must propagate across multiple nodes. Queues expand when incoming traffic outpaces processing capacity. Latency increases as backlogs grow. If state drifts between nodes, messages may arrive late or appear out of sequence.
This is where the earlier discussion of chat scalability becomes tangible. It is not only about supporting more users. It is about how efficiently the architecture distributes load and maintains consistency when concurrency remains elevated.
These limits rarely appear during controlled testing with predictable traffic. They emerge under real usage, where concurrency is sustained and message patterns are uneven.
Well-designed systems account for this from the outset. They reduce coordination overhead, isolate failure domains, and scale horizontally without introducing fragility. When they do not, performance drift becomes visible long before a full outage occurs, and users feel the impact immediately.
Fault Tolerance and Scaling
If you operate a live platform, this is where design choices become visible.
Once architectural limits are exposed, the question is how your system behaves as demand continues to rise.
Scaling real-time messaging is about making sure that when components falter, the impact is contained. Distributed systems are built on a simple assumption: things break. You will see restarts, reroutes and unstable network conditions. But the real test is whether your architecture absorbs the shock or amplifies it.
Systems built with fault isolation in mind tend to recover locally. Load shifts across nodes. Individual components stabilise without affecting the wider service. Systems built around central coordination points are more vulnerable to ripple effects.
In practical terms, the difference shows up as:
Localised disruption rather than cascading instability
Brief slowdown instead of prolonged degradation
Controlled recovery rather than platform-wide interruption
These behaviours define whether users experience resilience or instability.
Fault tolerance determines how the system behaves when conditions are at their most demanding.
Real-Time Messaging in Entertainment
Entertainment platforms expose weaknesses in real-time messaging quickly because traffic converges rather than building steadily over time.
When a live event captures attention, users respond together. Demand rises sharply within a short window, and those users remain connected while interaction increases. The stress on the system comes not from gradual growth, but from concentrated activity.
Take the widespread Cloudflare outage in November 2025. As a core infrastructure provider handling a significant share of global internet traffic, its disruption affected major platforms simultaneously. The issue was due to underlying infrastructure, but the impact was immediate and highly visible because so many users were active at once.
Live gaming environments operate under comparable traffic patterns by design. During competitive matches on FACEIT, large numbers of players remain connected while scores, rankings, and in-game events update continuously. Activity intensifies around key moments, increasing message throughput while persistent connections stay open.
Across these environments, the pattern is consistent. Users connect simultaneously, interact continuously, and expect immediate feedback. When performance begins to drift, the impact is shared rather than isolated.
A Note on Architecture
This is where architectural choices begin to matter.
Platforms that manage sustained concurrency and recover predictably under pressure tend to share certain structural characteristics. In messaging environments, MongooseIM is one example of infrastructure designed around those principles.
In practical terms, that means:
Supporting large numbers of persistent connections without central bottlenecks
Distributing load across nodes to reduce coordination overhead
Containing failure within defined boundaries rather than allowing it to cascade
Maintaining message consistency even when traffic intensifies
These design choices do not eliminate volatility. They determine how the system behaves when it does.
In live entertainment platforms, that distinction shapes whether pressure remains internal or becomes visible to users.
Conclusion
Real-time messaging raises expectations that are easy to meet under steady conditions and far harder to sustain when attention converges.
What breaks first is rarely availability. It is timing. It is the subtle drift in delivery and consistency that users notice before any dashboard signals a failure.
Live environments make that visible because traffic arrives together and interaction compounds quickly. Concurrency is not the exception. It is the operating model. Whether the experience holds depends on how the architecture distributes load and contains failure.
Designing for that reality early makes scaling more predictable and reduces the risk of visible strain later.If you are building or modernising a platform where real-time interaction matters, assess whether your messaging architecture is prepared for sustained concurrency. Get in touch to continue the conversation.
Reliability is often treated as something that can be improved once a system is live. When things break, the focus shifts to monitoring, incident response, and recovery, with the belief that resilience can be strengthened over time as scale reveals weaknesses.
In reality, most of it is set much earlier.
Long before a system faces sustained demand, its underlying design has already shaped how it will respond under pressure. Choices about service boundaries, data handling, deployment models, and fault management influence whether a problem stays contained or spreads.
The conversation is gradually moving from reliability to resilience because distributed systems rarely operate without failure. The more useful question is how a platform continues running when parts of it inevitably fail. The sections that follow explore how early architectural decisions shape that outcome, why their impact becomes more visible at scale, and what it means to build resilience from the beginning rather than react to it later.
Early Decisions Create Long-Term Behaviour
Large-scale failures rarely emerge without warning. What appears sudden at scale is often the predictable outcome of structural decisions made earlier, when different commercial pressures shaped priorities.
In the early stages of a product, the focus is understandably on delivering value quickly, reducing development friction, and validating the market. These are rational business decisions. However, architecture chosen primarily for speed can quietly define the operational ceiling of the system, setting limits that only become visible once demand increases.
Systems Behave as They Were Built to Behave
Outages are often described as “unexpected events,” but distributed systems typically respond to pressure in ways that reflect their design. How services communicate, how state is shared, where dependencies sit, and how failure is managed all influence whether disruption remains contained within a single component or spreads across the wider platform.
Research from Google’s Site Reliability Engineering work shows that around 70% of outages are caused by changes to a live system, such as configuration updates, deployments, or operational changes, rather than by hardware failures. Similarly, the Uptime Institute’s Annual Outage Analysis identifies configuration errors and dependency failures as leading causes of major disruption.
These findings are unsurprising. In distributed environments, dependencies increase and recovery paths become harder to trace, which means that architectural shortcuts that once seemed minor can have disproportionate impact under sustained load. Systems tend to fail along the structural lines already drawn into them, and those lines are shaped by early design decisions, even when those decisions were commercially sensible at the time.
Trade-offs That Compound Over Time
Architectural decisions are rarely made under ideal conditions. Early on, speed to market matters, simplicity reduces friction, and shipping is the priority. A tightly coupled service can help teams move faster, a single-region deployment keeps things straightforward, and limited observability may feel acceptable when traffic is still modest.
But overtime, these trade-offs compound.
Limited isolation between services makes it easier for problems in one area to affect others.
Shared infrastructure can create hidden dependencies that only become visible under heavy demand. Concentrated regional deployments increase the impact of a local outage or cloud disruption.
Observability that felt sufficient at launch can fall short when trying to understand complex behaviour at scale.
At a smaller scale, these constraints can go largely unnoticed. As usage increases and demand becomes less predictable, they start to shape how the system responds under pressure. What once felt manageable begins to show its limits.
This is rarely about a lack of technical ability. It is simply what happens as complexity builds over time. Every system reflects the trade-offs made in its early stages, whether those choices were deliberate or just practical at the time.
When Architecture Becomes Business Exposure
As systems grow in scale and complexity, the way they are built starts to show up in practical ways. When services are tightly connected, recovery takes longer. When failures are not well contained, a problem in one area can disrupt others. Incidents become harder to resolve and more expensive to manage.
The cost of disruption is not abstract. ITIC’s 2023 Hourly Cost of Downtime Survey reports that more than 90% of mid-size and large enterprises estimate a single hour of downtime costs over $300,000, and roughly 41% place that figure between $1 million and $5 million per hour. At that level, even short-lived incidents carry material financial impact.
For organisations that rely on digital platforms to generate revenue, those numbers represent missed transactions, operational strain, and damage to customer trust. At that point, system design is no longer just an engineering decision. It becomes a business decision with measurable financial consequences.
When Failure Is Public
Some systems fail quietly, disrupting internal workflows or back-office processes with limited external visibility. Others operate in real time, where performance issues are experienced directly by customers, investors, and partners.
In sectors such as entertainment, demand is often synchronised and predictable. Premieres, sporting events, ticket releases, and major launches concentrate traffic into specific windows, placing simultaneous pressure on application layers, databases, and third-party services. These moments are not unusual spikes; they are built into the operating model. Platforms designed for large-scale engagement are expected to handle peak demand as part of normal business activity.
That expectation changes the stakes. When performance degrades in these environments, it is noticed immediately and often publicly. Frustration spreads quickly, confidence can shift in hours, and what might have been an operational issue becomes a visible business problem.
In this context, resilience shapes whether a high-demand event reinforces confidence in the platform or exposes its limits. When failure is experienced directly by users, it moves beyond internal metrics and becomes part of the customer experience itself.
Designing for Resilience
If failure is inevitable in distributed systems, then resilience has to be built in from the start. It cannot be something added later when the first serious incident forces the issue.
Resilient systems are structured so that problems stay contained. A fault in one component should not automatically take others down with it, and services should be able to keep operating even when parts of the system are degraded. External dependencies will fail. Traffic will spike. The design needs to account for that reality.
This way of thinking shifts the focus. Instead of trying to prevent every possible issue, teams concentrate on limiting the impact when something goes wrong. Speed still matters, but so does the ability to grow without introducing instability.
Technology choices can support that approach. Elixir programming language, running on the BEAM, was designed for environments where downtime had real consequences. Its structure reflects that:
Applications are made up of many small, independent processes rather than large, tightly connected components.
Failures are expected and handled locally.
Supervision and recovery are built into the runtime so the wider system keeps running.
No language guarantees reliability, but tools built around fault tolerance make it easier to create systems that continue operating under pressure.
To conclude
By the time serious issues appear at scale, most of the important decisions have already been made.
Failure is part of running distributed systems. What matters is whether problems stay contained and whether the platform keeps operating when something goes wrong.
Thinking about resilience early makes growth easier later. It helps protect revenue, maintain trust, and avoid the instability that forces costly redesigns.If you are building distributed platforms where reliability directly affects performance and reputation, now is the time to treat resilience as a core design decision. Get in touch to discuss how to build it into your architecture from the start.
Just like any other product or project by the XSF, the Newsletter is the result of the voluntary work of its members and contributors. If you are happy with the services and software you may be using, please consider saying thanks or help these projects!
XMPP material for DI.DAY: Four recipes to use an open chat protocol at the ‘Digital Independence Day’, the German (DI.DAY) initiative, from the XMPP community to enable people to start with independent messaging!
Four recipes for an open chat protocol at the Digital Independence Day!
XMPP Sprint in Berlin (DE / EN): will take place from June Friday 19th to Sunday 21st 2026, at the Wikimedia Deutschland e.V. offices in Berlin, Germany. If this sounds like the right event for you, come and join us! Just make sure to list yourself here, so we know how many people will attend and we can plan accordingly. If you have any questions or concerns, join us at the chatroom: sprints@muc.xmpp.org!
Apprise, Push Notifications that work with just about every platform, restored its XMPP support using Slixmpp, (after >4 years). ATM no stablerelease, but it’s coming …
Great Invitations, a tutorial that outlines how to create invites for the most popular clients according to XEP-0401 (Ad-hoc Account Invitation Generation), from the tutorials section at joinjabber.org.
MembeBot: ohhh I member: ¿Listo para implementar tu propio sistema de notificaciones de eventos en calendario sin depender de gigantes tecnológicos? by TheCoffeMaker for Cyberdelia. [ES]
Conversations has released versions 2.19.10, 2.19.11 and 2.19.12 for Android. This version introduces a refactored QR code scanning and URI handling, a fix for rotation issues in tablet mode and also offers to delete messages when banning someone in a public channel among other things. You can take a look at the changelog for all the details.
Fluux Messenger, a modern, cross-platform XMPP client for communities and organizations, versions 0.11.3, 0.12.0, 0.12.1, 0.13.0, 0.13.1 and 0.13.2 have been released, with a list of additions, new features, improvements and bugfixes that is way longer than what we could ever mention in here! Go straight for the changelog for all the details!
Fluux Messenger main window and XMPP console
Gajim has released version 2.4.4 of its free and fully featured chat app for XMPP. This release comes with link previews, many improvements for macOS, and bugfixes. Thank you for all your contributions! You can take a look at the changelog for all the details.
Link previews in Gajim 2.4.4
Monal has released versions 6.4.18 for iOS and macOS.
Monocles has released versions 2.1.2 and 2.1.3 of its chat client for Android. The former release brings fixes for message retraction, images sent as link and infinite recursion in TagEditorView, adds support for links in posts, disables publish button after click to prevent double posts, refactored message correction UI and a change in the social feed pubsub access model. The latest, adds pause and resume story on delete dialog, fixes for progress bar handling and contact lookup for stories and brings fixes from Conversations, plus updated translations.
Profanity has released version 0.16.0 of its console based XMPP client written in C. This release brings fixes for OTR detection, OMEMO startup, overwriting new accounts when running multiple instances, reconnect when no account has been set up yet, adds a new /changes command that allows the user to compare the modifications of the runtime configuration and the saved configuration among many other fixes and improvements. Make sure to read the changelog for all the details!
xmpp-web has released version 0.11.0 of its lightweight web chat client for XMPP server.
XMPP-Web main window
XMPP Servers
ProcessOne is pleased to announce the bugfix release of ejabberd 26.02. Make sure to read the changelog for all the details and a complete list of fixes and improvements on this release.
XMPP Libraries & Tools
python-nbxmpp, a Python library that provides a way for Python applications to use the XMPP network, version 7.1.0 has been released. Full details on the changelog.
QXmpp, the cross-platform C++ XMPP client and server library, versions 1.13.1, 1.14.1, 1.14.2 and 1.14.3 have been released. Full details on the changelog.
Siltamesh, a simple bridge between Meshtastic and XMPP networks, version 0.2.0 has been released.
Slidge versions 0.3.7 has been released. You can check the intermediate changelog from 0.3.6 to 0.3.7 for all the details.
Slixmpp, the MIT licensed XMPP library for Python 3.7+ versions 1.13.0 and 1.13.2 have been released. You can read their respective official release announcements here and here for all the details.
xmpppy, a Python library that is targeted to provide easy scripting with Jabber, version 0.7.3 has been released. Full details on the changelog.
Extensions and specifications
The XMPP Standards Foundation develops extensions to XMPP in its XEP series in addition to XMPP RFCs. Developers and other standards experts from around the world collaborate on these extensions, developing new specifications for emerging practices, and refining existing ways of doing things. Proposed by anybody, the particularly successful ones end up as Final or Active - depending on their type - while others are carefully archived as Deferred. This life cycle is described in XEP-0001, which contains the formal and canonical definitions for the types, states, and processes. Read more about the standards process. Communication around Standards and Extensions happens in the Standards Mailing List (online archive).
Proposed
The XEP development process starts by writing up an idea and submitting it to the XMPP Editor. Within two weeks, the Council decides whether to accept this proposal as an Experimental XEP.
If an experimental XEP is not updated for more than twelve months, it will be moved off Experimental to Deferred. If there is another update, it will put the XEP back onto Experimental.
No XEPs deferred this month.
Updated
Version 1.26.0 of XEP-0001 (XMPP Extension Protocols)
Surface (and correct) the source control information.
Surface the publication URL (although I assume anyone reading this has figured that one out by now).
Surface the contributor side of things.
Add bit about XEP authors making PRs if they don’t exist - this is “new” rather than documenting existing practice.
Add bit about PRs getting XEP author approval (existing practice hithertofore undocumented).
Add bit about Council (etc) adding authors if they drop off (existing practice hithertofore undocumented).
Add note to clarify that Retraction doesn’t mean Deletion (existing practice, documented, but has been misunderstood before). (dwd)
Version 1.1.0 of XEP-0143 (Guidelines for Authors of XMPP Extension Protocols)
Reflect preference for GitHub pull requests for initial submission,
PRs to contain only one changed XEP. (dwd)
Version 0.8.0 of XEP-0353 (Jingle Message Initiation)
Adapt usage of JID types to real-world usage:
Send JMI responses to full JID of initiator instead of bare JID
Send JMI <finish/> element to full JID of both parties (melvo)
Last Call
Last calls are issued once everyone seems satisfied with the current XEP status. After the Council decides whether the XEP seems ready, the XMPP Editor issues a Last Call for comments. The feedback gathered during the Last Call can help improve the XEP before returning it to the Council for advancement to Stable.
Looking for job offers or want to hire a professional consultant for your XMPP project? Visit our XMPP job board.
Newsletter Contributors & Translations
This is a community effort, and we would like to thank translators for their contributions. Volunteers and more languages are welcome! Translations of the XMPP Newsletter will be released here (with some delay):
Contributors:
To this issue: emus, cal0pteryx, Gonzalo Raúl Nemmi, Ludovic Bocquet, sokai, XSF iTeam
This XMPP Newsletter is produced collaboratively by the XMPP community. Each month’s newsletter issue is drafted in this simple pad. At the end of each month, the pad’s content is merged into the XSF GitHub repository. We are always happy to welcome contributors. Do not hesitate to join the discussion in our Comm-Team group chat (MUC) and thereby help us sustain this as a community effort. You have a project and want to spread the news? Please consider sharing your news or events here, and promote it to a large audience.
Tasks we do on a regular basis:
gathering news in the XMPP universe
short summaries of news and events
summary of the monthly communication on extensions (XEPs)
review of the newsletter draft
preparation of media images
translations
communication via media accounts
Unsubscribe from the XMPP Newsletter
For this newsletter either log in here and unsubscribe or simply send an email to newsletter-leave@xmpp.org.
(If you have not previously logged in, you may need to set up an account with the appropriate email address.)
Proprio come qualsiasi altro prodotto o progetto dell’XSF, la Newsletter è il risultato del lavoro volontario dei suoi membri e collaboratori. Se siete soddisfatti dei servizi e dei software che utilizzate, vi invitiamo a ringraziare o aiutare questi progetti!
Materiale XMPP per DI.DAY: quattro ricette per utilizzare un protocollo di chat aperto al “Digital Independence Day”, l’iniziativa tedesca (DI.DAY) della comunità XMPP per consentire alle persone di iniziare a utilizzare la messaggistica indipendente!
Quattro ricette per un protocollo di chat aperto al Digital Independence Day!
XMPP Sprint a Berlino
(DE / EN): si terrà da venerdì 19 a domenica 21 giugno 2026, presso gli uffici di Wikimedia Deutschland e.V. a Berlino, Germania. Se pensi che questo sia l’evento giusto per te, vieni a trovarci! Assicurati solo di registrarti qui, così sapremo quante persone parteciperanno e potremo organizzarci di conseguenza. Se hai domande o dubbi, unisciti a noi nella chatroom: sprints@muc.xmpp.org!
Apprise, notifiche push compatibili con quasi tutte le piattaforme, ripristinato il supporto XMPP utilizzando Slixmpp, (dopo >4 anni). Al momento non esiste una versione stabile, ma è in arrivo…
Ottimi inviti, un tutorial che illustra come creare inviti per i client più popolari secondo XEP-0401 (Ad-hoc Account Invitation Generation), dalla sezione tutorials su joinjabber.org.
MembeBot: ohhh I member: ¿Listo para implementar tu propio sistema de notificaciones de eventos en calendario sin depender de gigantes tecnológicos? di TheCoffeMaker per Cyberdelia. [ES]
Conversations ha rilasciato le versioni 2.19.10
, 2.19.11 e 2.19.12 per Android. Questa versione introduce una scansione dei codici QR e una gestione degli URI rifattorizzate, una correzione per i problemi di rotazione in modalità tablet e offre anche la possibilità di eliminare i messaggi quando si banna qualcuno in un canale pubblico, tra le altre cose. È possibile consultare il changelog per tutti i dettagli.
Fluux Messenger, un client XMPP moderno e multipiattaforma per comunità e organizzazioni, versioni 0.11.3, 0.12.0, 0.12.1 , 0.13.0, 0.13.1 e 0.13.2 sono state rilasciate con una lista di aggiunte, nuove funzionalità, miglioramenti e correzioni di bug che è molto più lunga di quanto potremmo mai menzionare qui! Vai direttamente al changelog per tutti i dettagli!
Finestra principale di Fluux Messenger e console XMPP
Gajim ha rilasciato la versione 2.4.4 della sua app di chat gratuita e completa per XMPP. Questa versione include anteprime dei link, molti miglioramenti per macOS e correzioni di bug. Grazie a tutti per i vostri contributi! Potete consultare il changelog per tutti i dettagli.
Anteprime dei link in Gajim 2.4.4
Monal ha rilasciato le versioni 6.4.18 per iOS e macOS.
Monocles ha rilasciato le versioni 2.1.2 e 2.1.3 del suo client di chat per Android. La prima versione apporta correzioni per la revoca dei messaggi, le immagini inviate come link e la ricorsione infinita in TagEditorView, aggiunge il supporto per i link nei post, disabilita il pulsante di pubblicazione dopo il clic per impedire la doppia pubblicazione, rifattorizza l’interfaccia utente per la correzione dei messaggi e modifica il modello di accesso pubsub al feed social. L’ultima versione aggiunge la possibilità di mettere in pausa e riprendere la storia nella finestra di dialogo di eliminazione, corregge la gestione della barra di avanzamento e la ricerca dei contatti per le storie e apporta correzioni da Conversations, oltre a traduzioni aggiornate.
Profanity ha rilasciato la versione 0.16.0 del suo client XMPP basato su console scritto in C. Questa versione apporta correzioni per il rilevamento OTR, l’avvio di OMEMO, la sovrascrittura di nuovi account durante l’esecuzione di più istanze, la riconnessione quando non è stato ancora configurato alcun account, aggiunge un nuovo comando /changes che consente all’utente di confrontare le modifiche della configurazione di runtime e della configurazione salvata, oltre a molte altre correzioni e miglioramenti. Assicuratevi di leggere il changelog per tutti i dettagli!
xmpp-web ha rilasciato la versione 0.11.0 del suo client di chat web leggero per server XMPP.
Finestra principale di XMPP-Web
Server XMPP
ProcessOne è lieta di annunciare il rilascio della versione bugfix di ejabberd 26.02.
Assicuratevi di leggere il changelog per tutti i dettagli e un elenco completo delle correzioni e dei miglioramenti apportati in questa versione.
Librerie e strumenti XMPP
python-nbxmpp, una libreria Python che fornisce alle applicazioni Python un modo per utilizzare la rete XMPP, è stata rilasciata la versione 7.1.0. Tutti i dettagli sono disponibili nel changelog.
QXmpp, la libreria client e server XMPP multipiattaforma in C++, versioni 1.13.1 , 1.14.1, 1.14.2 e 1.14.3. Tutti i dettagli sono disponibili nel changelog.
Slidge versioni 0.3.7. È possibile consultare il changelog intermedio da 0.3.6 a 0.3.7 per tutti i dettagli.
Slixmpp, la libreria XMPP con licenza MIT per Python 3.7+ versioni 1.13.0 e 1.13.2 sono state rilasciate. È possibile leggere i rispettivi annunci ufficiali di rilascio qui e qui per tutti i dettagli.
xmpppy, una libreria Python pensata per facilitare lo scripting con Jabber, versione 0.7.3 è stata rilasciata. Tutti i dettagli sono disponibili nel changelog.
Estensioni e specifiche
La XMPP Standards Foundation sviluppa estensioni a XMPP nella sua serie XEP oltre alle XMPP RFC. Sviluppatori ed altri esperti di standard provenienti da tutto il mondo collaborano a queste estensioni, sviluppando nuove specifiche per pratiche emergenti e perfezionando i metodi esistenti. Proposte da chiunque, quelle di particolare successo finiscono per diventare definitive o attive, a seconda del loro tipo, mentre altre vengono accuratamente archiviate come differite. Questo ciclo di vita è descritto in XEP-0001, che contiene le definizioni formali e canoniche dei tipi, degli stati e dei processi. Maggiori informazioni sul processo di standardizzazione. La comunicazione relativa agli standard e alle estensioni avviene nella mailing list degli standard (archivio online).
Proposta
Il processo di sviluppo XEP inizia con la stesura di un’idea e la sua presentazione all’XMPP Editor. Entro due settimane, il Consiglio decide se accettare questa proposta come XEP sperimentale.
Accettata come sperimentale con voto del consiglio (dg)
Rinviata
Se una XEP sperimentale non viene aggiornata per più di dodici mesi, verrà spostata da Sperimentale a Rinviata. Se ci sarà un altro aggiornamento, la XEP tornerà a essere Sperimentale.
Nessuna XEP rinviata questo mese.
Aggiornato
Versione 1.26.0 di XEP-0001 (Protocolli di estensione XMPP)
Mostrare (e correggere) le informazioni sul controllo del codice sorgente.
Mostrare l’URL di pubblicazione (anche se presumo che chiunque legga questo documento lo abbia già capito).
Mostrare il lato dei contributori.
Aggiungere un riferimento agli autori XEP che fanno PR se non esistono - questa è una “novità” piuttosto che una documentazione di una pratica esistente.
Aggiungere un riferimento alle PR che ottengono l’approvazione dell’autore XEP (pratica esistente finora non documentata).
Aggiungere un riferimento al Consiglio (ecc.) che aggiunge autori se questi abbandonano (pratica esistente finora non documentata).
Aggiungere una nota per chiarire che la ritrattazione non significa cancellazione (pratica esistente, documentata, ma che in passato è stata fraintesa). (dwd)
Versione 1.1.0 di XEP-0143 (Linee guida per gli autori dei protocolli di estensione XMPP)
Riflettere la preferenza per le richieste pull GitHub per l’invio iniziale,
Le PR devono contenere solo un XEP modificato. (dwd)
Versione 0.8.0 di XEP-0353 (Avvio di messaggi Jingle)
Adattare l’uso dei tipi JID all’uso nel mondo reale:
Inviare le risposte JMI al JID completo dell’iniziatore invece che al JID nudo
Inviare l’elemento JMI <finish/> al JID completo di entrambe le parti (melvo)
Ultima chiamata
Le ultime chiamate vengono emesse quando tutti sembrano soddisfatti dello stato attuale dello XEP. Dopo che il Consiglio ha deciso se lo XEP sembra pronto, l’XMPP Editor emette un’ultima chiamata per i commenti. Il feedback raccolto durante l’ultima chiamata può aiutare a migliorare lo XEP prima di restituirlo al Consiglio per il passaggio allo stato Stabile.
Cerchi offerte di lavoro o vuoi assumere un consulente professionista per il tuo progetto XMPP? Visita la nostra bacheca dei lavori XMPP.
Collaboratori e traduttori della newsletter
Questo è un progetto comunitario e desideriamo ringraziare i traduttori per il loro contributo. Volontari e altre lingue sono i benvenuti! Le traduzioni della newsletter XMPP saranno pubblicate qui (con un certo ritardo):
Collaboratori:
A questo numero: emus, cal0pteryx, Gonzalo Raúl Nemmi, Ludovic Bocquet, sokai, XSF iTeam
Questa newsletter XMPP è prodotta in collaborazione dalla comunità XMPP. Ogni mese la newsletter viene redatta in questo simple pad. Alla fine di ogni mese, il contenuto del pad viene inserito nel repository GitHub XSF. Siamo sempre lieti di accogliere nuovi collaboratori. Non esitate a partecipare alla discussione nella nostra chat di gruppo Comm-Team (MUC) e ad aiutarci così a sostenere questo progetto come sforzo comunitario. Avete un progetto e volete diffondere la notizia? Considerate la possibilità di condividere qui le vostre notizie o i vostri eventi e promuoveteli a un vasto pubblico.
Attività che svolgiamo regolarmente:
raccolta di notizie nell’universo XMPP
brevi sintesi di notizie ed eventi
sintesi della comunicazione mensile sulle estensioni (XEP)
revisione della bozza della newsletter
preparazione di immagini multimediali
traduzioni
comunicazione tramite account multimediali
Annullare l’iscrizione alla newsletter XMPP
Per questa newsletter, accedi qui e cancella l’iscrizione o invia semplicemente un’e-mail a newsletter-leave@xmpp.org.
(Se non hai effettuato l’accesso in precedenza, potrebbe essere necessario creare un account con l’indirizzo e-mail appropriato).
Today we join with other organizations in signing the open letter to Google about their plans to require all Android app developers to register centrally with Google in order to distribute applications outside the Google Play Store. You should go read the letter, it is quite well done. We want to talk a little bit additionally about why sideloading (aka installing apps on your own device, or “directly installing” as the letter puts it) is important to us
In early fall of 2024 Google Play decided to remove and ban the Cheogram app from their store. Worse, since it had been listed by Play as “malware” Google’s Play Protect system began warning existing users that they should uninstall the existing app from their devices. This was, as you might imagine, very bad for us. No new customers could get the app and existing customers were contacting support unsure how to get back into their account after being tricked into removing it.
After a single submission to Google Play appealing this decision, they came back very quickly affirming “yes, this app seems to be malware.” No indication of why they thought that, just a decision. At this point the box we could use to submit new appeals also went away. With no appeals process available and requests to what little support Google has going totally ignored, it was not clear if we were ever going to be able to distribute our app in the Play Store again. After months of being delisted we finally got a lucky break. In talking with some of our contacts at the Software Freedom Conservancy, they offered to write to some of their contacts deep inside Google and ask if there was anything that could be done. When their contact pushed internally at Google to get more information, suddenly the app was re-activated in the Play Store
I want to be clear here. We did not change the app. We did not upload a new build. This app Google had been so very, very sure was “malware” was fully reinstated and available to customers again the moment a human being bothered to actually look at it. It was of course obvious to any human looking at the app that it is not malware and so they restored it to the store immediately. They never replied to that final request, and no details about what happened were ever made available. From that point on Google has essentially pretended that this never happened and the app was always great and in the Play Store. If we had not been able to get in contact with a human and really push them to take a look, however, we would never have been reinstated.
Despite our good fortune, we still lost months of potential business over this. Of course you’ve heard stories like this before. Stories of Play Store abuse are a dime a dozen and most of them don’t have the “happy” ending ours does. What does this have to do with “sideloading” and the open letter? Well, despite all the months of lost business, and despite all the existing customers being told to uninstall their app if they had got it from Play Store, we lost no more than 10% of our customers and continued to onboard new ones during the entire time. How is this possible? The main reason is direct installs (“sideloading”). The majority of our customers get the app from our preferred sources on F-Droid and Itch. These customers were not told by Play Protect to remove their app. During the time we were delisted from Play Store we removed the link to Play Store from our website and new customers were instructed to use F-Droid. Of course we still lost some business here, some people were unable or unwilling to use F-Droid or other direct install options, but the damage was far, far less than it might have otherwise been.
What Google is proposing would allow them to ban anyone from creating apps which may be directly installed without their approval. One of the reasons they say they need to do this is to protect people from malware! Yet even if this was the narrow purpose of a ban it would still routinely catch apps which are not nefarious in any way, just as ours wasn’t. Furthermore, with all apps and developers registered in their system, a ban under these new rules could result in everyone being told to uninstall the app by Play Protect, and not just those who got it from Play Store to begin with. This would leave app developers who are erroneously marked by Google as malware with no options, no recourse, no way to appeal, and praying there is a friend of a friend who knows someone deep in Google who can poke the right button. This is just not an acceptable future for the world’s largest mobile platform.
We&aposre excited to announce Fluux Messenger 0.13.0, featuring native TCP connections, complete European language coverage, and significant performance improvements.
Also, we recently passed the first 100 stars on GitHub. Thank you for your support and for believing in open, sovereign messaging !
What&aposs New
Native TCP Connection Support on Desktop
Desktop users can now connect directly to XMPP servers via native TCP through our WebSocket proxy implementation. This means lower latency, better reliability, and native protocol handling. No more browser limitations.
We believe that&aposs a nice milestone worth a blog post. Until now, desktop users needed their XMPP server to support WebSocket connections. With v0.13.0, you can connect to any standard XMPP server. We estimate this will enable 80% of users who couldn&apost connect before to finally use Fluux Messenger with their existing servers.
Complete European Union Language Coverage
Fluux Messenger now supports all 26 EU languages, making it truly pan-European. From Bulgarian to Swedish, Croatian to Maltese, we&aposve got you covered. Languages include:
Dynamic locale loading means faster initial startup while maintaining comprehensive language support.
If you spot any translation issues, feel free to contribute on our GitHub repository.
Clipboard Image Paste
Paste images directly from your clipboard with Cmd+V (macOS) or Ctrl+V (Windows/Linux). Copy from anywhere, paste into Fluux. It (should) just work ;). Tested and confirmed with Safari&aposs "Copy Image" feature and system clipboard operations so far.
Clear Local Data on Logout
New privacy option to completely clear local data when logging out. Perfect for shared devices or when you need a fresh start.
Performance & Reliability Improvements
Smarter Message History Loading - We&aposve completely redesigned our Message Archive Management (MAM) strategy. Message history now loads intelligently based on your scrolling behavior and available data, reducing unnecessary server requests.
Rock-Solid Scroll Behavior - Media loading no longer disrupts your scroll position. The scroll-to-bottom feature now works reliably, even when images and files are loading.
Better Windows Tray - Improved tray behavior on Windows for a more native experience.
macOS Sleep Recovery - Fixed layout corruption that could occur after your Mac woke from sleep.
UI & UX Polish
Consistent attachment styling across light and dark themes
Fixed sidebar switching with Cmd+U keyboard shortcut
Improved new message markers - position correctly maintained when switching conversations
Better context menus - always stay within viewport bounds, no more cut-off menus
Markdown preview accuracy - bold and strikethrough now properly shown in message previews
Linux Packaging
Improved Linux packaging using native distribution tools for better integration with your system package manager.
Developer Experience
Centralized notification state with viewport observer provides better performance and more reliable notification handling across the application.
Improves handling of request with invalid url encoded values in request handled by ejabberd_http
Improves handling of invalid responses to disco queries in mod_pubsub_serverinfo
Fixes conversion of MUC room configs from ejabberd older than 21.12
Fixes to autologin in WebAdmin
If you are upgrading from a previous version, there are no changes in SQL schemas, configuration, API commands or hooks.
Notice that mod_muc now incorporates the feature from mod_muc_occupantid, and that module has been removed. You can remove mod_muc_occupantid in your configuration file as it is unnecessary now, and ejabberd simply ignores it.
Version 1.13.0 has shipped with a packaging bug that affects people trying to build wheels using setuptools.
1.13.1 is an attempt to fix that (made packaging from git work somehow), and 1.13.2 is the correct fix thanks to one single additional character.
There are no other changes, and pypi wheels are not affected because they are built in CI with uv.
Links
You can find the new release on codeberg, pypi, or the distributions that package it in a short while.
Last month a friend invited me to trade songs with him DJing at an Atlanta
Lindy Hop social dance.
This was my first time DJing for a social dance other than Contra, and I was
surprised by what a different experience it was.
To that end, this post will be a mix of post-mortem as I’ve done for contra
dances, but also a reflection on the differences between DJing for
called and non-called social dances.
Prep
Preparation was the first, and perhaps most obvious, place where the two types
of DJing vastly differed.
Preparing for Contra requires hours of sorting new tracks, creating mixes,
adding hot cues, fixing beat grids, and analyzing song structure.
Once the tracks are all analyzed and annotated, I can then create a playlist of
mixes and start practicing them.
For Lindy, on the other hand, I can sit down and prepare a basic set in a few
hours right before the dance.
Sorting any new tracks still needs to be done, but otherwise I mostly don’t
have to do any work other than possibly adding a cue point to let me know where
to start a track on the rare version where the beginning doesn’t work (ie. live
recordings with lots of chatter or applause before and after), and even that
isn’t really necessary.
For Contra I normally make a play list with all my mixes in an order that I
think will work well, then shuffle that around on the day of the event depending
on the dance picked by the caller.
For Lindy I chose to make a crate (which differs from a playlist in that there
can’t be duplicate tracks and there is no order to the tracks) instead, pull in
about 50 tracks (far more than I’d need, especially when trading songs with
another DJ) and largely pull from those just to make selection quicker, while
still dipping into the rest of my library on occasion when nothing I’d
pre-selected fits the current vibe.
Nerves
When a dancer asks if I get nervous before DJing for contra I confidently say
“no”.
Not out of some toxic sense of bravado or machismo (I hope), or because I think
I’m particularly good at it and don’t need to worry (I’m not, and I do), but
because I know I’m going to make mistakes and I’m okay with that.
Instead of being nervous I tend to go into problem solving mode:
“How did I get the dancers 8 beats off the phrase?”
“Can I jump back to an earlier point in the song to give us more time without
it sounding bad?”
“I haven’t practiced this mix enough, focus on the cue out point coming up.”
etc.
This apparently isn’t the case when I DJ Lindy.
The first time, I was immediately a nervous wreck.
This is likely particular to me, of course, but it was still an interesting
difference that I wasn’t expecting given how much more technically difficult
Contra DJing is.
I knew intellectually that the technical side of doing a mix (ie. beat matching,
harmonic mixing, transitioning between tunes, etc.) isn’t the important part of
DJing, the finesse of picking tracks that the crowd will like is what matters.
A DJ who just plays a few contra songs, but chooses them well is a much better
crowd pleaser than one who does impressive mixing but picks bad songs.
However, when it came right down to it I was still surprised by how much
more nerve wracking it was when that’s the only thing you’re being judged on.
At some point I remembered that it’s just a dance and if one of them is bad or
doesn’t work, we’ll move on and play another song.
If I can’t find something, playing something at random is fine too (not ideal,
but fine).
Once I accepted this I almost immediately started picking songs quicker and not
having to rely on picking something random at the last minute after all.
It’s much easier to focus on what will be good when you’re not worried about
whether it will be perfect.
After that we were able to cover for each other and play off each other, and it
made the evening much more enjoyable.
If one of us killed the floor, the other would try a different style
and bring it back.
Doug covered for me, and I was even able to cover for Doug once or twice and
revive a somewhat empty floor!
None of this is something I’d have to deal with in Contra where my mixes are
pre-selected, practiced, and where I’m picking from a much smaller selection of
tunes.
Playing to the Dancers
While Lindy may not require the technical skills used when mixing tunes in the
same way that Contra does, the dancers also aren’t pre-lined-up as they would be
with a Contra or Square dance.
If you play a tune no one likes at Contra most everyone is stuck with it for 7
minutes or so until the caller wraps up the dance.
The dance may fall a part entirely if the tune is too fast or doesn’t have clear
enough phrasing for the dancers or caller to follow along, but generally
speaking as long as the track sort of works the dancers will dance to it—and
they’ll probably enjoy themselves.
There are also fewer dances in an evening, so I suspect dancers feel more
compelled to dance every single dance.
With Lindy that’s not the case.
Many dancers will wait to hear if your track selection is one that they like
before venturing out onto the dance floor, and even those that aren’t
deliberately checking the music may not be as inclined to break off their
conversations with a friend to go ask someone to dance if the track doesn’t
immediately catch their interest.
There is also a several minute break between each tune in a contra dance where
the caller teaches the next pre-choreographed dance.
This means that if two back-to-back mixes have nothing to do with each other, or
sound completely different, no one notices as long as you’ve picked a mix that
goes well with the dance.
Whereas with Lindy only a few seconds elapse between songs, just enough time for
someone to thank their partner and go ask the next person to dance.
This means that you have to consider the previous track when selecting the next
one: a leap from fast balboa to slow blues is going to be jarring for the
dancers and they may choose not to dance.
Changing the style requires either gradually shifting between the two over
several tracks, or maybe giving a slightly longer pause between songs to let the
dancers get the previous style out of their ears and bodies.
Similarly there is a big difference in what music really gets the dancers
blood pumping, though I suspect this is specific to these two venues and not to
the type of social dancing as a whole.
With the contra venue I DJ for it’s mostly a younger crowd and they’re mostly
used to hearing a hand full of local old-time string bands and the occasional
high energy (but still traditional) New England style dance band.
The contra chestnuts are an important part of the dances history, and sometimes
you play them, but they don’t get many people excited.
This means that I can do two things if the energy is feeling low: I can play a
track by a band they normally wouldn’t be able to hear that’s a bit more modern
sounding, or otherwise has something different and interesting about it, or I
can mix in a pop tune they’re familiar with.
This is almost like a cheat code: if the energy is low, play a song they know
and they’ll get excited and raise the energy of the floor.
With Lindy it’s not quite as simple as that.
The reliable floor savers for Lindy are mostly old chestnuts by some of the
jazz greats.
Modern swing is sometimes played, but sparingly, and pop songs are a definite
“no”.
People come to the dance expecting a certain style, and they’re unhappy if you
don’t stick to it.
You have to work within the constraints of the genre, and picking floor savers
is much more subtle work that requires carefully watching the dancers and seeing
what will make them take to the dance floor on any particular night.
The act of watching the floor and adjusting the set as necessary may be obvious
to club DJs and other social dance DJs, but to me it was a new experience, and
one that I initially found somewhat paralyzing.
For the first few tracks, my friend Doug had to cover for me and play as if he
were the solo DJ while I flailed trying to find a track that I thought would
work.
I hadn’t fully internalized until that moment that
in a Contra dance the DJ is picking the music to match the dance, but in Lindy
Hop the dancers are picking the dance to match the music, and
this may include not dancing entirely!
I let the perfect become the enemy of the good and Doug had to pick several
tracks in a row even though in theory we were trading songs 1 for 1.
Genre and Form
Sometime after the half I had mostly gotten over my nerves, and most of the
newbies had drifted off home.
I felt more comfortable trying a few experimental tracks that targeted primarily
the more experienced late-night crowd: one a fast blues dance recorded at a
legendary local Blues club, and the other two folksy tracks by bands that mostly
play contra dances.
I was a bit nervous about these tracks as I didn’t know how they’d be received
at this particular dance where the DJs play almost exclusively 30s and 40s jazz
and the most modern bands that get any air time tend to be emulating the style
of the jazz greats.
Luckily they all went over well and filled the dance floor!
A few people switched to blues dancing for “Sweet Betty”, while others
continued with Lindy.
Even better, for “Rhinoceros for Sue” the head DJ for the organization (who
schedules everyone else, and therefore was the person to try and impress during
the evening) went out on the floor to do some Balboa and came over afterwards
and asked me what the track was!
I mention this because this is both a similarity and a difference from Contra.
Techno-contra1 excluded, I largely can’t play anything for a contra dance
that’s not in strict 32-bar “AABB” form.
I can layer a modern beat or a pop song over a traditional contra tune, or
maybe even find pop tunes that more or less stick to contra form and play it
alone, but the form has to be there for the dancers (and some callers) to be
comfortable.
With Lindy the freedom to play tracks with a wider variety of forms, so long as
they respect the history of the dance, was a nice change of pace.
That said, mostly it still needs to have a swung beat and I’m more at the mercy
of what the dancers like (which is a narrower subset of music in the Lindy scene
in my experience, as previously mentioned), so maybe this is more of a
similarity than a difference.
Conclusion
Like learning to dance both lead and follow roles (in Lindy), or from either
side of the minor set (in Contra): having done two different forms of DJing
will, I suspect, make me a better DJ for either type of dance.
I really enjoyed DJing for Lindy and was delighted when the head DJ asked if I’d
like to start doing it regularly, hopefully I’ll be able to do it more often
going forward!
If you’re curious about the set Doug and I ended up playing, the final set list
for the evening can be found on Musicbrainz.
contra set to pop music, often with glow sticks and blacklights.
Mostly it has no relation to techno music though some techno may be used.
Here the dancers and callers often aren’t expecting strict contra form. ↩︎
Just like any other product or project by the XSF, the Newsletter is the result of the voluntary work of its members and contributors. If you are happy with the services and software you may be using, please consider saying thanks or help these projects!
If you are interested in joining the XMPP Standards Foundation as a member, please apply before February 15th, 2026, 00:00 UTC.
Being a member signals a commitment to open standards and professional engagement in / with the XMPP community.
Here, your membership helps position the XSF as a healthy organization, which in itself is valuable.
It also grants voting rights on technical and administrative matters within the XSF.
The application is a light-weight and free of cost process and you can use membership to get more involved more easily, too.
XMPP Summit 28
The XSF held its 28th XMPP Summit during January 29th and 30th 2026 in Brussels (Belgium, Europe). During this two-day gathering, we discussed XMPP protocol development topics and kept making progress on current issues within the protocol and ecosystem. We would like to thank everyone that took part in the Summit for their continuous commitment and contribution to the XSF and all the XMPP related projects!
The XSF would like to extend a special thank you to those who made this XMPP Summit possible:
Ralph Meijer, Dan Caseley and Edwin Mons for their time and dedicated work on streaming the Summit.
Ralph Meijer for organising the XSF dinner and Alexander Gnauck’s noted sponsor contribution.
Additional thanks to mathieui, Rémi and other unknown people helping to keep track of the notes during the event.
Welcome to the 28th XMPP Summit!
A summary of the main topics discussed is planned to be published soon at xmpp.org.
XMPP at FOSDEM 2026
During January 31st and February 1st, the XSF was present at FOSDEM 26 in Brussels, Belgium. The XMPP community took part in the Realtime Lounge, a room located in Level 1, AW building, together with the Prosody IM and the Snikket projects, where several open source projects around the Decentralised Communication Devroom can present themselves.
We are pleased to say that there was a lot of interaction at the XMPP booth! A rather large number of FOSDEM visitors had the opportunity to come say “Hi!”, meet, interact, talk and have interesting conversations with many of the developers of the most popular clients, servers, tools and libraries that power the whole XMPP ecosystem and bring it to life.
XMPP listed as Alternative Chat at DI.DAY Initiative
The German initiative ‘Digital Independence Day’ (DI.DAY) has been kicked off this year to enable users to migrate to open-source software alternatives in various contexts.
Besides other services, XMPP is listed as an alternative chat option and XMPP Community members have created so-called switch recipes: Digital Independence Day. Find the related blogpost at xmpp.org
There are more related activities and resources available from the XMPP Community:
Macaw Instant Messenger Web/Desktop: The intention for this grant is to port the current Macaw web client to Tauri, which enables the client logic to run natively within a desktop application, as well as to implement new features such as group chats and sticker/emoji packs to improve usability. Further, to lay the groundwork for later development of features such as group video calls and end-to-end message encryption, as well as ports to other platforms.
Conversations has released versions 2.19.8 and 2.19.9 for Android. These versions introduce a fix for calls getting stuck at connecting when ‘Use Relays’ is enabled but server doesn’t have any. They also come with bandwidth optimizations and they combine QR code related actions (show, scan, invite) into one central menu. You can take a look at the changelog for all the details.
Gajim has released versions 2.4.2 and 2.4.3 of its free and fully featured chat app for XMPP. Installing Gajim on macOS is now only a single click away. Gajim 2.4.2 release brings a simplified macOS setup, easier sharing for files and support for link previews, along many other improvements, changes and some important bug fixes. You can take a look at the changelog for all the details.
Kaidan has released versions 0.14.0 and 0.15.0 of its user-friendly and modern chat app for XMPP. The former release brings support for advanced media sharing and registration provider filtering, while the latter implements an integrated search field and experimental support for Audio/Video Calls (with most of the work being funded by NLnet via NGI Zero Entrust and NGI Zero Commons Fund with public money provided by the European Commission) in addition to some very useful improvements and lots of fixes! You can find a detailed list of new features, bugfixes and notes in their respective release announcements, or the changelog.
Kaidan 0.15.0: Experimental Audio/Video support on Linux.
Monal has released versions 6.4.17 for iOS and macOS.
Monocles has released version 2.1 of its chat app for Android. This a huge update with three fundamental new features: Stories, Feeds, and Phone log. In addition to many other improvements and features such as account sorting and improved message deletion, this update also brings new support for multiple XEPs. Thanks to the standardization of XMPP, it is now possible to have social interaction across different XMPP platforms and messengers. These new features bring more functions that are fully compatible with the XMPP web platform Movim.
Create your stories today and make a post for your contacts in Monocles Chat or Movim!
Prose has released version 0.14.1 of prose-app-web, their web application built in TypeScript / VueJS / WebAssembly.
XMPP Servers
Prosody IM is pleased to announce versions 13.0.3 and 13.0.4, both minor releases of the stable branch. The former comes with a range of tweaks, bug fixes and minor improvements, and the latter being the encouraged upgrade, partly due to a bug that was introduced into UUID generation in the previous release. Although not strictly bug fixes, some configuration-related improvements that help make configuring Prosody a little easier and more reliable also made their way into the latest release. Read all the details on the changelog, and as always, detailed download and install instructions are available on the download page for your convenience.
MongooseIM has released MongooseIM 6.5: Open for Integration. This release focuses on easier integration with your applications while continuing to deliver a scalable and reliable XMPP-based messaging server. The most important improvement in MongooseIM 6.5.0 is the production-ready integration with RabbitMQ, allowing external services to process the events from the server. It is worth noting that the mechanism is highly extensible – you can craft such extensions yourself.
ProcessOne is pleased to announce the release of ejabberd 26.01. This release addresses real operational pain points: export your data from one database backend and import it into another, and roster invites and invite-based account registration to let your users invite others without opening the gates to spam! Make sure to read the changelog for all the details and a complete list of changes, new features, fixes and improvements on this release.
XMPP Libraries & Tools
QXmpp, the cross-platform C++ XMPP client and server library, version 1.14.0 has been released. Full details on the changelog.
Slidge version 0.3.6 has been released. You can check the intermediate changelog from 0.3.5 to 0.3.6 for all the details.
The XMPP Standards Foundation develops extensions to XMPP in its XEP series in addition to XMPP RFCs. Developers and other standards experts from around the world collaborate on these extensions, developing new specifications for emerging practices, and refining existing ways of doing things. Proposed by anybody, the particularly successful ones end up as Final or Active - depending on their type - while others are carefully archived as Deferred. This life cycle is described in XEP-0001, which contains the formal and canonical definitions for the types, states, and processes. Read more about the standards process. Communication around Standards and Extensions happens in the Standards Mailing List (online archive).
Proposed
The XEP development process starts by writing up an idea and submitting it to the XMPP Editor. Within two weeks, the Council decides whether to accept this proposal as an Experimental XEP.
This specification describes how to encrypt contacts metadata to minimize server exposure.
New
No new XEPs this month.
Deferred
If an experimental XEP is not updated for more than twelve months, it will be moved off Experimental to Deferred. If there is another update, it will put the XEP back onto Experimental.
It’s authorization-identifier not authorization-identity (dg)
Last Call
Last calls are issued once everyone seems satisfied with the current XEP status. After the Council decides whether the XEP seems ready, the XMPP Editor issues a Last Call for comments. The feedback gathered during the Last Call can help improve the XEP before returning it to the Council for advancement to Stable.
Looking for job offers or want to hire a professional consultant for your XMPP project? Visit our XMPP job board.
Newsletter Contributors & Translations
This is a community effort, and we would like to thank translators for their contributions. Volunteers and more languages are welcome! Translations of the XMPP Newsletter will be released here (with some delay):
Contributors:
To this issue: emus, cal0pteryx, Gonzalo Raúl Nemmi, Ludovic Bocquet, XSF iTeam
This XMPP Newsletter is produced collaboratively by the XMPP community. Each month’s newsletter issue is drafted in this simple pad. At the end of each month, the pad’s content is merged into the XSF GitHub repository. We are always happy to welcome contributors. Do not hesitate to join the discussion in our Comm-Team group chat (MUC) and thereby help us sustain this as a community effort. You have a project and want to spread the news? Please consider sharing your news or events here, and promote it to a large audience.
Tasks we do on a regular basis:
gathering news in the XMPP universe
short summaries of news and events
summary of the monthly communication on extensions (XEPs)
review of the newsletter draft
preparation of media images
translations
communication via media accounts
Unsubscribe from the XMPP Newsletter
For this newsletter either log in here and unsubscribe or simply send an email to newsletter-leave@xmpp.org.
(If you have not previously logged in, you may need to set up an account with the appropriate email address.)
Just like any other product or project by the XSF, the Newsletter is the result of the voluntary work of its members and contributors. If you are happy with the services and software you may be using, please consider saying thanks or help these projects!
If you are interested in joining the XMPP Standards Foundation as a member, please apply before February 15th, 2026, 00:00 UTC.
Being a member signals a commitment to open standards and professional engagement in / with the XMPP community.
Here, your membership helps position the XSF as a healthy organization, which in itself is valuable.
It also grants voting rights on technical and administrative matters within the XSF.
The application is a light-weight and free of cost process and you can use membership to get more involved more easily, too.
XMPP Summit 28
The XSF held its 28th XMPP Summit during January 29th and 30th 2026 in Brussels (Belgium, Europe). During this two-day gathering, we discussed XMPP protocol development topics and kept making progress on current issues within the protocol and ecosystem. We would like to thank everyone that took part in the Summit for their continuous commitment and contribution to the XSF and all the XMPP related projects!
The XSF would like to extend a special thank you to those who made this XMPP Summit possible:
Ralph Meijer, Dan Caseley and Edwin Mons for their time and dedicated work on streaming the Summit.
Ralph Meijer for organising the XSF dinner and Alexander Gnauck’s noted sponsor contribution.
Additional thanks to mathieui, Rémi and other unknown people helping to keep track of the notes during the event.
Welcome to the 28th XMPP Summit!
A summary of the main topics discussed is planned to be published soon at xmpp.org.
XMPP at FOSDEM 2026
During January 31st and February 1st, the XSF was present at FOSDEM 26 in Brussels, Belgium. The XMPP community took part in the Realtime Lounge, a room located in Level 1, AW building, together with the Prosody IM and the Snikket projects, where several open source projects around the Decentralised Communication Devroom can present themselves.
We are pleased to say that there was a lot of interaction at the XMPP booth! A rather large number of FOSDEM visitors had the opportunity to come say “Hi!”, meet, interact, talk and have interesting conversations with many of the developers of the most popular clients, servers, tools and libraries that power the whole XMPP ecosystem and bring it to life.
XMPP listed as Alternative Chat at DI.DAY Initiative
The German initiative ‘Digital Independence Day’ (DI.DAY) has been kicked off this year to enable users to migrate to open-source software alternatives in various contexts.
Besides other services, XMPP is listed as an alternative chat option and XMPP Community members have created so-called switch recipes: Digital Independence Day. Find the related blogpost at xmpp.org
There are more related activities and resources available from the XMPP Community:
Macaw Instant Messenger Web/Desktop: The intention for this grant is to port the current Macaw web client to Tauri, which enables the client logic to run natively within a desktop application, as well as to implement new features such as group chats and sticker/emoji packs to improve usability. Further, to lay the groundwork for later development of features such as group video calls and end-to-end message encryption, as well as ports to other platforms.
Conversations has released versions 2.19.8 and 2.19.9 for Android. These versions introduce a fix for calls getting stuck at connecting when ‘Use Relays’ is enabled but server doesn’t have any. They also come with bandwidth optimizations and they combine QR code related actions (show, scan, invite) into one central menu. You can take a look at the changelog for all the details.
Gajim has released versions 2.4.2 and 2.4.3 of its free and fully featured chat app for XMPP. Installing Gajim on macOS is now only a single click away. Gajim 2.4.2 release brings a simplified macOS setup, easier sharing for files and support for link previews, along many other improvements, changes and some important bug fixes. You can take a look at the changelog for all the details.
Kaidan has released versions 0.14.0 and 0.15.0 of its user-friendly and modern chat app for XMPP. The former release brings support for advanced media sharing and registration provider filtering, while the latter implements an integrated search field and experimental support for Audio/Video Calls (with most of the work being funded by NLnet via NGI Zero Entrust and NGI Zero Commons Fund with public money provided by the European Commission) in addition to some very useful improvements and lots of fixes! You can find a detailed list of new features, bugfixes and notes in their respective release announcements, or the changelog.
Kaidan 0.15.0: Experimental Audio/Video support on Linux.
Monal has released versions 6.4.17 for iOS and macOS.
Monocles has released version 2.1 of its chat app for Android. This a huge update with three fundamental new features: Stories, Feeds, and Phone log. In addition to many other improvements and features such as account sorting and improved message deletion, this update also brings new support for multiple XEPs. Thanks to the standardization of XMPP, it is now possible to have social interaction across different XMPP platforms and messengers. These new features bring more functions that are fully compatible with the XMPP web platform Movim.
Create your stories today and make a post for your contacts in Monocles Chat or Movim!
Prose has released version 0.14.1 of prose-app-web, their web application built in TypeScript / VueJS / WebAssembly.
XMPP Servers
Prosody IM is pleased to announce versions 13.0.3 and 13.0.4, both minor releases of the stable branch. The former comes with a range of tweaks, bug fixes and minor improvements, and the latter being the encouraged upgrade, partly due to a bug that was introduced into UUID generation in the previous release. Although not strictly bug fixes, some configuration-related improvements that help make configuring Prosody a little easier and more reliable also made their way into the latest release. Read all the details on the changelog, and as always, detailed download and install instructions are available on the download page for your convenience.
MongooseIM has released MongooseIM 6.5: Open for Integration. This release focuses on easier integration with your applications while continuing to deliver a scalable and reliable XMPP-based messaging server. The most important improvement in MongooseIM 6.5.0 is the production-ready integration with RabbitMQ, allowing external services to process the events from the server. It is worth noting that the mechanism is highly extensible – you can craft such extensions yourself.
ProcessOne is pleased to announce the release of ejabberd 26.01. This release addresses real operational pain points: export your data from one database backend and import it into another, and roster invites and invite-based account registration to let your users invite others without opening the gates to spam! Make sure to read the changelog for all the details and a complete list of changes, new features, fixes and improvements on this release.
XMPP Libraries & Tools
QXmpp, the cross-platform C++ XMPP client and server library, version 1.14.0 has been released. Full details on the changelog.
Slidge version 0.3.6 has been released. You can check the intermediate changelog from 0.3.5 to 0.3.6 for all the details.
The XMPP Standards Foundation develops extensions to XMPP in its XEP series in addition to XMPP RFCs. Developers and other standards experts from around the world collaborate on these extensions, developing new specifications for emerging practices, and refining existing ways of doing things. Proposed by anybody, the particularly successful ones end up as Final or Active - depending on their type - while others are carefully archived as Deferred. This life cycle is described in XEP-0001, which contains the formal and canonical definitions for the types, states, and processes. Read more about the standards process. Communication around Standards and Extensions happens in the Standards Mailing List (online archive).
Proposed
The XEP development process starts by writing up an idea and submitting it to the XMPP Editor. Within two weeks, the Council decides whether to accept this proposal as an Experimental XEP.
This specification describes how to encrypt contacts metadata to minimize server exposure.
New
No new XEPs this month.
Deferred
If an experimental XEP is not updated for more than twelve months, it will be moved off Experimental to Deferred. If there is another update, it will put the XEP back onto Experimental.
It’s authorization-identifier not authorization-identity (dg)
Last Call
Last calls are issued once everyone seems satisfied with the current XEP status. After the Council decides whether the XEP seems ready, the XMPP Editor issues a Last Call for comments. The feedback gathered during the Last Call can help improve the XEP before returning it to the Council for advancement to Stable.
Looking for job offers or want to hire a professional consultant for your XMPP project? Visit our XMPP job board.
Newsletter Contributors & Translations
This is a community effort, and we would like to thank translators for their contributions. Volunteers and more languages are welcome! Translations of the XMPP Newsletter will be released here (with some delay):
Contributors:
To this issue: emus, cal0pteryx, Gonzalo Raúl Nemmi, XSF iTeam
This XMPP Newsletter is produced collaboratively by the XMPP community. Each month’s newsletter issue is drafted in this simple pad. At the end of each month, the pad’s content is merged into the XSF GitHub repository. We are always happy to welcome contributors. Do not hesitate to join the discussion in our Comm-Team group chat (MUC) and thereby help us sustain this as a community effort. You have a project and want to spread the news? Please consider sharing your news or events here, and promote it to a large audience.
Tasks we do on a regular basis:
gathering news in the XMPP universe
short summaries of news and events
summary of the monthly communication on extensions (XEPs)
review of the newsletter draft
preparation of media images
translations
communication via media accounts
Unsubscribe from the XMPP Newsletter
For this newsletter either log in here and unsubscribe or simply send an email to newsletter-leave@xmpp.org.
(If you have not previously logged in, you may need to set up an account with the appropriate email address.)
This version fixes a regression in the previous release regarding joining rooms, improves compatibility with the new aiodns releases,
and brings a number of other features and fixes.
Thanks to everyone involved (with new contributors) for this release!
Fixes
A lot of deprecation warnings for current and future python versions
A bug in the JID implementation where bool() would always be true, which would prevent joining rooms with the XEP-0045 plugin
Plenty of typos in the documentation and docstrings, thanks to the typos tool
Removes most known "unknown stanza interface" messages
On 11th February, Let’s Encrypt will be rolling out a change to the
certificates they issue to servers by default. Although there is generally
nothing that Prosody operators need to do, servers using the new certificates
may experience problems connecting to some other XMPP servers on the network.
Certificate basics
First, a tiny bit of background on certificates. Certificate Authorities (CAs)
such as Let’s Encrypt work by verifying that you own or control a domain, and
then they issue you with a certificate that you can present to others as proof
of this verification. Obtaining a certificate can be done using the ‘certbot’
tool or any one of the large number of tools compatible with the ACME protocol.
When an XMPP client connects to a server, it will expect the server to present
a certificate which is valid for the domain the client is logging in to.
Likewise, certificates are also used when servers connect to other servers
(server-to-server connections are often called “s2s” or generally
“federation”). This prevents various attacks, including spoofing - because
when your server receives a message claiming to be from “user@example.com”, it
can ensure that the server it came from presented a valid certificate for
“example.com” and has been verified.
Certificates can specify usage
Most people know that certificates contain the domain name that has been
verified. However they contain other data too, including the details of the CA
that signed and issued the certificate, validity period, and various metadata.
Another part of the certificate can specify limitations on what the
certificate can be used for. For example, a CA’s own certificate will specify
that they are allowed to use their certificate to sign other certificates.
Similar restrictions can be used to permit whether it can be used for signing
and/or encryption.
One such extension, called “Extended Key Usage” can be used to restrict
whether the certificate is used for “server authentication” or “client
authentication”.
What’s changing?
Let’s Encrypt currently issue certificates which specify they may be used for
both “server authentication” and “client authentication”. However they have
announced
that they will be issuing certificates for only “server authentication” by
default from 11th February 2026. In the rest of this post we’ll refer to
these as “server-only” certificates.
Traditional interpretation of the relevant specifications would forbid use of
those certificates by a client which is connecting to a server. Unfortunately,
XMPP makes heavy use of connections between servers, and in the context of
such server-to-server connections the TLS specifications actually consider the
server that initiated the connection to be a “client” (not an XMPP client, but
a TLS client).
Common TLS libraries and APIs such as OpenSSL will automatically verify the
certificate’s key usage fields, and fail certificate validation if an incoming
connection is received that uses a certificate without the “client
authentication” purpose. This has the potential to break server-to-server
connection authentication in XMPP (and also other protocols that make
connections between servers).
Does this affect Prosody?
Not directly. Let’s Encrypt is not the first CA to issue server-only
certificates. Many years ago, we incorporated changes into Prosody which allow
server-only certificates to be used for server-to-server connections,
regardless of which server started the connection. We believe that this is the
correct approach for XMPP.
This means that Prosody will accept connections from servers that are using
the new server-only certificates from Let’s Encrypt.
Unfortunately this behaviour is not standardized, partly due to controversy
outside the XMPP community about this approach. The current CA ecosystem is
heavily driven by web browser vendors (i.e. Google, Apple, Microsoft and
Mozilla), and they are increasingly hostile towards non-browser applications
using certificates from CAs that they say only provide certificates for
consumption by web browsers.
An attempt at updating the specifications
to clarify the expected roles of servers and clients failed to gain consensus
at the IETF.
Does this affect the XMPP network?
Although Prosody will accept server-only certificates, some other server
implementations do not have the alternative certificate usage validation
that Prosody has, or they added it only recently.
Compatible servers:
ejabberd (requires 25.08 or later)
Openfire
Operators of incompatible server versions should upgrade to a version that is
compatible with server-only certificates as soon as possible to prevent
problems with federation.
Server software not listed above has not been tested, and may not accept
connections from servers using server-only certificates.
What will happen with other servers?
If a server does not use the alternative validation (because the software
doesn’t implement it, or it has not been updated) then it will treat the
certificates of all other servers as invalid for initiating s2s connections.
Many servers still have the dialback protocol enabled, which will act as a
fallback authentication mechanism (using DNS), and in this case the
connections may still succeed.
However if dialback is disabled on either server, or if the target server
strictly requires valid certificates, server-to-server connections will always
fail entirely.
You may see errors in your Prosody log file such as:
Server-to-server connection failed: Could not authenticate to remote server
In such a case, the remote server operator usually needs to update their
software.
How can I test my server?
Send an XMPP ping (XEP-0199) to le-tlsserver.badxmpp.eu - if you get a
successful iq response, this means your server accepts server-only
certificates. If you don’t get a response, check your server’s log file for
any incoming s2s failures.
Welcome to the latest edition of your pseudo-monthly JMP update!
In case it’s been a while since you checked out JMP, here’s a refresher: JMP lets you send and receive text and picture messages (and calls) through a real phone number right from your computer, tablet, phone, or anything else that has a Jabber client. Among other things, JMP has these features: Your phone number on every device; Multiple phone numbers, one app; Free as in Freedom; Share one number with multiple people.
This month begins JMP’s 2026 referral event! From now until June 1st, everyone you refer to JMP rewards you triple! That’s three free months of service for every person who signs up and pays.
For those who haven’t explored the referral system much, a short refresher on how it works. In your account settings there is a command Refer a friend for free credit. You will be presented with a message that reads like so:
This code will provide credit equivalent to one month of service to anyone after they sign up and pay: CODE These remaining codes are single use and give the person using them a free month of JMP service. You will receive credit equivalent to one month of service after someone uses any of your codes and their payment clears.
When someone uses this code during their signup process with JMP, they will sign up and pay as usual. But after they pay, they will get a free month deposited to their initial balance as well. Once their payment clears (about 90 days for a credit card transaction) your account will also get a month’s worth of credit deposited. Except for referrals which reward during this event, it will be three months! This code is appropriate for publishing publicly and can be used over and over again.
Under this message in the command result is a list of invite codes. If you are out of invite codes, you can always ask JMP support for more as well. These codes are each single-use and give the one person who uses them a free month of JMP service right away. They don’t pay anything. Then, if they pay, and once their payment clears (about 90 days for a credit card transaction) your account will also get a month’s worth of credit deposited. Except for referrals which reward during this event, it will be three months! These codes are appropriate for giving to trusted friends or family members, and each code can only be used once.
To learn what’s happening with JMP between newsletters, here are some ways you can find out:
This document defines common Vorbis comments related to
Contra, Square and other traditional called folk dances.
Their use is also recommended (and identical) in other specifications that
re-use Vorbis comments such as OGG/Opus Tag Definitions, and FLAC tags.
The same names may be used in other metadata containers such as APE or ID3
but their use in these systems is not defined in this document.
Terminology
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”,
“SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this
document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174]
when, and only when, they appear in all capitals, as shown here.
Namespace
Each tag defined in this document will use the CONTRA: namespace to
differentiate it from similar tags that may already exist.
This is true regardless of the dance form being used (ie. if the recording is of
a square dance, the CONTRA: namespace is still used).
Tags
CONTRA:CALLER
The name of the caller heard in the track for recordings that include calls.
CONTRA:TITLE
The name of the dance in recordings that include calls. For example,
“Scrubbies”.
CONTRA:CHOREOGRAPHER
The name of the dance author in recordings that include calls. For example,
“David Smukler”.
The special value “[traditional]” SHOULD be used for traditional dances where no
known choreographer exists.
For dances that are a variation on a previous dance the choreographers SHOULD be
listed in reverse chronological order, with the author of the variant as the
first author.
CONTRA:UNSYNCEDDANCE
The moves of the dance, a single time through, in a plain text format.
No exact style is specified but the dance author, choreographer, difficulty, or
any callers notes SHOULD NOT be included and should instead be read from the
appropriate tags.
CONTRA:NOTES
Any caller or listener provided notes (ie. “Beginner friendly dance” or “When
teaching the A1 part, have the Larks cross over first…”, etc.)
CONTRA:ROLES
The role terms used in the dance for recordings that include calls.
For example: “Larks/Robins” or “Positional”.
No specific format is defined.
CONTRA:LICENSE
Like the LICENSE field defined in vorbis/v-comment, but for the license of
the dance instead of the recording.
CONTRA:POTATOES
The number of beats (not bars) of introduction before the first time through
the dance begins (whether they are traditional bluegrass-style potatoes or an
introductory phrase).
This MAY be used in conjunction with CONTRA:START.
CONTRA:START
The start time (in milliseconds) of the first time through the dance (where
the dancers would start moving, not where the caller would start calling).
This MAY be used in conjunction with CONTRA:POTATOES.
CONTRA:TIMES
The number of complete times through the dance excluding any intros, potatoes,
or outros.
The exact definition will depend on the type of dance, for contras it should be
complete 64 beat (32 bar) phrases.
CONTRA:CROOKED
Whether the dance is crooked (ie. not in perfect dance form) or not. This key
MUST always be the value “TRUE” or “FALSE”.
The German initiative ‘Digital Independence Day’ (DI.DAY) has been kicked off this year to enable users to migrate to open-source software alternatives in various contexts.
Besides other services, XMPP is listed as an alternative chat option and XMPP Community members have created so-called switch recipes: Digital Independence Day.
The DI.DAY is not a single event, it takes place every first sunday of the month so interested users can switch one service at a time.
This initiative shares many values of the XMPP community, such as digital sovereignty and digital privacy.
Still, we believe XMPP as standardised technology for realtime communication serves these values best.
Many thanks to the XMPP Community members and beyond for investing their time and efforts to provide all material, namely Axel, Daniel, emus, Ge0rG, padeluun and especially IM from freie-messenger.de!
Additional thanks to Digitalcourage and Save Social for sponsoring the handouts for FOSDEM!
Kaidan has supported voice and video messages for a long time.
Starting with this release, you can even have an audio or video call with a contact!
An incoming call is indicated via a notification and you can either accept or reject it.
Please note that there are still some features missing and some setups may not work properly.
Especially, calls are only supposed to work on Linux at the moment.
But wee wanted to share the current achievements with you to get some feedback!
Our goal is to extend the A/V calls functionality and make it available on other operating systems in the future.
Notifications for Group Chat Replies
Formerly, you got a notification if someone mentioned you in a group chat while the corresponding setting was enabled.
But you could miss replies to your messages.
Kaidan notifies you now on receiving replies as well.
Message Input Field Focusing
In contrast to the soft keyboard on a mobile device, which needs to be opened each time you want to enter something, your keyboard is always reachable on a desktop device.
Why not make use of that circumstance?
Kaidan ensures that the most relevant message input field stays focused to allow entering text without an additional click into the corresponding field.
That way, you can interact smoothly with the user interface and be more productive.
Advanced Message Highlighting
Kaidan 0.14 introduced highlighted messages if you opened their context menu.
Messages are now also highlighted while they are being corrected or while you are choosing emojis to react to them.
If another message was already highlighted before, that message is highlighted again once you sent the correction/reaction.
Integrated Search Field
With Kaidan, you can quickly search for chats and messages.
But while searching for messages, the opened search bar reduced the space for messages.
On mobile devices, the search bar even consumed unnecessary space within the chat list.
Both problems are solved now!
The search field is integrated into the main toolbar above the messages resp. the chat list.
You can even focus each search field via an own keyboard shortcut to directly search without moving the cursor.
Password Manager Fallback
Since Kaidan’s last version, passwords are stored in a password manager if the system provides one.
But there was no fallback yet.
It is now possible to use Kaidan even if no password manager is available.
In that case, the passwords are stored in an unencrypted file.
Once Kaidan detects a password manager on start, the unencrypted passwords are automatically migrated to the password manager.
Changelog
There are several other improvements.
Have a look at the following changelog for more details.
Features:
Add support for audio/video calls (XEP-0166: Jingle, XEP-0167: Jingle RTP Sessions, XEP-0176: Jingle ICE-UDP Transport Method, XEP-0215: External Service Discovery, XEP-0320: Use of DTLS-SRTP in Jingle Sessions, XEP-0353: Jingle Message Initiation) (@melvo)
Show busy indicator while saving captured image/video data (@melvo)
Notify on receiving reply to own group chat message if ‘On mention’ notification setting is enabled (@melvo)
Select file after opening in folder on Linux if supported (@melvo)
Improve media capturing look/behavior (including preview after capturing image until image is saved) (@melvo)
Restore focusing of last focused user interface elements (especially message input field) for various use cases (@melvo)
Keep message bubble highlighted on reacting/correcting (@melvo)
Allow to select message for correction via Ctrl+Up/Ctrl+Down (@melvo)
Integrate search field into main toolbar increasing space for messages and, on mobile devices, even for chats in chat list (@melvo)
Show message search field via Ctrl+Shift+F (@melvo)
Display toolbar buttons on mobile devices exactly as on desktop devices (@melvo)
Hide horizontal separator above top-most chat unless chat list is scrolled (@melvo)
Store passwords in unencrypted file if no password manager is available or corresponding command-line option provided (@fazevedo)
Migrate unencrypted passwords to password manager if available on start (@fazevedo)
Bugfixes:
Fix overlapping message bubble tail (@melvo)
Fix medium preview hovering if hidden drop area info is hovered (@melvo)
Fix updating OMEMO 2 keys for all use cases (@melvo)
Fix deadlock on logout during upload of multiple files (@melvo)
Fix creating additional database connection on wrong thread (@melvo)
Fix sending/resetting whether message is being composed for various corner cases (switching chat, logging out, disabling corresponding setting) (@melvo)
Fix updating last message on receiving initial message after setting up existing account in Kaidan for first time (@melvo)
Fix resetting draft message after canceling message correction (@melvo)
Fix resending failed message reaction (@melvo)
Fix selecting previously selected message after changing reactions (@melvo)
Fix restoring message highlighting and cancel ongoing correction/reply on removing corresponding message (@melvo)
Fix displaying last message sender in chat list after draft message removal (@melvo)
It was mid-December 2025, just before the Christmas break. My favorite XMPP client had broken on the main branch I was using. Frustrated, rather than waiting for a fix, I decided I wanted to give another try at working on a client. This time, I would be using the opportunity to explore a new set of tools I was curious about: TypeScript, React, and Tauri.
What started as a weekend experiment quickly turned into something more. Using AI tools to accelerate the initial setup, I found myself totally absorbed in the work. Days blurred together as features took shape. By early January, what had been a personal scratch project had become a surprisingly capable desktop client.
When I demonstrated it to my coworkers at ProcessOne, their reaction was unanimous: this was worth pursuing seriously. We decided to put the entire company behind the effort. Today, we&aposre sharing the first public release of Fluux Messenger.
More Than Just Another Chat Client
At ProcessOne, we&aposve spent over two decades building messaging infrastructure. Our XMPP server, ejabberd, has powered some of the world&aposs largest messaging deployments. But we&aposve always approached messaging from the server side. Fluux Messenger represents something new for us, bringing that same engineering philosophy to the client.
The key innovation isn&apost in the UI (though we&aposre proud of it). It&aposs in what lies beneath: the Fluux SDK.
The Fluux SDK: Bridging Two Worlds
Anyone who has built an XMPP client knows the challenge. XMPP is event-driven, signal-based, asynchronous. Modern UI frameworks expect reactive state, typed data, and predictable updates. There&aposs an impedance mismatch between these two worlds.
The Fluux SDK is our answer. It provides a high-level TypeScript API that handles all XMPP complexity internally. Developers work with clean types and reactive state, not XML stanzas. The SDK maintains local cache, manages reconnection, and handles synchronization intelligently. It&aposs not a passive pipe between server and UI; it&aposs an active participant that makes the client easier to develop and more resilient.
As an example, the client is not telling the SDK which presence it wants to publish when stepping away from the computer, but it will signal to the SDK that it is inactive. The SDK is responsible for doing the right thing.
This three-tiered architecture, Server -> Headless client (SDK) -> UI, lets us apply the same design principles that made ejabberd scalable to the client side. Distributed logic, local-first responsiveness, server-side efficiency.
What Fluux Messenger Offers Today
The current release (v0.11.1) already includes substantial functionality:
Reliable connection and message management
Cross-platform desktop app for Windows, macOS, and Linux, built on Tauri for a lightweight native experience
Web version: It works great on the Web as well.
40+ XMPP extensions (XEPs) implemented, including message archive management, multi-user chat, HTTP file upload, message carbons, and reactions
MUC support with @mentions notification and bookmarks
Local message cache storage using IndexedDB with automatic sync on reconnect
Built-in XMPP console for developers and power users who want to see what&aposs happening under the hood
Preliminary admin capabilities letting you manage your ejabberd server directly from the client (But this is still mostly a work in progress).
8 languages supported out of the box
Light and dark modes with theme system to come
What I envision for Fluux Messenger is to follow the steps of major projects like Obsidian or VSCode. In my wildest dreams, I expect Fluux Messenger to become as configurable and versatile as those tools.
The Road Ahead
This is an ambitious project. The roadmap stretches far into the future, and we&aposre just getting started. Our plans include mobile support through PWA and eventually native apps, expansion to other frameworks (Vue, Svelte), and Kotlin Multiplatform for Android and iOS.
But ambitious doesn&apost mean closed. Fluux Messenger is open source under AGPL-3.0. We believe that modern, privacy-respecting messaging shouldn&apost require vendor lock-in. Connect to any XMPP server. Host it yourself.
I used AI to bootstrap this project and accelerate my learning phase. Many developers do now. But we are crafters at ProcessOne, and we want to own the responsibility for great code. Those who know me will tell you I&aposll be relentless until I master React and TypeScript, and they know I will. Fast.
A Continuation of ejabberd&aposs Vision
Fluux Messenger represents the client-side continuation of what we started with ejabberd over twenty years ago. The same principles, scalability, reliability, clean architecture, now flow from server to client. If you&aposve trusted ejabberd to power your messaging infrastructure, we hope you&aposll trust Fluux Messenger to be the interface your users deserve.
This is the beginning of an exciting journey. We hope you&aposll join us.
We’re looking forward to meeting new and familiar faces at FOSDEM
in Brussels this weekend!
Every February, thousands of developers (and users) of open-source and free
(as in freedom) software gather in Brussels to discuss and celebrate our
communities, and collaborate and share ideas and projects.
If you are attending, come and find us in the AW building, Level 1. We’ll
be sharing the stand with other projects in the XMPP
ecosystem and adjacent to other communication projects such as Linphone,
Delta Chat and Matrix.
You can bring us questions about Snikket or XMPP, receive help with your own
Snikket deployment, or just stop by and say hi!
We’re looking forward to meeting new and familiar faces at FOSDEM
in Brussels this weekend!
Every February, thousands of developers (and users) of open-source and free
(as in freedom) software gather in Brussels to discuss and celebrate our
communities, and collaborate and share ideas and projects.
If you are attending, come and find us in the AW building, Level 1. We’ll
be sharing the stand with other projects in the XMPP
ecosystem and adjacent to other communication projects such as Linphone,
Delta Chat and Matrix.
You can bring us questions about Prosody or XMPP, receive help with your own
Prosody deployment, or just stop by and say hi!
You can now easily find an XMPP provider based in the European Union (EU)!
We have updated our filter options.
Previously, you could filter for the server location of an XMPP provider.
That filter now allows to select EU-only hosted services.
Try it out!
Click the Filter list drop-down menu on the main page.
The location-based filter allows to select the server location.
There are many other properties you can filter for, too.
In addition, there is an overview table of providers with column filters and sorting options.
Looking forward to more European Union XMPP chat providers and beyond!
You can also consider to run your own XMPP server and become a public provider.
With our automated XMPP server setup, you can operate a fully-featured XMPP server with minimal effort.
We are pleased to announce a new minor release from our stable branch.
Welcome to another minor release from our stable branch!
We encourage any deployments using 13.0.3 to upgrade, partly due to a bug that
was introduced into UUID generation in that release. We’re not aware of any
direct consequences of this bug, but it may cause compatibility problems with
other software.
Although not strictly bug fixes, we sneaked in some configuration-related
improvements to this release which help make configuring Prosody a little
easier and more reliable. We’re highlighting them because these changes have a
chance to impact some rare configurations.
The first change is to prevent mod_pubsub from being loaded on a VirtualHost
(easily done if you accidentally add it to your global modules_enabled list).
Loading mod_pubsub on a normal user host can lead to unexpected behaviour. Now
it will log an error and refuse to load if you do that.
The second change is to simplify configuration of archiving in MUCs.
Practically all modern clients now use XEP-0313 to synchronize message
history. For VirtualHosts this is implemented in mod_mam, and for MUC
components it is implemented in mod_muc_mam. From this release, things get
much simpler: loading mod_mam (globally or directly on a MUC component) will
automatically load mod_muc_mam on the MUC component. This means most people
(e.g. who have mod_mam loaded globally on their server) can now remove
“muc_mam” from modules_enabled in their MUC component configuration. It will
be loaded automatically.
This last point does mean that if you have mod_mam enabled globally, but do
not want it enabled on your MUCs, you now have to state that explicitly
by adding “mam” to modules_disabled under the MUC’s Component. Be aware that
such a configuration may lead to missing messages in group chats.
A summary of changes in this release:
Fixes and improvements
mod_s2s: Fix traceback when outgoing s2s queue is full
util.uuid: Fix padding of group 2 of UUIDv7 to use zeroes
Minor changes
core.modulemanager: Fix shell commands on components
mod_s2s: Explicitly prevent sending recursive error replies when queue is full
modulemanager: Allow component modules to specify additional inherited modules
prosodyctl check features: Use modulemanager to calculate modules that will actually be loaded
prosodyctl check features: change recommendation from mod_muc_mam to mod_mam
prosodyctl check config: Fix traceback when zero modules are enabled
mod_pubsub: Fail early if loaded outside of a component to prevent misconfiguration
doap: Add XEP-0486
mod_pubsub/commands: Fix listing item numbers along with item names
mod_account_activity: Handle authentication provider returning no user info
mod_mam: Automatically load mod_muc_mam if loaded on a MUC component
mod_muc: Inherit mod_mam if globally loaded
Download
As usual, download instructions for many platforms can be found on our download page
If you have any questions, comments or other issues with this release, let us know!
We’re sharing a sneak peek at the visual design of the upcoming release of
Snikket’s Android app - what we’ve changed, why, and how we got here. The new
app will be released on 25th January 2026. To learn more about using Snikket
for your communication, check our homepage.
The foundational principles of good user interface design never really change.
People should be able to easily find common actions, text should be clear and
legible, buttons should be large enough to press, to name a few. But around
these pillars, aesthetic conventions are always shifting and evolving.
Android 2009
Android 2014
Android 2026
Years ago, square corners used to be lauded as “crisp”. Today, rounded
edges are marvellously “smooth”. Where shadows used to add a three-dimensional
realism to our interfaces, flat designs are now the norm in most apps.
One of Snikket’s goals is to be approachable and familiar to people who are
used to other popular messaging ecosystems. It should be a welcoming gateway
to the world of decentralized messaging. This means, where reasonable, keeping
up with the conventions established by other widespread communication apps. We
can’t stand still.
Snikket’s Android app has been looking increasingly out of place in recent
years, compared to the rest of the apps on a typical Android phone. A
large reason for this is the shift towards Google’s Material design -
the latest design framework that Android uses, and provides to developers, to
help with the design, colours, typography and user interface controls in applications.
For the next release, the Snikket app has been updated to Material 3. This is
largely thanks to the work done by Daniel on the upstream Conversations app
which underlies the Snikket Android app. On top of the work in Conversations,
we have put a Snikket spin on the new interface, aligning it with our colours,
and making adjustments to various elements to ensure the design feels familiar,
friendly and accessible.
A sample of our updated colour palette
While our brand colour remains our iconic yellow, we have designed a new
colour palette for this release. This is derived from Material 3 guidelines,
with assistance from the ever-helpful folk at Superbloom,
plus a custom-built utility to ensure excellent colour contrast across all our
new colours and ensure sufficient legibility.
Speaking of colours, the app now also supports “Material You”, which is a
feature of modern Android that allows apps to adapt to a user-chosen colour
scheme or wallpaper image without sacrificing usability. If enabled in the
settings, Snikket will automatically follow your system’s dynamic colour
scheme.
Chat bubbles can now follow your system theme colours
…in both light and dark mode
Chat bubbles have been given additional space to more clearly separate
individual messages, and default font sizes have been slightly increased.
These changes were made after carefully reviewing the interfaces of other similar
messaging apps. The goal is to allow anyone to feel as “at home” when using
Snikket as they would any other app on their device.
The original Snikket Android
The new Snikket Android
Snikket continues to follow the system font preferences as in the past, but
during our research we found our default font size was slightly smaller than
other messaging apps we compared with. Our default size now matches what other
similar apps use, and an in-app setting allows you to further boost the font
size of messages in case you just need that little bit of extra clarity in
your chats.
Old font size, new size, and optional extra large size
We hope that each aspect of the new design helps people feel even more at home
when using Snikket. The new release will be available on the 25th January!
If you are upgrading from a previous version, there are no mandatory changes in SQL schemas, configuration, API commands or hooks. However new mod_invites uses a new table in databases, see below.
Below is a detailed breakdown of the improvements and enhancements:
Database Serialization
This feature adds new way for migrating data between database backends by exporting data from one backend to a file and importing that into different backend (or possibly to same backend but on different machine).
Migrating data using this can be executed by first exporting all data with export_db command, changing configuration of ejabberd and switching modules to use new database backend, and then importing previously exported data using import_db command.
This mechanism works by calling those new command from ejabberdctl, for exporting data:
ejabberdctl export_db <host name> <path to directory where exported files should be placed>
ejabberdctl export_db_abort <host name>
ejabberdctl export_db_status <host name>
and for importing:
ejabberdctl import_db <host name> <path to directory with exported data>
ejabberdctl import_db_abort <host name>
ejabberdclt import_db_status <host name>
Exporting and importing work in background after starting them from ejabberdctl (commands executed by ejabberdctl have time limit for how long they can work, with this setup there should be not issue with export or import getting aborted by that), and current progress of background operation can be tracked by calling corresponding *_db_status command. Operation in progress can be also aborted by executing *_db_abort command.
Roster Invites and Invite-based Account Registration
Until now the canonical method to register an account in ejabberd was to let anybody register accounts using In-Band Registration (IBR) (mod_register) or Web Registration (mod_register_web), and then try to limit abuse with access limitations or CAPTCHAs. Often this process got abused, with the result that account registration had to be disabled and rely on manual registration by administrators.
The new mod_invites implements support for invite-based account registration: administrators can generate invitation URLs, and send them to the desired users (by email or whatever). Then the user that receives an invitation can visit this invitation URL to register a new account.
On top of that, mod_invites lets you create Roster Invites: you can send a link to some other person so they can connect to you in a very user-friendly and intuitive way that doesn&apost require any further interaction. If account creation is allowed, these links will also allow to setup an account in case the recipient doesn&apost have one yet.
If you plan to use the landing page included with mod_invites, install JavaScript libraries jQuery version 3.7.1 and Bootstrap version 4.6.2. This example configuration will assume they are installed in /usr/share/javascript. The ejabberd container image already includes those libraries. Some quick examples, in case you need some help:
Debian and related:
apt install libjs-jquery libjs-bootstrap4
AlpineLinux and other operating systems where you can install npm, for example:
Configure ejabberd to serve the JavaScript libraries in path /share; serve mod_invites in any path of your selection; and enable mod_invites with some basic options. Remember to setup mod_register to allow registering accounts using mod_invites. For example:
The destination user (or yourself) can visit that invitation URL and follow the instructions to register the account and download a compatible client.
If the user has installed already a compatible XMPP client, you don&apost no need to install JavaScript libraries and setup a landing page. In that case, when generating an invitation you will get only the XMPP URI; when the user opens that URI in a web browser, it will automatically open the XMPP client and the corresponding registration window.
Probably you don&apost want to expose the port directly, then you need to setup Nginx or Apache to act as a "reverse" proxy and change your landing_page parameter accordingly, for example just https://@HOST@/invites/{{ invite.token }}
There is a new table invite_token in SQL schemas, used by the new mod_invites. If you want to use this module, there are two methods to update the SQL schema of your existing database:
If using MySQL or PosgreSQL, you can enable the option update_sql_schema and ejabberd will take care to update the SQL schema when needed: add in your ejabberd configuration file the line update_sql_schema: true
Notice that support for MSSQL in mod_invites has not yet been implemented or tested.
If you are using other database, or prefer to update manually the SQL schema:
MySQL singlehost schema:
CREATE TABLE invite_token (
token text NOT NULL,
username text NOT NULL,
invitee text NOT NULL DEFAULT (&apos&apos),
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
expires timestamp NOT NULL,
type character(1) NOT NULL,
account_name text NOT NULL,
PRIMARY KEY (token(191))
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE INDEX i_invite_token_username USING BTREE ON invite_token(username(191));
MySQL multihost schema:
CREATE TABLE invite_token (
token text NOT NULL,
username text NOT NULL,
server_host varchar(191) NOT NULL,
invitee text NOT NULL DEFAULT &apos&apos,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
expires timestamp NOT NULL,
type character(1) NOT NULL,
account_name text NOT NULL,
PRIMARY KEY (token(191)),
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE INDEX i_invite_token_username USING BTREE ON invite_token(username(191));
PostgreSQL singlehost schema:
CREATE TABLE invite_token (
token text NOT NULL,
username text NOT NULL,
invitee text NOT NULL DEFAULT &apos&apos,
created_at timestamp NOT NULL DEFAULT now(),
expires timestamp NOT NULL,
"type" character(1) NOT NULL,
account_name text NOT NULL,
PRIMARY KEY (token)
);
CREATE INDEX i_invite_token_username ON invite_token USING btree (username);
PostgreSQL multihost schema:
CREATE TABLE invite_token (
token text NOT NULL,
username text NOT NULL,
server_host text NOT NULL,
invitee text NOT NULL DEFAULT &apos&apos,
created_at timestamp NOT NULL DEFAULT now(),
expires timestamp NOT NULL,
"type" character(1) NOT NULL,
account_name text NOT NULL,
PRIMARY KEY (token)
);
CREATE INDEX i_invite_token_username_server_host ON invite_token USING btree (username, server_host);
SQLite singlehost schema:
CREATE TABLE invite_token (
token text NOT NULL,
username text NOT NULL,
invitee text NOT NULL DEFAULT &apos&apos,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
expires timestamp NOT NULL,
type character(1) NOT NULL,
account_name text NOT NULL,
PRIMARY KEY (token)
);
CREATE INDEX i_invite_token_username ON invite_token(username);
SQLite multihost schema:
CREATE TABLE invite_token (
token text NOT NULL,
username text NOT NULL,
server_host text NOT NULL,
invitee text NOT NULL DEFAULT &apos&apos,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
expires timestamp NOT NULL,
type character(1) NOT NULL,
account_name text NOT NULL,
PRIMARY KEY (token)
);
CREATE INDEX i_invite_token_username_server_host ON invite_token(username, server_host);
New replaced_connection_timeout toplevel option
The new replaced_connection_timeout toplevel option enables new session to wait for termination of session that it replaces.
This should mitigate problems where old session presences unavailable sometimes were delivered after new session sent it&aposs presence available.
Improved mod_http_fileserver docroot option
mod_http_fileserver is a module to serve files from the local disk over HTTP, useful if you just want to serve some HTML or binary files that don&apost need PHP, and don&apost need to setup or configure a separate full-blown web server.
Now the docroot option may be a map of paths to serve, allowing this module to serve several paths with different directories for different purposes.
For example, let&aposs serve some public content from /var/service/www, also shared JavaScript libraries, and for base URL let&aposs serve from /var/www:
Notice that ejabberd includes many modules that serve web services, that may be useful to save you from setting up a full-blown web server, see ejabberd_http.
Supported XEP versions
ejabberd supports close to 90 XMPP extension protocols (XEPs), either directly implemented in ejabberd source code, in the libraries that implement many of the internal features, or in other ejabberd modules available in other repositories like ejabberd-contrib.
Those XEPs are updated regularly to bring major improvements, minor changes, fixing typos, editorial or cosmetic changes... and this requires a regular review of those XEP updates in the software implementations to keep them up to date, or at least to document what exact version of the protocols are implemented.
In this sense, we have reviewed all the XEP versions that ejabberd and erlang xmpp library were not up-to-date, and have identified which ones are already up-to-date in their DOAP files. Now the pages at XMPP.org describe more accurately the supported protocol versions, see ejabberd at XMPP.org and erlang-xmpp at XMPP.org.
Erlang, Elixir and Container
ejabberd can be compiled with Erlang/OTP from 25.0 up to the latest 28.3.1. Regarding Elixir support, ejabberd supports from Elixir 1.14.0 up to the latest 1.19.5
Right now ejabberd compiles correctly with Erlang/OTP from git development branch and Elixir 1.20.0-RC1, so hopefully compatibility with the upcoming Erlang/OTP 29 and Elixir 1.20 will be easily achievable.
Binary installers and the ejabberd container now include Erlang/OTP 28.3.1 instead of 27.3, and Elixir 1.19.5 instead of 1.18.4.
Speaking of the container images, both ejabberd and ecs bring other minor changes: they expose more ports: 5478 UDP (STUN service), 7777 (SOCKS5 file transfer proxy) and 50000-50099 UDP (TURN service).
The container images in their ejabberd.yml file use new macros PORT_TURN_MIN, PORT_TURN_MAX, and STARTTLS_REQUIRED that you can setup easily without modifying ejabberd.yml, see macros in environment.
That Erlang Distribution has historically used the epmd program to assign listening ports and discover ports of other nodes to connect. The problems of using epmd are that:
epmd must be running all the time in order to resolve name queries
epmd listens in port 4369
the ejabberd node listens in a random port number
How to avoid epmd since Erlang/OTP 23.1 and ejabberd 22.10 ? Simply set the ERL_DIST_PORT environment variable in the ejabberdctl.cfg file:
ERL_DIST_PORT=5210
Since now, ejabberdctl passes arguments to Erlang to listen for erlang distribution connections in TCP port 5210, and establish erlang distribution connections to remote ports 5210. That way you know exactly, in advance, what port number to open in the firewall or container.
This ejabberd release introduces some small improvements that facilitate using the ERL_DIST_PORT environment variable:
ejabberdctl prints an informative message when it detects that there may be a port number collision, which may happen if you start several ejabberd nodes in the same machine listening in the same ERL_DIST_PORT and same INET_DIST_INTERFACE.
When ejabberd is starting, now it prints the address and port number where it listens for erlang distribution:
[info] ejabberd 26.01 is started in the node ejabberd@localhost in 1.90s
[info] Elixir 1.19.4 (compiled with Erlang/OTP 28)
[info] Erlang/OTP 29 [DEVELOPMENT] [erts-16.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]
[info] Start accepting TCP connections at 0.0.0.0:5210 for erlang distribution
[info] Start accepting TCP connections at [::]:5222 for ejabberd_c2s
[info] Start accepting TCP connections at [::]:5269 for ejabberd_s2s_in
...
A new make relivectl is introduced, which uses ejabberdctl script to start ejabberd (not like make relive), and starts ejabberd immediately without building a release (not like make dev).
make relive was introduced in ejabberd 22.05. It allows to start ejabberd in path _build/relive/ without installing it, by using rebar3 shell and mix run. It automatically compiles code at start and recompiles changed code at runtime. But it doesn&apost use the ejabberdctl script, and doesn&apost read ejabberdctl.cfg, this means that depending on what you are testing, it may not be useful and you had to switch to make dev.
A new make target is now introduced: make relivectl. This is similar, as it starts ejabberd without requiring installation, using path _build/relivectl/ to store the configuration, database and log files. The benefit over relive is that relivectl uses ejabberdctl and reads ejabberdctl.cfg. The drawback is that it doesn&apost recompile code automatically. The benefit over make dev is that relivectl doesn&apost build an OTP release, so it&aposs faster to start.
Let&aposs summarize all the make targets related to installation to determine their usage differences:
As seen in the table, make install / uninstall seem unnecessary nowadays, because install-rel / uninstall-rel allow to install and uninstall correctly all the files. Maybe in the future the implementation of make install / uninstall could get replaced with make install-rel / uninstall-rel...
In the same sense, make dev now apparently falls short between make prod (which is absolutely indispensable to build a full OTP release) and make relive/relivectl (useful, featureful, and fast for development and testing purposes).
WebAdmin Menu Links
Do you remember that ejabberd 25.07 introduced a link in WebAdmin to the local Converse.js page in the left menu when the corresponding mod_conversejs is enabled?
Technically speaking, until now the WebAdmin menu included a link to the first request_handler with mod_conversejs that the admin configured in ejabberd.yml. That link included the authentication credentials hashed as URI arguments if using HTTPS. Then process/2 extracted those arguments and passed them as autologin options to Converse.
From now, mod_conversejs automatically adds a request_handler nested in WebAdmin subpath. The WebAdmin menu links to that converse URI; this allows to access the HTTP auth credentials, no need to explicitly pass them. process/2 extracts this HTTP auth and passes autologin options to Converse. Now scram password storage is supported too.
In practice, what does all that mean? Just enable the mod_conversejs module, and WebAdmin will have a private Converse URL for the admin, linked in the WebAdmin menu, with autologin. No need to setup a public request_handler!
For example, let&aposs configure conversejs only for admin usage:
With that configuration, what is the corresponding URL?
Login to the WebAdmin and look at the left menu: now it displays links to all the configured HTTP services: ejabberd_captcha, ejabberd_oauth, mod_conversejs, mod_http_fileserver, mod_register_web. Also mod_muc_log_http and mod_webpresence from ejabberd-contrib show links in the WebAdmin left menu. Additionally, the menu shows a lock if the page is encrypted HTTPS, and an ! if it is not.
Acknowledgments
We would like to thank the contributions to the source code, documentation, and translation provided for this release by:
Stefan Strigler for new feature Great Invitations aka mod_invites
And also to all the people contributing in the ejabberd chatroom, issue tracker...
Improvements in ejabberd Business Edition
Customers of the ejabberd Business Edition, in addition to all those improvements and bugfixes, also get the following changes:
New module mod_push_gate that can act as target service for mod_push, and which can deliver pushes using configured mod_gcm or mod_applepush instances.
New module mod_push_templates that can be used to have different push notifications for message class matching configured data patterns.
New database conversion routines targeting p1db backends
ChangeLog
This is a more complete list of changes in this ejabberd release:
Compile and Start
Remove dependencies, macros and code for Erlang/OTP older than 25
Require Elixir 1.14 or higher, that&aposs the lowest we can test automatically
ejabberdctl: Support NetBSD and OpenBSD su (#4320)
ejabberdctl.template: Show meaningful error when ERL_DIST_PORT is in use
ejabberd_app: Print address and port where listens for erlang node connections
Makefile.in: Add make relivectl similar to relive but using ejabberdctl
Databases
Add db_serialize support in mnesia modules
Add db serialization to mod_muc_sql
New database export/import infrastructure
Add commands for new database export/import
Apply timestamp pass in ?SQL_INSERT queries
Update p1_mysql to bring fix for timestamp decoding
Extend timestamp type handling in sql macros
Revert changes to conversion of pgsql int types
Installer and Container
make-binaries: Bump Erlang/OTP 28.3.1 and Elixir 1.19.5
Dockerfile: Bump Erlang/OTP 28.3.1 and Elixir 1.19.5
Dockerfile: Expose also port 7777 for SOCKS5
Dockerfile: Configure TURN ports and expose 5478 50000-50099
Dockerfile: Try to fix error with recent freetds Alpine package
Container: Setup new macro STARTTLS_REQUIRED to allow easy disabling
MUC
Add muc_online_rooms_count API command
Set enable_hats room option true by default
Allow vcard queries even when IQ queries are disabled (#4489)
Announce stable-id feature from XEP-0045 1.31, supported since long ago