Warning
This project is still alpha level software and being actively developed.
A self-hostable web XMPP client. Connects to any existing XMPP server over WebSocket or BOSH, supports multiple accounts at once.
- Chat like you expect: DMs and group chats, replies, reactions, edits, attachments, voice messages, typing and read indicators
- All your accounts in one place
- Works offline and feels fast: messages cached locally, resizable and split panes, dark mode, keyboard-first
- Private by design: OMEMO encryption is our own permissively licensed implementation, validated against the reference stack
- Self-host anywhere: static files behind any web server, or the included Docker image
Requires Node 22+ and pnpm 11+.
pnpm install
pnpm devpnpm buildStatic output lands in dist/, serve it with any web server.
The production image is multi-stage, rootless, digest-pinned, and published
to ghcr.io/quad4-software/badinage with keyless cosign signatures.
docker run -p 8080:8080 ghcr.io/quad4-software/badinage:latestOr build locally:
docker compose -f docker/compose.yaml up --buildThe dev stack under docker/dev/ adds a local Prosody server:
docker compose -f docker/dev/compose.yaml uppnpm check # types + svelte diagnostics
pnpm lint # eslint
pnpm test # unit tests
pnpm test:e2e # playwright, needs browsers installed
pnpm test:omemo # OMEMO library tests incl. interop vectors0BSD, see LICENSE.