Converse exposes a plugin architecture through which developers can modify
Converse.js has a plugin architecture based on `pluggable.js <https://github.com/jcbrand/pluggable.js/>`_
and extend its functionality.
and is itself composed out of plugins.
Using plugins is good engineering practice, and using them is the *only* recommended
There are only a few files that are included in the default build of Converse
way of changing Converse or adding new features to it.
which aren't plugins.
In particular, plugins have the following advantages:
An important one is `converse-core.js <https://github.com/conversejs/converse.js/blob/master/src/headless/converse-core.js>`_,
which is responsible for bootstrapping the plugin architecture,
setting up and maintaining the connection to the XMPP
server and declaring the public (`window.converse </docs/html/api/converse.html>`_) and protected (`_converse.api </docs/html/api/-_converse.api.html>`_) APIs.
The main benefit of plugins is their *isolation of concerns* (and features).
The other non-plugin files all contain utility methods in
From this benefit flows various 2nd degree advantages, such as the ability to
`src/utils <https://github.com/conversejs/converse.js/blob/master/src/utils>`_ and