Nico, one of the Nheko client maintainers, discusses the state of the project and shares various opinions about Matrix, chat clients, physics, the local weather and so on.
Here’s your weekly spec update! The heart of Matrix is the specification - and this is modified by Matrix Spec Change (MSC) proposals. Learn more about how the process works at https://matrix.org/docs/spec/proposals.
In terms of Spec Core Team MSC focus for this week, MSC1960 will be the only one on the list. The two MSCs from last time will be put aside for this week while we focus on implementation.
Dept of GSoC 🎓️
Nheko(GSoC)
Nheko is a desktop client using Qt, Boost.Asio and C++17. It supports E2EE (with the notable exception being device verification for now) and intends to be full featured and nice to look at
This week we added some more federation readers to matrix.org which should noticeably improve federation lag.
Patrick has continued on with the async/await-a-thon and we are starting to enter the home stretch. Of the things we care about only runInteraction remains. Once done we can get on with profiling the main process.
On the sharding side the last big milestone is to get the event persister to shard. I know this comes up every week, but we now have a rough working implementation for non-backfilled events. Next steps are to get backfill working, get the tests passing, go through review and then ship. I asked Erik if it would be live on matrix.org within 2 weeks. He didn’t say, at least I didn’t hear him say no…>
Aside from that Rich is working on the push rules redesign, the next steps are to design the APIs in more detail and then make a formal spec proposal. Brendan is also in notifications land and his work on room unread counts is going through final review.
Finally, Andrew has been working with Sorunome to dust off the knock feature, both on the spec and the Synapse side.
Romeo and Juliet benchmark to compare Matrix server implementations
This week I created the first(?) Matrix server benchmark and ran it on Synapse, Dendrite and Conduit. The test will go through the entire Romeo and Juliet play and create users for each character and sends messages for each line they say.
The results are very interesting:
Synapse:
timo neilalexander Half-Shot
# default (sqlite)
time 5m0.870s
# postgres:
time 1m46.319s 1m8s
Dendrite:
# default (sqlite)
time 6m8.802s 0m38.502s
# postgres:
time 2m45.387s 0m53.691s
Conduit:
# default (sled)
time 0m4.184s 0m2.776s 0m2.935s
There is some question here about how federation and state resolution will affect performance on these tests.
Synapse Deployment 📥️
There is rather a lot in this section this week (see also Ops 🛠 section below.) I’ll consider making this a more structured (table?) feature in future.
Hello! Just recently I made public an SELinux policy module I developed for Synapse. This policy is one I developed early on during my trip down the SELinux rabbit hole, and I have been using it in production for some time. At the moment, this policy module is built for the Gentoo SELinux policy (not RHEL/CentOS/Fedora) and does not currently have systemd support, nor has it been tested in all environments, i.e. with workers. I am publishing this policy in the hopes that it will be useful and I am open to any contributions, even those to help tighten the policy if possible. Finally, I have also made public a policy module for coturn, which I am also using in my own personal environment under the same conditions. Both the Synapse policy and the coturn policy can be found on Github. Thank you!
The ansible collection famedly.matrix has seen another release, 0.1.2, which updates the element role to 1.7.4 and the synapse role to 1.19.0. As always, get it from Ansible Galaxy, source from Gitlab, and for any questions join #ansible:famedly.de.
Just pushed the 1.19 tags for the K8s-optimized Synapse image, as well as an updated chart version for it that also takes advantage of the added /health endpoint.
As channels are really popular in Telegram, I wrote a quick and dirty program/bot which can mirror (text and image) public Telegram channels to Matrix rooms. This should make it easier for Telegram users to consider a switch.
Making the rooms read-only via permissions prevents messages from users.
It provides a good basis for someone trying to make a real 1to1 mirror. Please fork this project and host some channels publicly ;)
This project is functionally quite different from the more established mautrix-telegram: it is purely designed to mirror content from Telegram public rooms.
Hello all, I’m going to be quick off the mark and announce matrix-appservice-irc release 0.20.1! This release contains a ton of bug fixes and quality of life changes that you never knew you were missing. Please update and report back in the usual channels as always. Thanks!
Dept of Clients 📱
Nheko
Nheko is a desktop client using Qt, Boost.Asio and C++17. It supports E2EE (with the notable exception being device verification for now) and intends to be full featured and nice to look at
I’ve been working on trying to finish the event store (when I wasn’t distracted by video calls with some people). This should allow limited offline use and reduce memory use as well as allow some other features in the future. If you want to try it out, you can build this PR or try out the nightlies with new-event-store in their name.
If you decide to try it out, backup your cache or at least BACKUP YOUR ENCRYPTION KEYS! I won’t be responding to feedback immediately, since I am currently hiking, but I should get to it this weekend or next week. Come discuss it in #nheko:ocean.joedonofry.com, if you have some feedback or issues.
We are still fixing issues on Element Android. Hopefully we will release version 1.0.5 of the application and of the Matrix SDK in the coming days!
later, fidèle à sa parole:
Element Android 1.0.5 has been published on the beta channel of the PlayStore. If everything is fine it will be pushed to production next week. I’ve also published SDK v1.0.5, and push translations of the PlayStore home page of Element to German, Chinese, English US, Hungarian, Portuguese (Brazil), Russian, Slovak, Swedish and Ukrainian.
This week, we improved customisation for forks. We add possibility to customize default HTTP headers (like “User-Agent”) and improve login and room settings screens customisation. We started to improve project documentation. We also made some fixes like fixing registration validation link in email.
Updated various links and strings for the new brand
Renewed Windows code signing cert
Removed rebranding toast
All cross-signing keys now shared with other devices during verification
This week
Mode to require secure backup during registration
Continue work on deferred cross-signing setup
Light weight Hydrogen client continues, adding key features and design tweaks
Notifications continues in background while push rules evolve
Matrix.to link previews in progress
Hydrogen
Hydrogen is a web-based client designed to be very lightweight, and with few dependencies.
Anyone who wants to discuss Hydrogen can join #hydrogen:matrix.org.
avatars and display names in the timeline and for rooms
implemented the logic for the member list, but no UI for this yet
room list sorting by last message timestamp, unread state and badge count
clear unread state when reading a room
some visual tweaks in the timeline and room list
bug fixes
If you have checked out hydrogen before, you’ll need to clear your session (the little clear button in the session picker) to get correct avatars and display names everywhere.
Next week I’ll get started on E2EE, which should make the project a lot more useful. I’ll look into leveraging the nice rust matrix-crypto-sdk for this.
Mirage 0.6.1
miruka hit us with a late breaking update about Mirage!
Mirage 0.6.1 was released today:
Added
SSO authentication support
Homeserver browser:
To add a new account, you will be asked first to pick one of the
listed public server (list data from anchel.nl) or to manually enter a server address
Typing in the server address field will also filter the public server list,
Up/Down or (Shift+)Tab and Enter can be used to navigate it by keyboard
If the address doesn’t have a scheme://, auto-detect whether the server
supports HTTPS or only HTTP
Use the .well-known API if possible to resolve domains to the actual
homeserver’s URL, e.g. matrix.org resolves to
https://matrix-client.matrix.org
The server address field will remember the last homeserver that was
connected to
Room members autocompletion:
Type @ followed by one or more characters in the composer,
or one or more characters and hit (Shift+)Tab to trigger username/user ID
autocompletion
Only autocompleted names will be turned into mentions, unlike before
where any word in a sent message that happened to be someone’s name would
mention them
Full image viewer for matrix image messages and URL previews:
Click on a thumbnail in the timeline to open the image viewer
Middle click on a thumbnail (or use the option in the context menu)
to open the image externally
Left click on the image (mouse only): expand to window size if the
image’s origin size is smaller than the window,
else expand to original size
Tap on the image (touch screen/pen only): reveal the info and button bars
when auto-hidden (bars will auto-hide only when they overlap with a big
enough displayed image)
Any mouse movement: reveal auto-hidden bars
Double click on the image: toggle full screen
Middle click anywhere: open externally
Right click anywhere: close the viewer, back to chat
Drag when displayed image is bigger than window to pan
Wheel to pan up/down, hold shift or alt to pan left/right
Ctrl+wheel to control zoom
Buttons to control rotation, scale mode, full screen, GIF play/pause
and GIF speed
New keyboard shortcuts are available for all these actions,
see keys.imageViewer in the config file (will be automatically updated
when you start Mirage 0.6.1)
Add media.openExternallyOnClick setting to swap the new
click and middle click on thumbnails behavior
Room and member filter fields now support (Shift+)Tab navigation, in addition
to Up/Down
Add a colored left border to the currently highlighted item in list views
(e.g. room list, members list, etc) to improve visibility
Themes:
Add controls.listView.highlightBorder and
controls.listView.highlightBorderThickness properties (can be set to 0)
Add the chat.userAutoCompletion section
Changed
Messages context menu:
Use a cleaner icon for the “Copy text” entry
Replace the confusing broken “Copy media address” entry with:
Copy media address: visible for non-encrypted media, always
copies the HTTP URL
Copy local path: always visible for already downloaded media, even if
they were downloaded before mirage was started
The openMessagesLinks keybind (default Ctrl+O) is renamed to
openMessagesLinksOrFiles and can now also open media message files
Using the openMessagesLinksOrFiles keybind on a reply will now ignore the
matrix.to links contained in the “In reply to XYZ” header
Pressing Ctrl+C to copy selected/highlighted non-encrypted media messages
will copy their HTTP URL instead of the filename
Retry downloading image thumbnails if they fail with a 404 or 500+ server
error (uploads sometimes take a few seconds to become available on the
server)
Non-encrypted media messages are now always downloaded on click and opened
with a desktop application (or the image viewer), instead of
being opened in a browser
Compress thumbnails and clipboard images in a separate process, to avoid
blocking every other backend operation while the compression is running
Reduce the level of optimization applied to clipboard images,
the previous setting was too slow for large PNG (10MB+)
Increase applied scrolling velocity when using the
scrollPageUp/scrollPageDown keybinds, now similar to how it was before
Mirage 0.6.0
Don’t catch SIGQUIT (Ctrl+\ in terminal) and SIGTERM signals, exit immediately
Slightly increase the top/bottom padding to the multi-account bar in the
left pane
Dependencies: minimum nio version bumped to 0.15.0
We wanted to take a little bit of time to show off a state resolution library for Ruma, courtesy of @DevinR528 and @Timo. Ruma has a new crate to make resolving state easier, state-res! The goal of this crate is to be the base for federation, it provides the necessary utilities to resolve state, sort power events (reverse topological ordering), sort events (based on mainline depth), and a lot of event authentication functions. It is still in the early stages of development, but will be hopefully proved out in Conduit.
Other things that happened this week:
Added the invite endpoints from the Federation API
Started requiring strong types for event-sending endpoints
Augmented error types with error-specific fields (see the livestream here)
SSSS and cross-signing are slowly making their way to mautrix-go! A WIP PR exists for both features and is being developed upon. This will allow any clients that use the library to eventually be able to use SSSS and verify the trustworthiness of other devices based on cross-signing.
Device verification was merged to neb! It needs human intervention to approve that the SAS match, of course.
A new service called “cryptotest” was added that allows other clients to exchange e2e-related events with neb to test their capabilities (such as encryption, room key forwarding, SAS verification)
Residents of Germany can apply for the Prototype Fund until the end of September. They are looking for new open source ideas or features and fund about 20 projects twice a year with 47,500 EUR for six months (starting in April for this round).
Previously funded chat-related projects include Briar and OpenPush.
It would be great to see a project building on Matrix.
Dept of Ping 🏓
Here we reveal, rank, and applaud the homeservers with the lowest ping, as measured by pingbot, a maubot that you can host on your own server. Join #ping:maunium.net to experience the fun live, and to find out how to add YOUR server to the game.
Rank
Hostname
Median MS
1
fairydust.space
345
2
maescool.be
865
3
chatserver.ca
985
4
nuclearlimes.co.uk
1206
5
utzutzutz.net
1826
6
nct08.de
1885
7
kapsi.fi
1994.5
8
mailstation.de
2324
9
envs.net
4053
10
kittenface.studio
4076
That’s all I know 🏁
See you next week, and be sure to stop by #twim:matrix.org with your updates!
The Foundation needs you
The Matrix.org Foundation is a non-profit and only relies on donations to operate. Its core mission is to maintain the Matrix Specification, but it does much more than that.
It maintains the matrix.org homeserver and hosts several bridges for free. It fights for our collective rights to digital privacy and dignity.