Build and run katzenqt from source
katzenqt is the Qt group chat client. It is a decentralised
application that runs over the Katzenpost mix network and the
Pigeonhole storage services. The design is set out in the
Echomix paper.
Warning.
katzenqtis in active development and has not yet been tagged for general release. It is not appropriate to rely on the software for anonymity, security, or privacy at this stage. Pre-built packages will be linked from the docs landing once a release is cut.
Prerequisites
These instructions assume an up-to-date Debian or Ubuntu Linux system with the following packages installed:
sudo apt install -y git make libxcb-cursor0 libegl1
The Makefile does the rest: it provisions a Python virtual
environment via uv, builds
kpclientd, installs it as a systemd user service, and launches the
GUI.
Quick start
git clone https://github.com/katzenpost/katzenqt
cd katzenqt
make deps
make run
If make run opens the katzenqt window, you are ready.
Step by step (if the quick start fails)
If the two-command form does not yield a running interface, the following sequence runs each phase of the setup independently and is useful for diagnosing where things have gone awry:
make system-setup # apt-installs the system dependencies
make setup-uv # bootstraps the uv-managed venv
make setup # installs Python dependencies into the venv
make test # runs the test suite
make kpclientd # builds the kpclientd binary
make install-kpclient # installs kpclientd into ~/.local/bin
make kpclientd.service # installs the systemd user unit
make status # verifies the install
A successful make status produces something like the following:
backend: uv
venv: .venv
kpclientd(bin): /home/<user>/.local/bin/kpclientd
kpclientd(service): active
kpclientd(path): found
Once that is the case, make run should bring up the application.
Persistent state
katzenqt keeps all of its persistent data (keys, conversation logs,
BACAP capabilities, message indices) in a single SQLite file at
~/.local/share/katzenqt/katzen.sqlite3. The environment variable
KQT_STATE overrides the file name, which is useful when running two
instances on the same machine (one talking to the other):
KQT_STATE=alice make run # uses ~/.local/share/katzenqt/alice.sqlite3
Current caveats
katzenqtis currently developed against a debug branch of thekatzenpostrepository (tb/debug2025-09-21) rather than the pinned release tag listed on Build from source. This will be reconciled when akatzenqttag is cut.- A tag has not yet been published.
See also
- Build from source: pinned versions of the rest of the Katzenpost stack.
- Understanding Pigeonhole: the
storage primitive that
katzenqtuses. - The katzenqt repository:
for issues, pull requests, and the latest
README.md/HACKING.md.