2026-10-10 XMPP and OMEMO ========================= There's this joke about the various encrypted messengers that basically goes like this: you open the messenger app and all you can see is that all your chats are encrypted and your device cannot decrypt them anymore. Encryption is hard, and the usability around it is hard, too. I have Prosody running as the XMPP server and on the little laptop I wanted to use Profanity as the text user interface (TUI) client. It looks a lot like irssi for IRC. Weird, but OK. And it seems to work just fine, except encryption does not. If I understand this correctly, all that is required from me is to run /omemo gen and within a few seconds I should be ready to go, showing fingerprints, trusting them, and so on. But that's not what's happening. Instead, a few seconds after generating whatever the command generates, I get a message, about three or four times per second (!), saying: "Could not find own OMEMO device ID. Going to publish own device ID: 1579300267". Why is it doing that? How can I stop it? Is this a bug in Profanity, in Prosody, in my configs, or what? I have no idea. #XMPP 2026-10-10. I got an interesting pointer on the Profanity channel: commit bbd9442db from June this year. > fix: query bare JID for PEP features during discovery > > XEP-0163 (Personal Eventing Protocol) states that service discovery > information queries regarding PEP capabilities must be sent to the > users bare JID in order to determine support. > > Profanity only queried the server domain JID and its generic > disco#items on connect, but never queried the users own bare JID. > > Because ejabberd advertises PEP and PubSub features on both the > server JID and the bare JID this bug was kind of invisible. However, > Prosody strictly advertises PEP capabilities only on the users bare > JID. > > This discovery failure became a hard blocker for OMEMO on Prosody > servers following commit 01c781fcf ("Don't publish keys if the > server doesn't support pubsub."), which turned the check for > publish-options into an early-return condition. > > We now query our own bare JID during feature discovery on connect > and insert it into conn.features_by_jid. I now have a build with that patch and it seems to work! Install tools: sudo apt install dpkg-dev devscripts Add a deb-src section to /etc/apt/sources.list.d/debian.sources: Types: deb-src URIs: http://deb.debian.org/debian/ Suites: unstable Components: main contrib non-free Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg Update packages and install the build dependencies: sudo apt update sudo apt build-dep profanity Find an empty directory and get the Debian sources and get the current sources: mkdir profanity-build cd profanity-build sudo apt source profanity git clone git@github.com:profanity-im/profanity.git Now get the patch from the current sources and apply it to the Debian sources: cd profanity git format-patch bbd9442db^..bbd9442db cd ../profanity-0.18.2 patch -p1 < ../profanity/0001-fix-query-bare-JID-for-PEP-features-during-discovery.patch Build and install it: debuild -i -us -uc -b cd .. sudo dpkg -i profanity_0.18.2-1_arm64.deb Testing it: In Profanity, run /omemo gen and you should be able to use it as documented. Reported as 1150542 for the Debian bug tracker. 2026-10-11. How to get rid of the build environment once you've done it? I checked the log at /var/log/apt/history.log and decided to mark all of them as "auto" installs and then auto-remove them. Should any other package need them, they won't get deleted. I think that's best. sudo apt-mark auto libidn2-dev libglycin-2-dev libblkid-dev libglib2.0-dev-bin \ libegl-dev libatk-bridge2.0-dev libgles-dev libgdk-pixbuf2.0-bin libslang2-dev \ libcaca-dev libqrencode-dev libxcomposite-dev libmount-dev libxrender-dev \ libglib2.0-dev libkrb5-dev libbz2-dev libice-dev libxss-dev libxres-dev \ autoconf-archive libgnutls28-dev libkadm5srv-mit12 libgmpxx4ldbl libxrandr-dev \ libcurl4-gnutls-dev girepository-tools libreadline-dev libstrophe-dev libpng-dev \ libxfixes-dev libgssrpc4t64 libfribidi-dev libxtst-dev libatspi2.0-dev libldap-dev \ libngtcp2-crypto-gnutls-dev libsm-dev libcloudproviders-dev libepoxy-dev \ libcmocka-dev libotr5-dev libxinerama-dev libfontconfig-dev libgio-2.0-dev-bin \ libglvnd-dev libassuan-dev libxi-dev libgles1 libegl1-mesa-dev liblcms2-dev \ libpcre2-posix3 libxcb-shm0-dev libnotify-dev gir1.2-cloudproviders-0.3.0 \ comerr-dev libffi-dev gir1.2-freedesktop-dev libprotobuf-c-dev gir1.2-glib-2.0-dev \ native-architecture libdatrie-dev libharfbuzz-cairo0 libatk1.0-dev \ libgdk-pixbuf-2.0-dev libgio-2.0-dev libsqlite3-dev libncurses-dev libxft-dev \ pango1.0-tools libp11-kit-dev libxcursor-dev libsepol-dev uuid-dev \ libxcb-render0-dev libkdb5-10t64 libxdamage-dev libzstd-dev libpsl-dev \ gir1.2-gly-2 libselinux-dev libgcrypt20-dev libgraphite2-dev libicu-dev \ libtasn1-6-dev libglvnd-core-dev libnghttp2-dev libsysprof-capture-4-dev \ krb5-multidev libxext-dev libnghttp3-dev libseccomp-dev libxkbcommon-dev \ libfreetype-dev libdbus-1-dev libomemo-c-dev libwayland-bin libgtk-3-dev \ libwayland-dev libcairo2-dev libgmp-dev libunistring-dev nettle-dev meson \ libgpgme-dev libgpg-error-dev libpcre2-dev libpixman-1-dev ninja-build \ libharfbuzz-dev libpango1.0-dev libkadm5clnt-mit12 libsystemd-dev librtmp-dev \ libthai-dev libngtcp2-dev libcmocka0 icu-devtools sudo apt autoremove When I tried to reinstall the dpkg, I ran into missing dependencies, so I had to do the following: sudo apt-mark auto libomemo-c0 libotr5t64 libstrophe0 sudo apt install libomemo-c0 libotr5t64 libstrophe0 dpkg -i profanity_0.18.2-1_arm64.deb I hope this works for you as well.