Linux (Qt MVP)
There is an experimental Qt6/QML client in linux/ that talks to the same
durian serve HTTP API as the macOS GUI. It is read-only today —
search, sidebar, thread view, attachment download. No compose, no reply,
no tag actions.
The macOS GUI is the supported client. The Linux build exists to evaluate Qt as a long-term Linux story and to keep the CLI honest about its API contract.
Status
| macOS (SwiftUI) | Linux (Qt6) | |
|---|---|---|
| Read mail | ✅ | ✅ |
| Search | ✅ | ✅ |
| Profiles / folders | ✅ | ✅ |
| Attachments (download) | ✅ | ✅ |
| Compose / reply | ✅ | ❌ |
| Tag actions | ✅ | ❌ |
Auto-launches durian serve | ✅ | ❌ (manual) |
| Bearer-token auth handshake | ✅ | ❌ (uses --no-auth) |
Build
Install Qt6 plus the pkl CLI (used at runtime to read profiles.pkl /
config.pkl):
# Fedora / KDE
sudo dnf install qt6-qtbase-devel qt6-qtdeclarative-devel qt6-qtwebengine-devel
brew install pkl # or your distro's pkl package
# Ubuntu / Debian
sudo apt install qt6-base-dev qt6-declarative-dev qt6-webengine-dev
# Arch
sudo pacman -S qt6-base qt6-declarative qt6-webengineThen build with Bazel:
export QTDIR=/usr # Fedora/Debian
# export QTDIR=$(brew --prefix qt@6) # macOS / Linuxbrew
bazel build //linux:durian --repo_env=QTDIR=$QTDIRRun
The Linux GUI does not auto-start durian serve and does not yet
implement the bearer-token handshake the macOS GUI uses. You need to start
the server yourself, with --no-auth:
durian serve --no-authThen in another shell:
bazel run //linux:durian --repo_env=QTDIR=$QTDIRLoopback-only access is still enforced. See the CLI serve docs for the trade-off.
Roadmap
If the Linux client graduates beyond MVP, the obvious next steps are:
- Auto-spawn
durian serveand capture theREADYline, like the macOS GUI does (drops the--no-authrequirement). - Compose / reply via the existing
/outboxAPI. - Tag actions and folder moves via
/threads/{id}/tags.
The architecture already supports all three — both clients hit the same HTTP API; only the Qt-side wiring is missing.