# Monal: an XMPP client for iOS and macOS that treats the server as the point

> Monal is a cross platform XMPP client for iOS and macOS, distributed through the App Store, TestFlight, Homebrew casks and an alpha channel, with translations hosted on Weblate and a source tree that includes a Rust component. It suits a user who wants a native chat client for a real XMPP server, and it is a client for one protocol rather than a multi-protocol messenger.

**monal-im/Monal** — Monal for XMPP (iOS and macOS)

- Repository: https://github.com/monal-im/Monal
- Website: https://monal-im.org
- Stars: 684 · Forks: 141
- Language: Objective-C
- License: NOASSERTION
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/monal-im-monal

## One protocol, a native client, and the reasoning behind it

Monal is described as a cross platform, modern XMPP client for iOS and macOS, and the project description says it is the Monal XMPP client as found in the app store. The topics list names jabber, xmpp-client, instant-messaging, chat and messenger alongside apple, ios, macos and swift.

So the scope is one protocol, done properly, rather than a client that speaks five messaging networks with XMPP as one of them. XMPP is an open, federated protocol with a long history of extensions, and the client that supports it well is a specialist tool. The trade is that you get depth on one network and nothing on the others.

The repository layout backs that reading up. There is a Monal/ directory for the application, an Art/ directory holding the screenshots and other assets, a syntax/ directory, a scripts/ directory, a UDPLogServer/ directory for the UDP log server, an appstore_metadata/ directory, and a rust/ directory, which tells you a Rust component sits alongside the Objective-C and Swift code. The primary language is recorded as Objective-C, with Swift also listed among the topics, so the codebase is a mix of the two Apple languages.

The default branch is develop, the last push was on 2026-10-19, and the homepage is monal-im.org, where the project also hosts a blog about the development.

## Four release channels, from the App Store down to an alpha build

The releases table is the most useful thing in the project documentation, because it tells you exactly how you are supposed to be running the software.

For stable, the iOS build is on the App Store at id317711500, the macOS build is on the App Store at id1499227291, and the macOS build also comes as a Homebrew cask, installed with brew install --cask monal.

For beta, the iOS and macOS builds are on TestFlight, with a separate join link for each, and the macOS build is a second cask, monal@beta, installed with brew install --cask monal@beta.

For alpha, the route is by request. You write to info@monal-im.org and then download from the alpha download site. The macOS alpha is a Homebrew tap, and the commands are given as a sequence: brew tap monal-im/homebrew-monal-alpha, then brew trust --cask monal-im/monal-alpha/monal-alpha, then brew install --cask monal-alpha.

The trust step is worth noticing. It tells Homebrew to accept a cask from a tap that is not a default trusted source, which is exactly what you would expect to see for a self-hosted alpha channel and exactly what a security tool should be careful about. It is a deliberate, visible act.

The release tags follow the same three-stage pattern. The most recent are Build_iOS_1100, described as Monal Beta 6.4.24-rc2 with a build number and a pull request reference, then Build_iOS_1099 for the first release candidate, and Build_iOS_1098 which is Monal 6.4.23, the stable build. So the tag names encode the channel, the version and the build number, and a tag alone tells you which of the three distribution channels a given build belongs to.

## The XEP list is published, which is how you judge protocol depth

Two pointers in the project documentation tell you how to assess the client properly.

The first is the supported XEPs link, which points at the XEPs implemented by Monal on the project's own site, at monal-im.org/install/. XEPs are the extension specifications of the XMPP ecosystem, and they are what separate a client that connects from a client that can do group chat, message carbons, file transfer, end to end encryption and the rest. Publishing the list means you can check the specific extensions your server needs before installing.

The second is the platform policy: Monal always supports the two latest major releases of macOS and iOS. That is a narrow and explicit statement, and it has a direct consequence. The App Store review process and the release tooling are tied to recent SDKs, so an older device is not going to get a build, and a user with an older phone is looking at the end of the support window rather than a deprecation notice.

There is also a public chat, a MUC, that anyone can join over XMPP at monal@chat.yax.im, with a pointer to the code of conduct, and a Monal Wiki on GitHub for general information. For a project maintained by volunteers, a live public room is a faster way to get an answer than an issue tracker, and the wiki is where the general documentation lives rather than in the repository.

## Translations run through Weblate, and so does the app store copy

The translations section describes something a little more than string files. Translations of the app itself, of the app store description, and even of the changelog displayed inside the app store are hosted and managed via Weblate, and the project invites people to translate Monal to their language. There is a translation status badge, and a detailed status widget for the multi-language view.

The changelog being translatable is the detail that shows how the project is organised. The release notes that appear in the app are localised, which means a user sees a description of what changed in their own language, and that only works if the release process itself pushes the new strings through the same translation pipeline.

