xmatic

Rating: 
5
Your rating: None Average: 5 (4 votes)

Native Matrix client built on matrix-rust-sdk with a Silica UI.

FEATURES

- Sliding sync, end-to-end encryption, cross-signing, device verification (both directions), key backup and recovery
- Rooms, spaces (nested), direct chats, threads (answer in one or start one), room directory search
- Create rooms, invite, leave; member list and member profiles with moderation
- Send, edit, delete, reply, pagination in encrypted rooms
- Formatted messages: bold, italic, code, quotes, lists and links render as themselves
- Pinned messages, favourites, low priority, per-room mute, ignored users
- A room opens where you stopped reading, and says who has read what
- Reactions from an emoji picker whose first tab you fill yourself
- Pictures, files, sharing (also as share target from Gallery / file manager)
- Voice messages; voice and video calls (classic 1:1 VoIP; MatrixRTC-only clients cannot be called)
- Notifications, offline send queue, encrypted local storage
- OAuth (MAS) login, device-code login, password login
- 29 interface languages, switchable in the app

LANGUAGES

The interface is available in the 24 official languages of the European Union
plus Russian, Norwegian, Icelandic, Simplified Chinese and Hindi. Norwegian was contributed by a Norwegian
speaker and German is the project language; the rest are machine translations,
usable but unchecked. Account has a language setting of its own, English
included, so there is always a way back out of one. A change applies at the
next start.

Corrections are welcome at the GitHub repository below - the file to edit is
translations/harbour-xmatic-<language>.ts, and translations/STATUS.md says
which languages have been read by a native speaker.

LOCAL STORAGE

Session tokens and the message database are encrypted with a key from Sailfish
Secrets. Where the system's secure storage hands out no key, the app keeps
working with unencrypted storage rather than refusing to start - and says so on
the encryption page instead of only in the log. Where a database simply
predates the key, that page offers to re-create it encrypted.

WHY IS THE PACKAGE SO BIG?

The app ships the complete Matrix stack statically: matrix-rust-sdk, E2EE
(vodozemac), sliding sync, rustls, its own HTTP runtime and a bundled SQLite.
None of that exists as a system library on Sailfish OS, and Qt 5.6 is too old
for the C++ alternatives - which is exactly why the protocol core is written in
Rust. Installed size ~51 MB (Element X, same SDK: ~100 MB), RPM ~16 MB.

NO BACKGROUND DAEMON

Messages arrive while the app is running (the cover is enough). Like other
daemonless messengers on this platform, a closed app does not receive.

ARCHITECTURES

aarch64 (Sailfish OS 5.0+), armv7hl (Sailfish OS 4.6+).

REQUIREMENTS

xmatic syncs over simplified sliding sync (MSC4186), the same mechanism
Element X uses. Your homeserver must support it. If it does not, sign-in
works but no rooms load and the app keeps showing "Offline".

How to check your server: open this address in a browser

https://YOUR-SERVER/_matrix/client/versions

and look for this line:

"org.matrix.simplified_msc3575": true

If it is missing, xmatic cannot load your rooms from that server.

Sign-in methods supported: OAuth 2.0 / Matrix Authentication Service,
device code ("Sign in on another device"), and username plus password on
servers without OAuth.

The classic SSO redirect sign-in (SAML, CAS) is not supported.

Written with Claude Code (Anthropic), icons included; the protocol core is upstream matrix-rust-sdk.

Source, issues, releases:
https://github.com/JimKnopfIoT/harbour-xmatic

Application versions: 
AttachmentSizeDate
File harbour-xmatic-0.24.0-1.aarch64.rpm15.74 MB26/08/2026 - 23:42
File harbour-xmatic-0.24.0-1.armv7hl.rpm16.25 MB26/08/2026 - 23:42
Changelog: 

