finds.dev← search

// the find

jsxc/jsxc

★ 731 · TypeScript · MIT · updated Aug 2024

:speech_balloon: Real-time xmpp chat application with video calls, file transfer and encrypted communication.

JSXC is a TypeScript XMPP client library designed to be embedded into existing web applications — it's the engine behind the Nextcloud Talk XMPP integration and similar self-hosted setups. It covers the full XMPP feature surface: MUC, WebRTC video via Jingle, file upload, message carbons, MAM archiving, and chat state notifications. If you need a drop-in XMPP client widget for a PHP/Node web app that already has an XMPP server, this is one of the few serious options.

The plugin architecture is genuinely well-structured — PluginAPI.interface.ts, AbstractPlugin, EncryptionPlugin form a real extension surface, not just a callback registry bolted on later. Protocol support is unusually complete for a browser client: message carbons (XEP-0280), delivery receipts (XEP-0184), chat markers (XEP-0333), MAM (XEP-0313), bookmarks, blocking, and Jingle-based WebRTC — these are the right specs implemented at the right layer. Localization coverage is impressive: 30+ locale files covering Arabic, Japanese, Vietnamese, and others, not just the usual Western European set. The Jingle signaling for video calls (JingleCallSession, JingleMediaSession, JingleStreamSession split into separate concerns) is architecturally cleaner than most WebRTC wrappers you'll find.

The CI badges link to Travis CI and LGTM — both effectively dead for open source — and the last commit was August 2024, now nearly two years ago. That's a maintenance red flag for something that has to track browser WebRTC changes and XMPP XEP updates. The end-to-end encryption story is OTR, which is a 2004-era protocol with no multi-device support and no forward secrecy after session loss; OMEMO (XEP-0384) has been the correct answer since 2015 and its absence is a real gap for anyone who needs secure messaging. The example directory ships Bootstrap 3-era Glyphicon fonts alongside jQuery, which tells you something about the vintage of the integration surface and how much the UI layer has drifted from the TypeScript core. It also requires an external XMPP server (ejabberd, openfire) with no guidance on which configuration actually works with all the XEPs it expects — getting that server-side support matrix right is on you.

View on GitHub → Homepage ↗

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →