Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
Erlang C JavaScript Shell API Blueprint Makefile Other
Latest commit 3cec442 Oct 25, 2016 @goddammit goddammit committed on GitHub Fixing some typos and stuff
Failed to load latest commit information.
.github [skip ci] move templates to .github dir and fill the content Feb 29, 2016
apps Merge pull request #869 from esl/hunt-bosh-interleave-requests-issue Oct 19, 2016
doc Fixing some typos and stuff Oct 25, 2016
examples Cleanup `examples` Aug 20, 2014
priv Finalize rename to MongooseIM Feb 19, 2014
rel remove unnecessary code in mod_websockets Oct 5, 2016
src universal version generator Oct 19, 2015
test/ejabberd_tests Merge pull request #869 from esl/hunt-bosh-interleave-requests-issue Oct 19, 2016
tools Fix for issue #1036 - Make travis-test.sh usable from the command line Oct 18, 2016
.gitignore Ignore temporary files Aug 18, 2016
.gitmodules Use rebar dependencies instead of submodules for tests Sep 5, 2012
.travis.yml use travis-test's -p option to specify preset Oct 3, 2016
.travis_deploy_rsa.enc Upload CT-reports to esl github account Jan 26, 2016
CHANGELOG.md update CHANGELOG re 2.0.0beta2 [skip ci] Aug 29, 2016
CONTRIBUTING.md [skip ci] roadmap influence Jul 22, 2016
COPYING * src/msgs/nl.msg: Updated (thanks to Sander Devrieze) Oct 9, 2004
Makefile Elvis utils (#1011) [skip ci] Oct 3, 2016
README.md [skip ci] typo Sep 6, 2016
VERSION bump version to 2.0.0beta2 Aug 29, 2016
dialyzer.ignore-warnings added dialyzer targets to makefile Apr 14, 2012
dialyzer.mk Disable suppressing undefined_callbacks warning Oct 11, 2016
elvis.config tune down Elvis' sensitivity to code duplication (reason: it complain… Sep 26, 2016
index.html Swagger HTTP API doc (#880) Aug 25, 2016
mkdocs.yml [skip ci] Improve "summary table" formating Oct 19, 2016
readlink.sh fix compatibility issues with OS X Nov 12, 2014
rebar update rebar to 2.6.4-4-g576e121 Sep 26, 2016
rebar.config Use seestar with improved typespecs Oct 12, 2016
rebar.config.script remove workaround for cowboy and R15B03 Dec 8, 2015


MongooseIM Build Status Documentation Status Coverage Status Buildtime trend GitHub release

MongooseIM is Erlang Solutions' robust and efficient XMPP server aimed at large installations. Specifically designed for enterprise purposes, it is fault-tolerant, can utilize resources of multiple clustered machines and easily scale in need of more capacity (by just adding a box/VM).

MongooseIM can accept client sessions over vanilla XMPP, Websockets, and HTTP long-polling (a.k.a. BOSH).

Its home on GitHub is at http://github.com/esl/MongooseIM.

The product page is available at https://www.erlang-solutions.com/products/mongooseim.html

Download packages

For a quick start just download the pre-built package that suits your platform: Ubuntu, Debian, CentOS, and Mac OS X.

An experimental Docker image exists on: https://registry.hub.docker.com/u/mongooseim/mongooseim-docker/ You can contribute on: https://github.com/ppikula/mongooseim-docker

Main differences from the parent project

This project began its life as a fork of ejabberd v.2.1.8 back in 2011, and later underwent some major cleanup, refactorization and optimization.

Major steps performed at that time:

  • bringing the project source tree to compliance with OTP project structure recommendations,
  • swapping autotools for the Erlang community-standard build tool rebar,
  • removal of obsolete and/or rarely used modules to reduce maintenance burden,
  • reduction of runtime memory consumption by refactoring the code to use Erlang's binary data type for string manipulation and storage instead of operating on linked lists of characters,
  • functional test coverage of the system according to corresponding RFCs and XEPs.

Key differences today:

  • massive scalability
  • code quality, through extensive refactoring, substantial optimisations, and continuous integration
  • unique version, fully open source, fully open standards, innovations contributed to the XSF
  • professional support, and flexible customer service


Up-to-date documentation for the MongooseIM master branch can be found on ReadTheDocs:

When developing new features/modules, please take care to add basic documentation to the doc/ directory, and add a link to your document in doc/README.md.

Original documentation for Ejabberd-2.1.8, from which MongooseIM was forked, is preserved in doc/ejabberd-2.1.8-OLD.

Features and supported standards

  • XMPP Core: RFC 3920, RFC 6120
  • Client connections over TCP (with TLS/STARTTLS available), Websockets, and HTTP(S) (BOSH).
  • Configurable database backends: MySQL, Postgres, generic ODBC. Mnesia and Redis for transient data.
  • Supports XEPs:
XEP-0012: Last Activity XEP-0016: Privacy Lists XEP-0018: Invisible Presence XEP-0022: Message Events
XEP-0023: Message Expiration XEP-0030: Service Discovery XEP-0045: Multi-User Chat XEP-0049: Private XML Storage
XEP-0050: Ad-Hoc Commands XEP-0054: vcard-temp XEP-0055: Jabber Search XEP-0059: Result Set Management
XEP-0060: Publish-Subscribe XEP-0068: Field Standardization for Data Forms XEP-0077: In-Band Registration XEP-0078: Non-SASL Authentication
XEP-0079: Advanced Message Processing XEP-0082: XMPP Date and Time Profiles XEP-0083: Nested Roster Groups XEP-0085: Chat State Notifications
XEP-0086: Error Condition Mappings XEP-0092: Software Version XEP-0093: Roster Item Exchange XEP-0114: Jabber Component Protocol
XEP-0115: Entity Capabilities XEP-0124: Bidirectional-streams Over Synchronous HTTP (BOSH) XEP-0126: Invisibility XEP-0138: Stream Compression
XEP-0157: Contact Addresses for XMPP Services XEP-0160: Best Practices for Handling Offline Messages XEP-0163: Personal Eventing Protocol XEP-0175: Best Practices for Use of SASL ANONYMOUS
XEP-0185: Dialback Key Generation and Validation XEP-0191: Blocking Command XEP-0198: Stream Management XEP-0199: XMPP Ping
XEP-0202: Entity Time XEP-0206: XMPP Over BOSH XEP-0212: XMPP Basic Server 2008 XEP-0237: Roster Versioning
XEP-0248: PubSub Collection Nodes XEP-0279: Server IP Check XEP-0280: Message Carbons XEP-0313: Message Archive Management
XEP-0313: Message Archive Management XEP-0313: Message Archive Management XEP-0313: Message Archive Management XEP-0352: Client State Indication

How to build

  1. Requirements.

    To compile MongooseIM you need:

    • GNU Make,
    • GCC,
    • Libexpat 1.95 or higher,
    • Erlang/OTP 17.5 or higher,
    • Reltool 0.6.6 or higher,
    • OpenSSL 0.9.8 or higher, for STARTTLS, SASL and SSL encryption,
    • Zlib 1.2.3 or higher for Stream Compression support (XEP-0138). Optional.
  2. Compiling on UNIX-like systems.

    To compile MongooseIM, go to the main repo directory $REPO and execute the command ($ stands for the shell prompt):

    $ make


    $ ./rebar get-deps
    $ ./rebar compile

    To generate full MongooseIM release (with mysql, pgsql or other deps):

    $ make rel

    If more advanced release is required (with some specific db support only, f.e. mysql or pgsql) or you want to set prefix or user for the installation script please refer to the release configuration page in our documentation

    make rel commands will generate a self-contained OTP system image in the project's rel/mongooseim subdirectory. The contents of that directory are as follows:

    • rel/mongooseim/bin - startup/administration scripts,
    • rel/mongooseim/etc - configuration files,
    • rel/mongooseim/lib - MongooseIM binary, header and runtime files,
    • rel/mongooseim/var - spool directory,
    • rel/mongooseim/log - log file directory,
    • rel/mongooseim/releases - release files directory.
  3. Running MongooseIM.

    To run MongooseIM from the project tree after compiling it, change to $REPO/rel/mongooseim.

    There you can use the mongooseim command line administration script to start and stop MongooseIM. For example:

    $ bin/mongooseim start

    will start the server.

    You can also run the server in interactive mode:

    $ bin/mongooseim live

    There's also a tool called mongooseimctl allowing you to perform some operations on a running instance, e.g.:

    $ bin/mongooseimctl status
    MongooseIM node mongooseim@localhost:
      operating system pid: 86026
      Erlang VM status: started (of: starting | started | stopping)
      boot script status: started
      version: 1.6.2-61-g48b8332
      uptime: 1:12:46
  4. Building the testing target and running tests.

    For testing purposes there's a different make target available:

    $ make devrel

    which will generate releases in $REPO/dev/ and prepare them for testing and generating coverage reports.

    To run the tests (from project's root directory, i.e. $REPO):

    $ dev/mongooseim_node1/bin/mongooseim start
    $ dev/mongooseim_node2/bin/mongooseim start
    $ make quicktest

    The test results will show up in the console`.

Test suite

In order to test and validate your XMPP servers, here are useful tools:

  • escalus: Erlang XMPP client
  • amoc: a load testing tools

Public testing

Continuous integration: https://travis-ci.org/esl/MongooseIM

Code coverage: https://coveralls.io/github/esl/MongooseIM

Want to get in touch with us?

In case of any suggestions, questions or any thoughts on this project, please feel free to contact us by the standard GitHub ways or at mongoose-im@erlang-solutions.com.

Want to discuss MongooseIM, problems with your deployement or anything else? Try: https://erlangcentral.org/forum/mongooseim/.

Announcements mailing-list

We have set up a new public mailing-list for all announcements of major events happening on the MongooseIM front. Expect one or two emails per month, the archives are free and open. We highly encourage you to subscribe here: https://groups.google.com/d/forum/mongooseim-announce Click on the blue button "Join group", then click in "Email delivery preference" on "Notify me for every new message".

Client libraries

We recommend following client libraries:

Social media

Follow us on Twitter and Facebook, please ask questions, and propose features!

Twitter: https://twitter.com/MongooseIM

Facebook: https://www.facebook.com/MongooseIM/