Converse is a modern, feature-rich XMPP chat client.
It runs in the browser, as a standalone web app or integrated into existing websites,
and its headless core (@converse/headless) also runs in Node.js.
Join our chat room (XMPP URL: discuss@conference.conversejs.org).
Try the hosted app at conversejs.org. You can also download and install Converse Desktop or Converse Tauri.
Or set up your own instance:
git clone --filter=blob:none https://github.com/conversejs/converse.js.git
cd converse.js
git clone https://github.com/conversejs/media.git media # images such as sponsor logos
npm install
npm run build
npm run serve -- -p 8008You can then open http://localhost:8008/dev.html in your browser to access Converse.
The repository has a long history, so --filter=blob:none makes a blobless clone,
which downloads the contents of older file versions only when they're needed.
Use --depth 1 instead if you don't need the history at all.
See our quickstart guide for more details.
Converse can be displayed in three ways. Click a screenshot to see it full size.
![]() Fullpage (default) A single-page application covering the entire viewport. |
![]() Overlay Chat boxes appear on top of your website. |
![]() Embedded Converse integrates into specific elements in your page's DOM. |
- Main App: Try the full application
- Anonymous Login: Test without creating an account
- Embedded Chat Room: See how to embed a single chat room
Comprehensive documentation is available at conversejs.org/docs, including:
- Multiple UI Options: Overlay chat boxes, full-page application, or embedded components
- Rich Messaging: Message styling, corrections, reactions, and URL previews
- Privacy-Focused: End-to-end encryption with OMEMO
- Audio Calls: 1:1 audio calls over Jingle (since 15.0.0)
- Voice Messages: Record and send voice messages, via an opt-in plugin (since 15.0.0)
- Microblogging: Follow and post to social feeds (since 15.0.0)
- User Status: Custom status messages and availability indicators
- Notifications: Desktop notifications for new messages
- File Sharing: HTTP File Upload support
- Extensible: Plugin architecture based on pluggable.js
- Internationalized: Translated into 40+ languages
- Anonymous Login: Use without registration (server permitting)
- Responsive: Works on desktop and mobile devices
Converse implements a wide range of XMPP Extensions (XEPs), making it one of the most protocol-compliant web clients available.
View all 75 supported XEPs and 5 RFCs
| Spec | Name | Status | Since | Notes |
|---|---|---|---|---|
| RFC 6120 | XMPP: Core | |||
| RFC 6121 | XMPP: Instant Messaging and Presence | |||
| RFC 6122 | XMPP: Address Format | |||
| RFC 7395 | XMPP Subprotocol for WebSocket | |||
| RFC 7590 | Use of Transport Layer Security (TLS) in XMPP | |||
| XEP-0004 | Data Forms | Complete | ||
| XEP-0030 | Service Discovery | Complete | 0.8.2 | |
| XEP-0045 | Multi-User Chat | Complete | ||
| XEP-0048 | Bookmarks | Complete | 2.0.1 | |
| XEP-0050 | Ad-Hoc Commands | Complete | 7.0.0 | |
| XEP-0054 | vcard-temp | Complete | ||
| XEP-0059 | Result Set Management | Complete | ||
| XEP-0060 | Publish-Subscribe | Complete | ||
| XEP-0066 | Out of Band Data | Complete | 4.0.0 | |
| XEP-0077 | In-Band Registration | Complete | 0.8.5 | |
| XEP-0085 | Chat State Notifications | Complete | ||
| XEP-0092 | Software Version | Complete | ||
| XEP-0115 | Entity Capabilities | Complete | ||
| XEP-0122 | Data Forms Validation | Partial | basic string field sub-type usage | |
| XEP-0124 | Bidirectional-streams Over Synchronous HTTP (BOSH) | Complete | ||
| XEP-0144 | Roster Item Exchange | Complete | ||
| XEP-0147 | XMPP URI Scheme Query Components | Partial | Clicking an xmpp: URI dispatches the feasible query actions: message, join, roster (add a contact), subscribe/unsubscribe and remove. vCard, ad-hoc command, disco, register and file-transfer query types are not handled. Converse can also be registered as the browser's handler for the xmpp: URI scheme, so that links clicked outside Converse are dispatched the same way. | |
| XEP-0153 | vCard-Based Avatars | Complete | 11.0.0 | |
| XEP-0156 | Discovering Alternative XMPP Connection Methods | Complete | 6.0.0 | |
| XEP-0163 | Personal Eventing Protocol | Complete | ||
| XEP-0166 | Jingle | Partial | Used for one-to-one audio calls. Adding, modifying or removing contents, and replacing transports, are refused. | |
| XEP-0167 | Jingle RTP Sessions | Partial | Audio only, no video. Informational session-info payloads (ringing, mute, hold) are acknowledged but neither acted upon nor sent. | |
| XEP-0172 | User Nickname | Complete | ||
| XEP-0176 | Jingle ICE-UDP Transport Method | Complete | UDP candidates only, trickled, with ICE restarts. | |
| XEP-0184 | Message Delivery Receipts | Complete | ||
| XEP-0191 | Blocking Command | Complete | 11.0.0 | |
| XEP-0198 | Stream Management | Complete | 5.0.0 | |
| XEP-0199 | XMPP Ping | Complete | ||
| XEP-0202 | Entity Time | Partial | 1:1 chats only, no MUC occupant support | |
| XEP-0203 | Delayed Delivery | Complete | ||
| XEP-0206 | XMPP Over BOSH | Complete | ||
| XEP-0215 | External Service Discovery | Partial | STUN and TURN servers are discovered for calls, and credentials are requested for restricted ones. Pushed service updates are not handled. | |
| XEP-0223 | Persistent Storage of Private Data via PubSub | Complete | ||
| XEP-0245 | The /me Command | Complete | ||
| XEP-0249 | Direct MUC Invitations | Complete | 0.8.2 | |
| XEP-0277 | Microblogging over XMPP | Partial | Authoring geolocation is not implemented. | |
| XEP-0280 | Message Carbons | Complete | 0.8.0 | |
| XEP-0293 | Jingle RTP Feedback Negotiation | Complete | ||
| XEP-0294 | Jingle RTP Header Extensions Negotiation | Complete | ||
| XEP-0297 | Stanza Forwarding | Complete | ||
| XEP-0308 | Last Message Correction | Complete | 4.0.0 | |
| XEP-0313 | Message Archive Management | Complete | 0.9.5 | |
| XEP-0317 | Hats | Complete | ||
| XEP-0319 | Last User Interaction in Presence | Complete | 4.0.5 | |
| XEP-0320 | Use of DTLS-SRTP in Jingle Sessions | Complete | ||
| XEP-0330 | Pubsub Subscription | Partial | The follow-list backing the "Social" app: publishing and retracting entries on the user's own subscription node as they follow and unfollow, reading a contact's list of followed feeds, and live multi-device synchronisation of the user's own list (a follow or unfollow on one device propagates to the others via a +notify subscription). The followers side is not exposed. | |
| XEP-0333 | Displayed Markers | Partial | 4.1.1 | |
| XEP-0338 | Jingle Grouping Framework | Complete | ||
| XEP-0339 | Source-Specific Media Attributes in Jingle | Complete | ||
| XEP-0352 | Client State Indication | Complete | 0.9.4 | |
| XEP-0353 | Jingle Message Initiation | Partial | We do not propose again to resume a call of our own after a reconnection or reload, so only the peer can migrate a call. | |
| XEP-0357 | Push Notifications | Complete | 4.0.0 | |
| XEP-0359 | Unique and Stable Stanza IDs | Complete | ||
| XEP-0363 | HTTP File Upload | Complete | 4.0.0 | |
| XEP-0371 | Jingle ICE Transport Method | Complete | ||
| XEP-0372 | References | Complete | ||
| XEP-0382 | Spoiler messages | Complete | 3.3.3 | |
| XEP-0384 | OMEMO Encryption | Complete | 4.0.0 | |
| XEP-0392 | Consistent Color Generation | Complete | 11.0.0 | |
| XEP-0393 | Message Styling | Complete | 8.0.0 | |
| XEP-0402 | PEP Native Bookmarks | Complete | 11.0.0 | |
| XEP-0410 | MUC Self-Ping (Schrödinger's Chat) | Complete | 5.0.0 | |
| XEP-0420 | Stanza Content Encryption | Complete | 14.0.0 | |
| XEP-0421 | Occupant identifiers for semi-anonymous MUCs | Complete | ||
| XEP-0422 | Message Fastening | Complete | ||
| XEP-0424 | Message Retraction | Complete | 6.0.0 | |
| XEP-0425 | Moderated Message Retraction | Complete | 6.0.0 | |
| XEP-0431 | Full Text Search in MAM | Complete | ||
| XEP-0433 | Extended Channel Search | Partial | 15.0.0 | Keyword search for XEP-0045 groupchats, used to suggest groupchats when joining one. The search form is not requested from the service, the "all" field (full listing) is not used, and MIX channels are not searched for. Falls back to the pre-standard protocol of search.jabber.network when a service doesn't support XEP-0433. |
| XEP-0437 | Room Activity Indicators | Complete | 8.0.0 | |
| XEP-0444 | Message Reactions | Complete | 13.0.0 | |
| XEP-0454 | OMEMO Media sharing | Complete | 8.0.0 | |
| XEP-0461 | Message Replies | Complete | ||
| XEP-0469 | Bookmark Pinning | Complete | 15.0.0 | Pinned groupchats are shown at the top of the list of open groupchats. Pinned bookmarks of groupchats that aren't open aren't shown. |
| XEP-0472 | Pubsub Social Feed | Partial | Microblog profile of the Pubsub Social Feed: the social-feed discovery feature and Base-profile node config used by the "Social" app. Gallery-profile nodes are rendered (consume-only, as an image grid); creating/hosting gallery nodes is not implemented. |
Converse integrates with popular platforms and frameworks:
| Server | Plugin |
|---|---|
| Openfire | inverse |
| Prosody | mod_conversejs |
| ejabberd | mod_conversejs |
Large Language Models have been and may be used to assist with Converse's development, including writing and refactoring code, editing documentation and research.
Converse does not implement its own cryptography. OMEMO end-to-end encryption is delegated to libomemo.js; see that project's own LLM and GenAI usage note for how its security-critical code is verified.
Within Converse, correctness is checked independently of any AI. The test suite runs in a real browser, and every change, however it was drafted, is reviewed by a human maintainer who remains responsible for it, exactly as for any third-party contribution.
Using LLMs or coding agents to help write your contribution is allowed. AI is a legitimate tool, and we won't reject a patch simply because a model helped write it, but the bar is the same as for any other pull request:
- Understand what you submit. You are responsible for your contribution. Be able to explain how it works and why it's correct.
- Test it. Your code must build and pass the test suite, and new behaviour should come with tests.
- Disclose it. Note in your pull request that AI tooling was used. This is about honesty and giving reviewers context, not stigma.
- No slop. Unreviewed, untested, auto-generated output thrown over the fence will be closed.
If you're driving Converse with a coding agent, start with
AGENTS.md, which documents the architecture, conventions and
build/test workflow the project expects.
The repo also comes with a code review skill,
codereview-conversejs.
It checks a change against the project's architectural rules as well as the usual
correctness and testing concerns. It uses the open Agent Skills
format, so coding agents that support skills (such as Codex, Claude Code and
OpenCode) can pick it up automatically when you work in this repo. To run it
explicitly, use $codereview-conversejs in Codex or /codereview-conversejs in
Claude Code, or ask your agent to use the skill by name. Running it on your change
before you open a pull request is a good way to catch problems early, but it
doesn't replace your own review or the maintainers'.
If you find Converse useful, please consider supporting its development:
Thanks to everyone who has supported this project over the years through donations, testing, bug reports, and code contributions.