- A thread's replies stay in the thread instead of standing in the room a
second time. The way in is the marker on the root, and it no longer depends
on what the local store happens to know: the room's thread roots are asked of
the server as well, so threads that existed before this version are reachable
too. Measured on two devices - on the one whose store predated threads, every
thread was doorless without that question.
- The picture of your own camera during a video call is shown the way a mirror
shows it. Only the preview: what the other side receives is untouched.
- Threads carry their replies. A thread opened from a message showed its root
and nothing more: an own reply was gone again on the next visit, and a reply
written in another client never arrived - while that same reply stood in the
room's timeline, so nothing was lost on the way. The SDK keeps a thread's
events only where threading is switched on, and it never was. Threads have
therefore not worked since they were built. What it costs to switch on: a
reply inside a thread no longer raises the room's badge by itself.
- A room with a lot unread opens where reading stopped. The row was looked for
once, in the newest slice a room hands over first, and dropped without a word
when it was not there - which is precisely the room with a lot unread. It is
fetched now, and the last read message goes to the top of the screen, so the
line and the first unread message are both in view.
- The fully-read marker is sent even with read receipts switched off. It is
private account data: holding it back told nobody anything and only cost this
device the line in the conversation and the place a room opens at.
- Who read a message is an eye and a number instead of the words "read by", and
a tap on it unfolds the names - it took a long press before.
- The emoji offered first are the user's own: press and hold one in any other
tab to keep it in the first, press and hold it there to take it out again. It
stays where it was, and the first tab holds as many as fit.
- A recording of one's own goes out marked as a voice message (MSC3245) with
its length instead of as a plain audio file. Other clients draw it as a voice
message, and a bridge to another network can make a native voice note of it -
one of them refused everything else as an unsupported format, which read as
if the recording were broken.
- The message line says whether what is typed there will be encrypted: a
padlock before the text, struck through where the room is not, faint enough
to stay out of the way. Its three buttons are the same size and the same
weight to look at now, and the line itself is longer.
- During a video call the microphone and the hang-up sit in the lower left
corner as half-transparent symbols, out of the picture instead of across the
middle of it.
- A room list longer than fifty rooms grows when it is scrolled to its end.
Before, those fifty were all there were, with nothing saying so.
- A thread says as much about a message as the room does: the line naming what
the sender's keys do not vouch for, and the warning before sending to
somebody whose devices were never verified. Both were missing there.
- "Pin" and "Invite" are offered where the room allows them. A room that keeps
either above the ordinary member turned them into a tap whose only possible
outcome was the server's refusal.
- The account page says it when session and message database lie on the device
unencrypted, and leads to where that can be changed. It was said only on the
encryption page, which one has to go looking for.
- An attachment larger than this app will take is refused before it is
downloaded, from the size the event declares, instead of after a hundred
megabytes have been held in memory. What actually arrives is still weighed:
the sender writes that figure.
- The emoji set's checksums are SHA-256 and its list is written whole or not at
all. A set read in before this keeps working - the list says which digest it
was taken with, and one that says nothing is read the old way. A list cut
short by a crash used to read as no list at all, and the pictures were then
drawn unchecked.
- The drawn marks - the padlock, the face, the eye - survive a trip through the
tile view. They were painted into a framebuffer, and a window that leaves the
screen hands its framebuffer back; what came back was empty.
- The store key is wiped where it is held, in a way the compiler may not
optimise away, and the second copy that encoding it produces is wiped too.
- Signing out stops the watchers first. Two of them held a client of their own
and kept running afterwards, which means they held the store open while it
was being deleted.
- A session the server has thrown away is taken down instead of only reported:
everything still talking to that server stops, and the stored session goes,
so the next start shows the login page instead of a sync that can only fail.

Comments

kempertom's picture

Such great work. I have an issue: I am using matrix chat with bridges to avoid using android. Voicenotes work with xmatic with mautrix (WhatsApp bridge) and the Telegram bridge, but not for the most important Signal bridge. It says that audio format is not supported for bridging. Maybe ist is possible from xmatic side?

JimKnopfIoT's picture

Please try 0.24 and report if it's fixed for you.

Sharks's picture

Latest 0.22 update is great, very glad to see reaction support added. This now fully replaces Hydrogen for me on SFOS. Thankyou for your work!

The only feature I would still want for is an option to show the message content in notifications like an SMS notification would. Requiring to unlock the phone and open the app to see a message you may not be interested in responding to is a minor annoyance.

stiltskin's picture

seems like there is no read status for messages (sent/read)

windes's picture

Wow, man!! First impression - GREAT!  UI is smooth and nice, all balanced. Did you do UI by yourself, manually, not with AI?

 

Can't open page with user info. There's no this feature for now?

Sailfish 5.1.0.11, armv7hl - all is working)

Nice description, monumental, by the way. All questions gone right after read it. No water, strict and needed, every word.

Do you have a group of xmatic in matrix?

Sharks's picture

Looks promising! Unfortunately while I can login, I just see "Offline - Waiting for the network" glitching and flashing up the top, none of my chats get loaded.

JimKnopfIoT's picture

@Sharks Please read the new REQUIREMENTS section above and try again with the latest Version (> 0.19.0). 

Sharks's picture

It appears I am missing msc4186, thanks. Will have to look into it.

Sharks's picture

Have decomissioned my Dendrite server and spun up a Synapse one. xmatic is now working beautifully! Thanks very much. Keen to see further development, looks like a great app already.

kempertom's picture

Will it be frequently maintained? I have wishes and Ideas...

sourcrowd's picture

Thank you! With this client I'm finally able to login on a homeserver, that requires SSO for which the Firefox 91 WebView that SFOS 5.1 bundles, is too old.

kaulian's picture

Thanks a lot.

Manisak's picture

Damed I Love you ;-)

kempertom's picture

Wow. Wonderful. What are you plan to implement?