* docs: drop the promotional register from the public docs
Several feature headings and bullets sold the feature instead of saying
what it does. "Rich Messaging", "Powerful Search" and "Rich Features" add
nothing a reader cannot see from the list underneath, and "Comprehensive
shortcut system" is vaguer than naming what the shortcuts cover. The
screenshot captions were the same: "at-a-glance server vital signs" is
just the uptime, version, user and room counts.
The rest is filler that was standing between the reader and the
instruction: "in a few simple steps", "Simply extract it", "of your
choice", four variants of "feel free to", and "Looking ahead, we also
plan to".
Em dashes used as clause separators are now sentences, commas or colons
throughout.
* docs(marketing): correct the counts and claims in the page draft
The draft has drifted from what ships. It advertises 31 languages and
lists Japanese among them: there are 34 locale files and no ja.json. It
claims 40+ extensions where the README and SUPPORTED_XEPS say 50+. And it
promises read receipts, which are still in the planned list.
Two reliability claims were stronger than the protocol allows. Stream
Management does not mean "no message is ever lost", it means the stream
resends what the connection dropped, and session resumption does not
happen "in milliseconds" in any measured sense. Both now say what the
XEP actually gives you.
The copy around them loses the sales register: "battle-tested",
"beautiful", "carefully crafted", "seamlessly", "Conversations That Feel
Alive" and "under the hood".
* fix(packaging): stop advertising read receipts in the store metadata
The AppStream description promised "real-time messaging with typing
indicators and read receipts". Typing indicators ship, read receipts do
not: XEP-0184 and XEP-0333 are both in the planned list, and the README
FAQ says so plainly. That text is what Flathub and GNOME Software show,
so it was the one place we were making the promise to users who cannot
check.
Replaced with the OpenPGP line, which does ship, and cut the padding
from the deb and rpm descriptions ("user-friendly", "clean interface",
"the full breadth of the XMPP protocol") in favour of the server claim
that matters: it connects to any XMPP server.
* chore(i18n): drop "powerful" from the about description
The About dialog described Fluux as "a powerful, productive messaging
client that's pleasant to use". Powerful is the word every client uses
about itself and it tells a reader nothing, so it goes, in all 34
locales and in the crate description the desktop build reads from.
While in there, es.json spelled mensajeria without its accent.
* chore(i18n): one apostrophe style per locale file
The Latin-script locales mixed straight and curly apostrophes inside
words: ca had 18 curly against 257 straight, fr 15 against 217, and en
quoted a room name with curly double quotes where every other
placeholder in the file uses straight ones. The minority style is now
gone from en, ca, fr, it, mt and ga.
be and uk are left alone on purpose. There the apostrophe is part of the
spelling (з’єднання, ім’я), not a typographic preference.
* chore(demo): tighten the tutorial tooltips
The demo tour spoke in brochure: rooms are where a team "collaborates in
real time", themes and languages are "just a click away", and the last
step said the features were live twice over. The counts were stale too,
"30+ languages" against the 34 locales we ship.
* fix(poll): the banner emoji duplicates the icon beside it
PollBanner renders a BarChart3 glyph and then a string that opens with a
chart emoji, so the banner shows the same picture twice. The emoji goes,
in all 34 locales.
The inline fallbacks for the two banner strings and for the TOFU tooltip
had also drifted from the locale file and still carried the older em dash
phrasing. They now read the same as en.json, which is what actually
renders.
The locale files also mixed both ellipsis characters for the same kind of
string: "Connecting..." against "Checking peer…", 43 ASCII against 10
Unicode in every file. They are all ASCII now, except zh-CN where the
Unicode form is the correct typography. One test comment quoted the old
spelling of a string it no longer matches.
* docs(metadata): tidy the descriptions we publish about ourselves
The DOAP description, which is what xmpp.org's software list reads, said
"a modern, Web and Desktop cross-platform XMPP client [...] and Tauri for
desktop": cross-platform already covers web and desktop, and desktop
arrived twice in one sentence. It also spelled TypeScript without its
capital S, in both languages. The French one called the desktop builds
"clients lourds", which is not what we call them anywhere else.
The PWA manifest and the HTML meta description used a hyphen where a
comma belongs, and the feature request template told people to "get
creative", which does not tell them anything about what to write.
* docs: replace the em dashes in the reference docs
The em dash was doing three different jobs across these files: separating clauses in prose, introducing a description after a label, and standing in for "not applicable" in a table cell. Only the last one is what the character is for, so those stay (`DEMO_MODE`, `MEP_DESIGN`, three cells in `UX_REVIEW`). Everything else is now a comma, a colon or a full stop, whichever the sentence actually wanted. Numeric and emoji ranges written with an en dash use a hyphen.
Scope is the living reference docs. The dated design notes and everything under `docs/superpowers/` are records of what a design looked like on a given day, and rewriting them after the fact would only make them less trustworthy. That leaves about 2700 dashes in the archive, deliberately.
Table column widths are unchanged, so the rows still line up in a plain editor.
* fix(i18n): restore the missing accents in es.json
About 90 Spanish strings were written without their diacritics: "Contrasena", "Edicion Comunitaria", "conexion", "Anadir", "Contactanos". Spanish accents are not decorative, they carry stress and meaning, and a password field labelled "Contrasena" reads as a typo to every native speaker.
Only words whose unaccented spelling is not itself a valid Spanish word were replaced automatically. The genuinely ambiguous ones were done by hand from their surrounding phrase: "una sala publica" is an adjective and becomes "pública", but "Publica una clave" is the imperative of publicar and stays as it is. solo, mas, si, tu and esta were left alone unless the sentence left no doubt.
JSON keys and `{{placeholder}}` names are untouched: `about.version` still interpolates `{{version}}`.
|
||
|---|---|---|
| .design-sync | ||
| .devcontainer | ||
| .github | ||
| apps/fluux | ||
| assets | ||
| docs | ||
| packages/fluux-sdk | ||
| packaging | ||
| screenshots | ||
| scripts | ||
| .gitignore | ||
| CHANGELOG.md | ||
| CONTRIBUTING.md | ||
| fluux-messenger.doap | ||
| LICENSE | ||
| package-lock.json | ||
| package.json | ||
| playwright.config.ts | ||
| playwright.e2e.config.ts | ||
| playwright.ux.config.ts | ||
| playwright.video.config.ts | ||
| README.md | ||
| RELEASE_NOTES.md | ||
| renovate.json | ||
| SUPPORTED_XEPS.md | ||
| tsconfig.base.json | ||
| tsconfig.json | ||
Fluux Messenger
A modern, cross-platform XMPP client for communities and organizations
A quick tour: messaging, group rooms, end-to-end encryption, and theming.
Table of Contents
- Screenshots
- Features
- Quick Start
- Command-Line Options
- Technology Stack
- Support & Community
- Frequently Asked Questions
- Contributing
- License
- Star History
Screenshots
Light and dark modes side by side
| Group Chat | Themes & Customization |
|---|---|
![]() |
![]() |
| Multi-user chat with roles, reactions, and polls | 14 built-in themes, custom accents, and font settings |
Features
Messaging
- Reactions, Replies & Styling - Emoji reactions with quick toolbar, threaded replies, and rich text formatting (bold, italic, code blocks with syntax highlighting)
- Emoji Autocomplete - Type
:and a keyword to complete emojis inline, with arrow-key navigation and Enter or Tab to insert - Message Retraction & Moderation - Delete your own messages or moderate room messages with full audit trail
- Link Previews - Automatic Open Graph previews for shared URLs
- File Sharing - HTTP uploads with drag-and-drop, thumbnails, progress indicators, image lightbox, and text file preview
- Polls - Create polls in rooms with emoji voting, deadlines, single or multi-vote modes, and live result tallies
Group Chat & Collaboration
- Multi-user Chat - Complete MUC support with roles, affiliations, custom hats (role badges), @mentions, and bookmarks
- Private Messages in Rooms - Mediated private messages (whispers, XEP-0045 §7.5) to a single occupant, shown as a distinct private thread you can reply to privately
- Quick Chat - Instantly create ad-hoc group conversations and invite contacts by name
- Per-User Ignore - Mute specific users per room, synced across devices
- Activity Log - Persistent feed of events: invitations, subscription requests, reactions, poll votes, joins and leaves
Search
- Full-text Search - Instant offline search powered by an IndexedDB inverted index, supplemented by live server archive queries
- Find on Page - Cmd/Ctrl+F to search within the current conversation with highlight and scroll
- Smart Filters - Type filter pills,
in:prefix autocomplete, quoted exact-phrase matching, and keyboard-navigable results with context preview
Theming & Personalization
- 14 Built-in Themes - Catppuccin, Nord, Dracula, Gruvbox, Tokyo Night, Rosé Pine, Solarized and more, in light and dark mode
- Custom Themes - Import/export themes as JSON, pick a custom accent color, or write CSS overrides in the built-in editor
- Synced Across Devices - Theme, accent, and font size preferences are stored server-side and follow you everywhere
- Internationalization - 34 languages including complete EU coverage
Privacy & Security
- Self-hostable - Connect to any XMPP server, no vendor lock-in, no third-party dependency
- End-to-End Encryption - OpenPGP (OX-IM, XEP-0373/0374) for 1:1 chats; messages are encrypted and signed; automatic key discovery, peer verification with cross-device sync, secret key backup, and encrypted MAM history decryption
- FAST Authentication - Modern SASL2 with token-based reconnection for instant, password-less session resumption
- Contact Blocking - Full block/unblock support with a dedicated management screen
- In-Band Password Change - Change your account password without leaving the app
Desktop & Cross-Platform
- Cross-platform - Available on the web, macOS (Intel & Apple Silicon), Windows, and Linux (deb, rpm, flatpak, AUR)
- Auto Updates - Built-in update checker with release notes and one-click install (desktop)
- Native Notifications - Desktop notifications with click-to-focus; web push notifications even when the tab is closed
- Auto-Away - Automatically sets your status to away on system idle and restores it on activity
- Offline Support - IndexedDB storage with automatic sync and stream management session resumption on reconnect
Power User Tools
- Command Palette - Keyboard-accessible launcher for conversations, contacts, rooms, and actions
- Keyboard Shortcuts - Shortcuts for navigation and message actions, with a categorized help overlay and AZERTY support
- Built-in XMPP Console - Live stanza inspector with exportable connection-health diagnostics for scheduler suspension, sleep, and reconnection troubleshooting
- Server Administration - Manage users, rooms, and server commands right from the client (for admins)
- User Profiles - User info popovers with vCard details, connected devices, timezone, and last seen status
Developer-Friendly
- Headless SDK - Reusable
@fluux/sdkpackage for building custom XMPP clients or bots - 50+ XEPs Implemented - MAM, MUC, Stream Management, Message Carbons, HTTP File Upload, Reactions, OpenPGP (OX-IM), FAST, and many more.
- Compatible - see Compliance of Fluux.
- Open Source - AGPL-3.0 licensed
Quick Start
Want to try it first? Head over to demo.fluux.io for a live demo, no installation needed.
-
Download the latest release for your platform from the releases page.
-
Install using the instructions for your platform below.
-
Connect to any XMPP server with your credentials and start chatting!
Windows (x64)
| Format | How to install |
|---|---|
.exe |
Run the setup wizard (recommended) |
.msi |
Run msiexec /i Fluux-Messenger_*_Windows_x64.msi or double-click to install |
macOS (Intel & Apple Silicon)
| Format | How to install |
|---|---|
.dmg |
Open the image and drag Fluux Messenger to Applications (recommended) |
.app.tar.gz |
Extract with tar xzf and move the .app to Applications |
Both x64 (Intel) and arm64 (Apple Silicon) builds are available.
Linux (x64 & arm64)
| Format | How to install |
|---|---|
.deb |
sudo dpkg -i Fluux-Messenger_*.deb (Debian, Ubuntu, Mint...) |
.rpm |
sudo rpm -i Fluux-Messenger_*.rpm (Fedora, RHEL, openSUSE...) |
.flatpak |
flatpak install Fluux-Messenger_*.flatpak |
.tar.gz |
Extract with tar xzf and run the binary directly |
Both x64 and arm64 builds are available for all formats.
Arch Linux users can install from the AUR: fluux-messenger
Web (self-hosted)
Download the fluux-messenger-*-web.zip asset from the releases page, extract it, and serve it with any web server (the app must be served over HTTP). This also works as a PWA on mobile devices when served from your own domain.
Build from source
See the Developer Guide for instructions on building and running Fluux Messenger locally.
Need help? See the support options below.
Command-Line Options
The desktop app accepts a few command-line flags. Run fluux-messenger --help to list them:
| Flag | Description |
|---|---|
-v, --verbose |
Enable verbose logging to stderr (no XMPP traffic) |
--verbose=xmpp |
Enable verbose logging including XMPP packet content |
--log-file=PATH |
Override the log file directory (default: platform log dir) |
-c, --clear-storage |
Clear local storage (localStorage, sessionStorage, IndexedDB) on startup |
--dangerous-insecure-tls |
Disable TLS certificate verification. Insecure, for development and testing only. |
-h, --help |
Show the help message |
Warning:
--dangerous-insecure-tlsturns off TLS certificate validation for the connection to your XMPP server, which exposes it to man-in-the-middle attacks. Use it only for local development or testing (for example, against a server with a self-signed certificate), never in production.
Technology Stack
- Frontend: React 18 + TypeScript
- Desktop: Tauri 2.x (Rust-based, lightweight)
- Styling: Tailwind CSS
- State Management: Zustand + XState
- Build System: Vite + Vitest
- XMPP: @xmpp/client + @fluux/sdk
- Storage: IndexedDB with idb
Support and Community
We have a lot planned for Fluux Messenger, and we welcome questions, feedback, and bug reports.
- GitHub Issues - Use Issues to report bugs, request features, or track tasks. We use Issues as our lightweight roadmap for upcoming improvements, and we're open to new ideas, so tell us about yours.
- GitHub Discussions - Use Discussions for questions, ideas, or general conversations that don't require formal tracking. Great for brainstorming, getting help without opening an Issue, or suggesting documentation improvements.
- XMPP Chatroom - Join fluux-messenger@conference.process-one.net for live chat with the community and maintainers.
Frequently Asked Questions
Have suggestions for this FAQ? Ask questions or propose additions in our Q&A Discussions.
Installation & Compatibility
Which XMPP servers are compatible with Fluux Messenger?
We aim to create an XMPP client that respects standards, but currently the project has been tested exclusively with ejabberd. We're eager to receive feedback on compatibility with other servers.
Will there be other installations methods? Can I run it on my own server?
Yes. A pre-built static web bundle (-web.zip) is available on the releases page. Extract it and serve it with any web server.
We also plan to publish Fluux Messenger on F-Droid, and possibly on the Google Play Store.
My XMPP server only listens on the standard TCP port (5222), can I still use Fluux Messenger?
Yes, on the desktop app: it ships with a built-in WebSocket-to-TCP proxy. It first tries WebSocket (via XEP-0156 discovery), then falls back to TCP/TLS.
The web version requires WebSocket on your server, with CORS configured to allow the origin from which Fluux is served.
Encrypted attachments don't open or preview in the web version
The web version downloads each encrypted attachment and decrypts it in the browser before displaying it, so the host serving your uploaded files (HTTP File Upload) must also send CORS headers allowing the origin from which Fluux is served. This is the same CORS requirement as the WebSocket endpoint above, applied to your file-storage host. The desktop app downloads files through its native HTTP client, so it is not affected.
Features & Roadmap
Does Fluux Messenger support end-to-end encryption?
Yes. OpenPGP (OX-IM, XEP-0373/0374) is implemented for one-to-one chats. Messages in 1:1 conversations are encrypted and signed using each participant's published OpenPGP key. Features include automatic key discovery, peer verification with cross-device sync, secret key backup, and MAM history decryption. Group-chat (MUC) encryption is not yet supported. OMEMO may follow: beyond the implementation work it raises licensing questions we want to address properly. We're also watching MLS as an option for large-scale group chats.
When will voice and video calls be available?
We know it's important and we want to bring it. We can't commit to a timeline yet: there's real work to do on both the client and server side, especially for group calls which need a media-mixing SFU to be reliable.
Does Fluux Messenger support read receipts?
Not yet. Read receipts are on our list and we plan to start with 1-to-1 chats. For group rooms we're still weighing the question: how useful they actually are at scale, how best to implement them and the privacy implications of broadcasting read state to every participant.
Does Fluux Messenger support Spaces (bundles of rooms)?
Not yet. Spaces (XEP-0503) have started to appear in the ecosystem (Movim has an experimental implementation) and we're watching how it evolves before committing to an approach.
Can I contribute a translation for my language?
Yes, translations are welcome. Locale files live under apps/fluux/src/i18n/locales/. See CONTRIBUTING.md for the general contribution workflow. Open an issue or discussion first if you have questions.
Is there a roadmap?
There's no formal roadmap document, but we track upcoming work through GitHub Milestones and Issues. Follow, comment or open a new issue for anything you'd like to see.
Troubleshooting
My antivirus flags the Windows installer as malicious, is the app safe?
Yes. Two things can trigger warnings right now:
- Starting with 0.15, the Windows binary is temporarily not code-signed while we work through the signing infrastructure (see #290).
- The combination of Tauri and NSIS used to package the app is also a known source of antivirus false positives affecting many legitimate apps.
If you'd rather verify for yourself, build the app from source.
Closing the window doesn't quit the app, is that normal?
Yes. By default, closing the main window minimizes Fluux to the system tray or menu bar so it can keep your XMPP session alive and deliver notifications. To fully exit, use the Quit entry from the tray menu.
On the web version, why do I have to log in again after closing the tab?
Fluux never persists your password to local storage. If your XMPP server supports FAST authentication tokens (SASL2), Fluux stores a short-lived token in local storage so reconnection across page reloads works without storing the password. Without FAST support, the session credentials disappear when the tab closes and you must log in again.
Contributing
Contributions are welcome! See CONTRIBUTING for detailed guidelines.
To get started with development, see the Developer Guide.
License
Fluux Messenger is licensed under the GNU Affero General Public License v3.0 or later. See LICENSE
Star History
Built with ❤️ by ProcessOne.


