quotient-im / Quaternion

A Qt-based IM client for Matrix
https://matrix.org/ecosystem/clients/quaternion/
GNU General Public License v3.0
648 stars 108 forks source link
c-plus-plus chat chat-application client hacktoberfest matrix qt qt5

Quaternion

status release OpenSSF Best Practices CI builds hosted by: Cloudsmith

Quaternion is a cross-platform desktop IM client for the Matrix protocol. You can find general information about application usage and settings here. See BUILDING.md for building instructions.

Contacts

Most of talking around Quaternion happens in the room of its parent project, Quotient: #quotient:matrix.org. You can file issues at the project's issue tracker. If you find what looks like a security issue, please follow special instructions.

Downloading and installing

The recommended way to install Quaternion is as follows (make sure to read the notes below depending to your environment):

The source code is hosted at GitHub.

Requirements

Quaternion 0.0.97 needs Qt version 6.4 or higher.

Linux

Quaternion is packaged for many distributions, including various versions of Debian, Ubuntu and OpenSUSE, as well as Arch Linux, NixOS and FreeBSD. A pretty comprehensive list can be found at Repology. Popular distributions satisfying the mentioned Qt requirement are Debian 12 (Bookworm), Ubuntu 24.04 (noble), Fedora 39, OpenSUSE Leap 15.6; anything newer than that should be fine, too.

On top of the Quaternion package, you should not normally need to install anything in addition; if something is not working due to a missing dependency, it's a bug in the package - please report it to your distribution's Quaternion packager, not to this repository.

There are also flatpaks for Quaternion available from Flathub. To install, use:

flatpak install https://flathub.org/repo/appstream/com.github.quaternion.flatpakref

These packages are built with a suitable KDE runtime. You can install them on any distribution that has Flatpak - even if it's older than mentioned above. Please file issues at https://github.com/flathub/com.github.quaternion if you believe there's a problem specific to the Flatpak package of Quaternion.

Windows

Since there's no established package management on Windows to resolve dependencies, all needed libraries and a C++ runtime are packaged/installed together with Quaternion - except OpenSSL. Unless you already have OpenSSL around (e.g., it is a part of any Qt development installation), you should install it yourself. OpenSSL's Wiki lists a few links to OpenSSL installers. They come in different build configurations; current Quaternion builds need OpenSSL 3.x made with/for Visual Studio (not MinGW).

macOS

If you use Homebrew (you should!), brew install quaternion installs Quaternion along with its dependencies. Otherwise, packages published at GitHub Releases come with everything necessary already bundled.

Development builds

Thanks to generous and supportive folks at Cloudsmith who provide free hosting to OSS projects, those who want to check out the latest (not necessarily the greatest, see below) code can find packages produced by continuous integration (CI) in the Quaternion repo there.

A few important notes on these packages in case you're new to them:

If you want to build Quaternion from sources, see BUILDING.md.

Running

Just start the executable in your most preferred way - either from the build directory or from the installed location. If you're interested in tweaking configuration beyond what's available in the UI, read the "Configuration" section further below.

Translation

Quaternion uses Lokalise.co for the translation effort. It's easy to participate: join the project at Lokalise.co, ask to add your language (either in #quotient:matrix.org or in the Lokalise project chat) and start translating! Many languages are still longing for contributors.

Configuration

The only non-trivial command-line option available so far is --locale - it allows you to override the locale Quaternion uses (an equivalent of setting LC_ALL variable on UNIX-based systems). Version 0.0.96 comes with German, Russian, Polish, and Spanish translations.

Quaternion stores its configuration in a way standard for Qt applications, as described below. It will read and write the configuration in the user-specific location (creating it if non-existent) and will only read the system-wide location with reasonable defaults if the configuration is not found at the user-specific one.

ALL settings listed below reside in UI section of the configuration file or (for Windows) registry.

Some settings exposed in the user interface (Settings and View menus) are:

Settings not exposed in UI:

Quaternion uses Qt Keychain to store access tokens and database pickles. If the secure storage supported by Qt Keychain is not available, Quaternion will not be able to store your access token(s) and pickles and will automatically disable E2EE to avoid unrecoverable encrypted messages. The fallback file used by Quaternion pre-0.0.96 is no more used.

Quaternion caches the rooms state and user/room avatars on the file system in a conventional location for your platform, as follows:

Cache files are safe to delete at any time but Quaternion only looks for them when starting up and overwrites them regularly while running; so it only makes sense to delete cache files when Quaternion is not running. If Quaternion doesn't find or cannot fully load cache files at startup it downloads the whole state from Matrix servers. It tries to optimise this process by lazy-loading room members if the server supports that; in an unlucky case when the server cannot do lazy-loading, initial sync can take much time (up to a minute and even more, depending on the number of rooms and the number of users in them).

Deleting cache files may help with problems such as missing avatars, rooms stuck in a wrong state etc.

Troubleshooting

Quaternion uses libQuotient under the hood; some Quaternion problems are actually problems of libQuotient. If you haven't found your case below, check also the troubleshooting section in libQuotient README.md.

Older messages don't get decrypted in E2EE rooms

Unfortunately, this is a limitation in the current libQuotient code: it doesn't request older keys and therefore cannot decrypt older messages. Check issue 608 for the progress on this.

No messages in the timeline

If Quaternion runs but you can't see any messages in the chat (though you can type them in) - you might not have Qt Quick libraries and/or plugins installed. On Linux, this may be a case when you are not using the official packages for your distro. Check the stdout/stderr logs, they are quite clear in such cases. On Windows, Mac, and when using Flatpak, just open an issue (see "Contacts" in the beginning of this file) because most likely not all necessary Qt parts were packaged along with Quaternion.

SSL problems

Especially on Windows, if Quaternion starts up but upon an attempt to connect returns a message like "Failed to make SSL context" - correct SSL libraries are not reachable by the Quaternion binary. Re-read the chapter "Requirements", section "Windows" in the beginning of this file and do as it advises (make sure in particular that you use the correct version of OpenSSL - it should be 3.x, not 1.x).

Logging

If you want to see log messages in the command-line console (by default, they are sent to system log on Windows and some but not all Linux systems with journald), set QT_ASSUME_STDERR_HAS_CONSOLE=1 to force the output to be redirected to the console.

When chasing bugs and investigating crashes, it helps to run Quaternion from the command line with increased logging level. Both libQuotient and (since 0.0.96 beta 4) Quaternion use logging categories to allow fine-grained switching of logs for a given part of the code. Quaternion and libQuotient use different categories; this text only describes those for Quaternion, make sure to also check lib/README.md for libQuotient logging categories. The most practical way to configure logging in order to debug a problem is via the QT_LOGGING_RULES environment variable; the Qt documentation (see the link above) lists a few other methods. In all cases, you need to provide one or several clauses that look as follows:

quaternion.<category>.<level>=<flag>

where

Bear in mind that all logging categories for Quaternion start with quaternion while logging categories for libQuotient always start with quotient.

You can use * (asterisk) as a wildcard for any part between two dots, and a semicolon is used for a separator. Latter statements override former ones, so if you want to switch on all debug logs except timeline.qml you can set

QT_LOGGING_RULES="quaternion.*.debug=true;quaternion.timeline.qml.debug=false"

You may also want to set QT_MESSAGE_PATTERN to make logs slightly more informative (see https://doc.qt.io/qt-6/qtlogging.html#qSetMessagePattern for the format description). My (@kitsune's) QT_MESSAGE_PATTERN looks as follows:

`%{time h:mm:ss.zzz}|%{category}|%{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}|%{message}`

(the scary %{if}s are just encoding the logging level into its initial letter).

Screenshot

Screenshot1 Screenshot2