April 10, 2022

Updates from the Poezio ecosystem

Releases have happened recently that revolve around Poezio, a TUI (Terminal UI) client for XMPP, including Poezio itself, its backend XMPP library Slixmpp, and also the poezio and slixmpp plugins for OMEMO.

Many bug fixes and improvements

Poezio example screenshot 2 Poezio example screenshot 1
Examples of screenshots. Thanks jonas’ for the blue theme!

Mathieui has already made a proper release note for Slixmpp and I invite you to read it! It includes many bugfixes of course, and internal changes around async handling, that may reflect on some of the APIs you are using.

Poezio has also seen many improvements.

Internally, for one, our default branch has also been moved to “main”, many type hints have been added, implicit casts (safeJID) have been removed, lots of event handlers and calls are now async, APIs from Slixmpp are being used instead of redoing our own, many refactoring, various performance improvements.

Pypy3 support was removed because it was causing many users to use the cffi module specifically implemented for pypy3 instead of the more performant C implementation. For those who are running from sources and not using the update script, don’t forget to run make to build the C module.

A license change has happened, and Poezio is now under GPLv3+! While I am not exactly in favour of intellectual property1, this is a straightforward lever we have against capitalism2. Poezio being a prime resource for Slixmpp examples, GPL code should reasonably ensure that the 4 freedoms reach end-users. In practice, this should allow for poezio-omemo to be merged into Poezio. I am now personally hoping for Slixmpp to change its license as well.

And other changes more visible to users! To name a few, quality of life improvements such as xmpp:...?join URIs handling in /join, impromptu rooms creation is now more reliable and creates rooms with shorter names, and tab names in the activity bar can be colored using Consistent Color Generation by setting autocolor_tab_names to True. Read more in the changelog.

Poezio colored tab numbers
The tab name color on top can also be reversed (foreground/background) in the theme to look the same as the activity bar below.

Plugins have seen changes as well. A new untrackme plugin replaces the now deprecated remove_get_trackers. Link Mauve has also developed a sticker plugin (to send them), similar in essence to what Movim has been doing for ages. Rich presence (activity, gaming, mood and user tune) has been removed from Poezio core and moved in the user_extras plugin. And again many fixes.

Poezio sticker plugin in action!

Many of these fixes have been realized by mathieui, who is by far the biggest committer on the release, and in general probably the person with the best understanding of the project. Thanks also to louiz for providing the infrastructure all this time, and to eijebong, Ge0rG, Kaghav Gururajan, kaliko, Thomas Hrnciar, jonas’, and southerntofu for the many patches.


Archive handling (MAM) was already in the previous release, but has been reworked and should now be more reliable.

When opening a tab, Poezio will fetch 2 screen pages worth of messages if it has no logs for this tab. Archives are automatically stored locally if configured (default), in which case they won’t be re-downloaded but read from the local copy directly the next time they’re requested.

To read older chat messages in a tab, just scroll up with PageUp and Poezio will fetch more automatically if it needs to.

This is configurable with options that have been introduced such as mam_sync or mam_sync_limit to enable/disable the use of MAM and how many messages to fetch at most. And use_log also configures the fact that archives are stored locally.

Some work around storing message IDs – that our log format doesn’t do – will be needed in the future to allow for easier message deduplication.

End-to-End Encryption

The Poezio E2EEPlugin API has been improved to accommodate changes in poezio-omemo, slixmpp-omemo and changes of the OMEMO backend library. Two plugins which are also seeing changes!

Heartbeats are now supported. Heartbeats are meta-messages which transfer only cryptographic key material (nothing else) and are used to strengthen OMEMO’s forward secrecy. This is particularly relevant on clients like Poezio that can stay running in the back for some time, receiving messages without replying.

Some other changes include colored fingerprints using the Consistent Color Generation document – such as specified in the current (0.8) OMEMO spec – and sending encrypted media (aesgcm URIs).

What hasn’t changed is that this plugin lacks a UI and trust management. Hopefully this should come soon, with a little motivation to do UI work.

What comes next

All in all, there aren’t (m)any revolutionary changes, but with these releases come many fixes for paper cuts that hopefully make users happier. This makes me think that even though Poezio is far from being perfect, there doesn’t seem to be many important things missing.

There are however changes that would require a lot of refactoring, such as a multi-account feature, or easier maintenance in general.

We have decided to start migrating Poezio to Rust, in part to be able to refactor the project more easily, and also because it’s a language we’ve come to appreciate over the years with experience in other projects, and more specifically with xmpp-rs, an XMPP library in Rust.

All of this will happen right after the release, and we invite interested people to join the effort!

P.S.: I am looking for poezio screenshots with various setups to display in public places, under a free license. Please send me your screenshots in relatively high quality at blog at bouah.net. And don’t forget to ask pixels appearing on the image for permission!

  1. TODO: write about this. A TL;DR would certainly be “abolish intellectual property, and private property in general”. ↩︎

  2. When they don’t decide to ignore it and give us the finger. ↩︎

© Maxime “pep.” Buquet 2022. Licensed under CC-BY-SA 4.0 unless specified.

Powered by Hugo & Kiss.