The security reporting path is documented separately, with a SECURITY.md file in the repository, and the project also publishes push_filtering_entitlement.md at the root, which describes an entitlement related to push filtering. That file name is a good sign about the priorities of a messaging client on iOS, where a notification arriving over a push channel can reveal the existence of a conversation to an observer of the network path.

There is also a simulated-push.apns file at the root and a .kateconfig, which is the configuration file for the Kate text editor, alongside the other top-level entries.

## The licence is BSD, and the no GPL rule is a condition on your contribution

The licence section is unusually explicit for a mobile client, and it is worth reading as a statement of project policy rather than as legal boilerplate.

Monal is licensed under the BSD license, and any code contributions should be compatible with that license, with the emphasis on no GPL. By contributing to the project, you agree that your code is not GPL or any similarly restrictive license, and you agree that your code can be used to publish in App stores such as Apple's that use DRM.

The reasoning is clear from the context. A client distributed through the App Store has to be compatible with the store's DRM terms, and a GPL dependency in the tree would create a licence conflict that the project cannot resolve. The clause is a condition on contributors, stated twice, once in the licence section and once in the pull requests section.

The metadata records the licence as something GitHub cannot classify, with a LICENSE file in the tree, so the terms live in that file rather than in a standard SPDX identifier. A company reviewing the dependency needs to read it.

The contribution process itself is short. Pull requests are taken, changes should go to the develop branch, contributors are asked to stick to the code of conduct, and the project links its own build instructions, a list of issues labelled Help wanted, and a support issue for the general case. The code of conduct is in a CODE_OF_CONDUCT.md file at the root, and there is a monal.doap file, which is the standard resource description format for a project, used here so that the project shows up in software catalogues and feeds.

## Where Monal is the wrong tool

The first limit is the protocol. If your contacts are on a consumer messaging network with a proprietary protocol, Monal is not an option, because it is an XMPP client and does not attempt to speak anything else. A user who wants one app for several networks needs a client that implements several, and that client will be worse at XMPP than a specialist.

The second is the platform floor. Two latest major releases of macOS and iOS is a narrow window, and unlike a desktop application, you do not get to choose when the operating system you are on stops being supported. The project does not document a policy for older systems, and the alpha channel is by request to a mailbox, which is not a distribution channel for a general audience.

The third is that the application is the app store product. The readme says the repository holds the Monal XMPP client as found in the app store, and the App Store build is the stable one. Building from source is a separate path with its own wiki page, and a contributor who wants to run a local build is doing something different from a user, with different expectations about what they get.

The fourth is the search feature. The repository tree includes a select/ directory and a syntax/ directory, and the syntax highlighter for conversations in a protocol that carries mixed markup, formatted text, code and custom payloads, is the kind of component that is either handled well or is a persistent source of complaints. The documentation excerpt does not describe it, so it is worth checking on the release you actually install.

The fifth is what an XMPP client inherits from the server ecosystem. A federated network is only as usable as the servers on it, and a client that connects correctly can still land a user in a degraded experience because of missing capabilities on the far side. The published XEP list is the tool for checking that, and it is the first thing to read before installing anything.

## Conclusion

Monal is worth choosing for a user who actually lives on XMPP, because it is a native client for the protocol rather than a wrapper around a service, because the release channels go from App Store through TestFlight to an alpha build, and because the supported XEP list is published rather than implied. It is the wrong choice for a user whose chat is on a consumer network, and it is the wrong choice for a developer who wants to reuse a chat UI. Before you install it, check the three things the project states about itself: that it supports only the two latest major releases of macOS and iOS, so an older device is out; that the alpha channel is by request to info@monal-im.org rather than a public download; and the licence position, which is BSD for the code with an explicit no GPL requirement on contributions, because that is a condition on your own patches and not a detail to discover after submitting one.

## FAQ

### How do I install Monal on macOS?

The stable macOS build is on the App Store, and there is also a Homebrew cask installed with brew install --cask monal. The beta channel is on TestFlight or as the monal@beta cask with brew install --cask monal@beta, and the alpha channel is by request to info@monal-im.org or through the monal-im/homebrew-monal-alpha tap.

### Which macOS and iOS versions does Monal support?

The project documentation states that Monal always supports the two latest major releases of macOS and iOS. The supported XEP list is published separately on the project site, so you can check the specific extensions your server needs before installing.

### Can I contribute code to Monal?

Yes, pull requests are taken, and changes should go to the develop branch along with the code of conduct. Contributions must be compatible with the BSD license and must not be GPL or similarly restrictive, and by contributing you agree your code can be used to publish in App stores such as Apple's that use DRM.

## Sources

- [Issues](https://github.com/monal-im/Monal/issues)
- [monal-im/Monal on GitHub](https://github.com/monal-im/Monal)
- [Project website](https://monal-im.org)
- [README](https://github.com/monal-im/Monal/blob/develop/README.md)
- [Releases](https://github.com/monal-im/Monal/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/monal-im-monal
