Fluux Messenger: A fast, modern, cross-platform XMPP client for communities and organizations. https://demo.fluux.io/
Find a file
Metalhearf 79f0b40117
Update user-facing texts and typography (#1319)
* 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}}`.
2026-08-24 14:36:47 +02:00
.design-sync fix(theme): drop Fira Code from the monospace stack (#1317) 2026-08-24 10:21:19 +02:00
.devcontainer feat(linux): add Debian packaging and aarch64 support (#51) 2026-01-31 11:56:56 +01:00
.github Update user-facing texts and typography (#1319) 2026-08-24 14:36:47 +02:00
apps/fluux Update user-facing texts and typography (#1319) 2026-08-24 14:36:47 +02:00
assets chore(video): tag demo videos as limited-range BT.709 (#1058) 2026-07-21 14:28:55 +02:00
docs Update user-facing texts and typography (#1319) 2026-08-24 14:36:47 +02:00
packages/fluux-sdk fix(read-state): let another device's read marker carry the new-message divider forward (#1313) 2026-08-20 14:20:16 +02:00
packaging Update user-facing texts and typography (#1319) 2026-08-24 14:36:47 +02:00
screenshots Update user-facing texts and typography (#1319) 2026-08-24 14:36:47 +02:00
scripts fix(read-state): keep the new-message divider where the view opened it (#1311) 2026-08-20 09:52:22 +02:00
.gitignore chore(design): import the presentation layer into Claude Design (#1315) 2026-08-22 21:34:00 +02:00
CHANGELOG.md docs(changelog): finalize 0.17.2 release notes (#1050) 2026-07-21 10:27:08 +02:00
CONTRIBUTING.md Update user-facing texts and typography (#1319) 2026-08-24 14:36:47 +02:00
fluux-messenger.doap Update user-facing texts and typography (#1319) 2026-08-24 14:36:47 +02:00
LICENSE Preparing first public release 2026-01-26 15:09:22 +01:00
package-lock.json fix(scroll): guard settled geometry by the generation it paused (#1255) 2026-08-13 12:49:37 +02:00
package.json build: fail when a doc comment loses its declaration (#1274) 2026-08-14 13:03:56 +02:00
playwright.config.ts feat(scripts): Add Playwright screenshot generation from demo mode 2026-03-27 15:26:11 +01:00
playwright.e2e.config.ts feat: add the dev-build anomaly recording layer (#1178) 2026-07-29 21:38:01 +02:00
playwright.ux.config.ts docs(ux): add UX review with audit screenshots + npm run ux:audit 2026-04-25 12:22:20 +02:00
playwright.video.config.ts feat(demo): native-1080p stepped video recorder (#456) 2026-06-05 14:42:06 +02:00
README.md Update user-facing texts and typography (#1319) 2026-08-24 14:36:47 +02:00
RELEASE_NOTES.md Update user-facing texts and typography (#1319) 2026-08-24 14:36:47 +02:00
renovate.json chore(renovate): target main and ignore broken majors (#408) 2026-05-19 15:20:21 +02:00
SUPPORTED_XEPS.md Update user-facing texts and typography (#1319) 2026-08-24 14:36:47 +02:00
tsconfig.base.json chore(ts): upgrade TypeScript target from ES2020 to ES2022 2026-03-17 14:37:36 +01:00
tsconfig.json Preparing first public release 2026-01-26 15:09:22 +01:00

Fluux Messenger

Release Downloads Repo Size License: AGPL v3 Build Status PRs Welcome

A modern, cross-platform XMPP client for communities and organizations

Try the Live Demo

A quick tour: messaging, group rooms, end-to-end encryption, and theming.

Table of Contents

Screenshots

Light and Dark themes

Light and dark modes side by side

Group Chat Themes & Customization
Group Chat Themes
Multi-user chat with roles, reactions, and polls 14 built-in themes, custom accents, and font settings

See all screenshots in the visual overview

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
  • 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/sdk package 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.

  1. Download the latest release for your platform from the releases page.

  2. Install using the instructions for your platform below.

  3. 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-tls turns 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

Star History Chart


Built with ❤️ by ProcessOne.