C Makefile C++
Clone or download
gkdr Bump version to 0.6.7
And update README.
Latest commit 3156e14 Apr 21, 2018


lurch 0.6.7

/lʊʁç/. In German, an Axolotl is a type of Lurch, which simply means 'amphibian'. This plugin brings Axolotl, by now renamed to double ratchet, to libpurple applications such as Pidgin by implementing the XEP-0384: OMEMO Encryption. For a higher-level overview, see the official OMEMO homepage.

(Plus I thought the word sounds funny.)


I rewrote how MUCs are handled and they should work much better now. If not, feel free to open an issue, as usual.

The first Windows build of 0.6.6 was missing a compile-time flag, so if it does not work for you download it again, or get this version once available.

Version 0.2 of the OMEMO XEP adopted the namespace actually implemented by all the clients, so there is no need for a 'compatible' version of the plugin any longer. This mostly concerns Windows users who used the lurch_compat.dll, so don't be confused if it's not there.

If you use a version <0.6.5, you should still definitely update for security reasons.

Table of Contents

  1. Installation
    1. Linux
    2. Windows
    3. MacOS
    4. Additional plugins
  2. Usage
    1. General
    2. Group Chats
  3. Bug Reports
  4. FAQ
  5. Caveats



1. Install the (submodules') dependencies

Below you can find the command to install the dependencies for popular distribution families. Make sure that you use at least version 2.7 of mxml, and 2.10.10 of libpurple.

Debian, Ubuntu

sudo apt install git cmake libpurple-dev libmxml-dev libxml2-dev libsqlite3-dev libgcrypt20-dev

ArchLinux, Parabola

sudo pacman -S base-devel git cmake pidgin libpurple mxml libxml2 sqlite libgcrypt


sudo dnf install git cmake libpurple-devel mxml-devel libxml2-devel libsqlite3x-devel libgcrypt-devel
2A. EITHER: Build and install from source
git clone https://github.com/gkdr/lurch/
cd lurch
git submodule update --init --recursive
make install-home

If you just pull a newer version (git pull), remember to also update the submodules as they might have changed!

The last command compiles the whole thing and copies the plugin into your local libpurple plugin directory.

The next time you start Pidgin, or another libpurple client, you should be able to activate it in the "Plugins" window.

2B. OR: Install from a community repo


Thanks to EionRobb, Windows users can use the dlls he compiled and provides here: https://eion.robbmob.com/lurch/

  1. Download the plugin (lurch.dll) and put it in the Program Files (x86)\Pidgin\plugins directory.
  2. Download libgcrypt-20.dll and libgpg-error-0.dll and put them in the Program Files (x86)\Pidgin directory.

These instructions can also be found at the provided link.


Homebrew should have all dependencies:

brew install cmake pidgin glib libxml2 libmxml sqlite libgcrypt

This should work on newer versions of MacOS, but if you run into problems check out #8 for some hints. Complete instructions on how to get this running with Pidgin appreciated!

Alternatively, if you use Adium, you should definitely check out shtrom's Lurch4Adium!

Additional plugins

The current version of libpurple's XMPP protocol plugin does not support many XEPs by itself. For more features and compatibility with other clients such as Conversations you can install the pulgins below.


If you have multiple devices and want messages sent and received by one device show up on all others, XEP-0280: Message Carbons is what you are looking for.

You can find my plugin for it here: https://github.com/gkdr/carbons


In order to support the checkmarks for delivered messages, you could install this plugin implementing XEP-0184: Message Delivery Receipts:




The first thing you can do to check if this plugin works is enter the /lurch help command in any conversation window. You will receive a list of the other commands you can use. I know this is a bit clunky, but using the command interface for interactions makes the plugin usable in clients that do not have a GUI.

After you have made sure it was installed correctly, you do not have to activate it specifically for each conversation partner you want to use it with, unlike with e.g. OTR. If it detects that the other side is using OMEMO (by the existence of an OMEMO devicelist), the conversation will be encrypted automatically. If you do not want this, you can blacklist the user by typing /lurch blacklist add in the conversation window.

This plugin will set the window title to notify the user if encryption is enabled or not. If it is, it will generally not send plaintext messages. If a plaintext message is received in a chat that is supposed to be encrypted, the user will be warned.

Group Chats

Group chats (via XEP-0045: Multi-User Chat aka MUCs) are not part of the OMEMO specification, but can work under specific circumstances as outlined on the Conversations README. These are:

  • The MUC has to be non-anonymous so the real JID of each participant is visible. The channel owner has to set this property. In Pidgin you can get there by typing /config.
  • Every participant has to be in every other participant's contact list! This is why this really only makes sense for member-only MUCs.

Once you have confirmed these conditions are met, every member has to activate OMEMO him- or herself. Using this plugin it works by typing /lurch enable. Warning messages are displayed if it does not work for every user in the conference, hopefully helping to fix the issue.

It is recommended you confirm the fingerprints look the same on each device, including among your own.To do this, you can e.g. display all fingerprints participating in a conversation using /lurch show fp conv.

Bug Reports

If something does not work as expected, don't hesitate to open an issue. You can also reach me on the Pidgin IRC channel (#pidgin on freenode) as riba, or send me an email.

It will usually be helpful (i.e. I will probably ask for it anyway) if you provide me with some information from the debug log, which you can find at Help->Debug Window in Pidgin.

In case it is more serious and Pidgin crashes, I will have to ask you for a backtrace. You can obtain it in the following way:

  • Open Pidgin in gdb: gdb pidgin
  • Run it: run
  • Do whatever you were doing to make it crash
  • When it does crash, type bt (or backtrace)
  • Copy the whole thing


Can it talk to other OMEMO clients?

Yes, it was (briefly) tested with:

See https://omemo.top/ for additional clients.

Does it work with Finch?

It should, but I only tried it briefly.


OMEMO is not 'whatever Conversations can do', but a very specific XEP.

For instance, if you don't install the additional plugin mentioned above, this is probably not the right thing to use if you have multiple clients running at the same time, as there is no message carbons support in libpurple as of now.

At the moment, there is no XEP-0313: Message Archive Management aka MAM support in libpurple, so there are no 'offline messages'.

Finally, I can't stress this enough: This plugin is highly experimental, so you should not trust your life on it.