======================
 XMPP implementations
======================

I was interested in getting a nice IM for a while now, perhaps since
the time I was actually actively chatting online. With "nice"
including an open and sensible protocol (both facilitating software
implementations and not disappearing suddenly), preferably a choice of
existing software (for personal use, as well as something that is
viable to recommend to less tech-savvy users, including those on
mobile devices), no control by a single entity.

Distributed systems seemed to me like the way to go, and I followed
(and poked, and wrote prototypes of) those for about a decade, but now
it looks like quite a mess out of which nothing usable comes so far.
Federated systems, on the other hand, work fine since the early days
of the Internet, and have many of the same advantages (and usually can
be used in a distributed fashion as well). So 2-3 years ago I focused
on those instead. That is, I was actively using them before, but
hoping for future use of distributed ones, so the change was just in
the plans for a future setup.

Fortunately the choice was quite simple, since the only major and
mature federated IM protocol was XMPP. Then Matrix appeared and gained
some popularity, but the awkwardness of the protocol itself, coupled
with fragmentation it introduces, makes it easy for me to ignore.

In addition to the past focus on distributed systems, I used to
dislike XMPP because of its XML usage, but then noticed (or perhaps
acknowledged) that XML makes sense for both extensibility (via
namespaces) and stream processing, and generally started appreciating
XML more: maybe after observing JSON infrastructure awkwardly
repeating its path (though can't say I liked JSON that much before:
DSVs and s-expressions seemed neater, for instance, though more
ambiguous and less specified), or just after working with XML (and
particularly with its sane applications) more.

The first thing a user would notice even on basic XMPP usage is client
UIs, of course, followed by different sets of their features, and then
features (even most basic and obvious ones, such as message delivery)
not working properly or at all, in general or with particular servers
and/or clients on the other end. Investigating that usually shows that
the standards and extensions for those exist and are fine, but
implementations are quite incomplete (even though there are compliance
suites and generally recommended extensions, but some implementations
don't include even the required bits of the core RFC). A rather
strange thing here is that despite common inability to implement a
usable subset of XMPP, most of the clients still use custom
implementations; it certainly looks like a problem that could be
solved by a library. Yet the libraries are very incomplete, and/or
impose awkward restrictions (most often on the programming language
that can be used, sometimes on the main loop).

In the past couple of years I wondered why it's so, and had the
opinion that it's better to spend the time trying to improve existing
implementations, rather than to introduce yet another half-baked and
non-reusable one. But improvement is tricky: for instance, if the
language a library is written in isn't suitable for importing a C API,
or that library just doesn't aim doing that, it's virtually impossible
to provide such an API. If a library aims some particular client or
the same API for multiple protocols, which imposes restrictions
preventing proper XMPP implementation, there's no way to implement
those bits properly without forking. If a library just uses awkward
architecture and decisions, likely sorting it out wouldn't be easier
than to write one from scratch.

So, a couple of months ago I finally gave up and started writing yet
another XMPP library: in C and asynchronous, aiming for it to be
fairly complete. I think by now it's pretty good at establishing and
maintaining a connection, loading and updating a roster, and
delivering messages, though it's still in a very early stage of
development.

The project turned out to be quite interesting: there were challenging
design decisions to make, and the overall library is somewhat unusual
(although not unique) in implementing a rather interactive protocol
while being asynchronous. Perhaps more technical details should go
into its manual and annotations (which are far from complete at the
moment), though maybe later I'll spill some notes and musings here as
well.

As at many earlier stages, currently I'm not sure what to do next, but
the primary options are file transfer and a reference client (beyond a
very basic example; maybe as a plugin for some IM). Actually I don't
view file transfer as an essential IM feature, so perhaps it'd make
more sense to focus on polishing it and making usable clients with it
already; although it still lacks many features, it already has the
ones for connectivity and reliable message delivery that many others
lack.


----

:Date: 2020-04-09
