A desktop email, calendar, and contacts client built with Tauri v2 (Rust) and Vue 3 (TypeScript).
Supports IMAP, SMTP, JMAP, CalDAV, and CardDAV with a Thunderbird-style three-pane layout. On desktop, passwords are stored in the system keyring (Secret Service, macOS Keychain, or Windows Credential Manager).
Need a client with first class support for OpenPGP. Also allowing doing Calendar in the application without a plugin :)
- Multi-account support for Gmail, Microsoft 365, Fastmail, IMAP, JMAP, CalDAV, and CardDAV
- Email threading with In-Reply-To and subject-based fallback
- Calendar with day/week/month views, recurring events, and meeting invite handling
- Accept/Maybe/Decline meeting invites from email with iTIP replies
- Client-side message filtering rules
- HTML email sanitization (no scripts, no remote content by default)
- OpenPGP signing and encryption, including smartcard support
- Nextcloud Talk, Matrix / Element Call, and Zoom meeting integration
- Dark and light themes
- Rust (stable toolchain)
- Node.js (v20.19.x or v22.12+)
- pnpm (v10; the repository pins the exact version)
sudo pacman -S --needed \
base-devel \
openssl \
dbus \
gtk3 \
webkit2gtk-4.1 \
libayatana-appindicator \
pcsclite \
librsvg \
curl \
wgetsudo apt update
sudo apt install -y \
build-essential \
pkg-config \
libssl-dev \
libdbus-1-dev \
libgtk-3-dev \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
libpcsclite-dev \
librsvg2-dev \
curl \
wgetsudo dnf install -y \
gcc gcc-c++ make \
pkg-config \
openssl-devel \
dbus-devel \
gtk3-devel \
webkit2gtk4.1-devel \
libappindicator-gtk3-devel \
librsvg2-devel \
curl \
cargo \
pnpm \
pcsc-lite-devel \
wgetxcode-select --install
brew install opensslTauri uses the built-in WebKit framework on macOS. The keyring crate uses the native Keychain — no extra dependencies needed.
git clone https://github.com/SUNET/chithi.git
cd chithi
# Install frontend dependencies
pnpm install
# Run in development mode (hot-reload frontend + Rust backend)
pnpm tauri dev
# Build a release binary
pnpm tauri buildThe release binary will be in src-tauri/target/release/.
# Frontend tests (Vitest)
pnpm test
# Rust backend tests
cd src-tauri && cargo test
# Type-check frontend
pnpm exec vue-tsc --noEmitDesktop application data is stored below the platform's local data directory:
| Platform | Base directory |
|---|---|
| Linux | ${XDG_DATA_HOME:-$HOME/.local/share}/chithi/ |
| macOS | ~/Library/Application Support/chithi/ |
| Windows | %LOCALAPPDATA%\chithi\ |
Linux honors XDG_DATA_HOME. The exact macOS and Windows locations
should be verified with packaged builds. Within the base directory,
chithi.db is the SQLite database,
chithi.log is the log, and each mail account has its own directory.
Desktop passwords and OAuth tokens are stored separately in the system
keyring. See the data-removal guide before
deleting data manually.
- Frontend: Vue 3 + TypeScript + Pinia (in
src/) - Backend: Rust + Tauri v2 (in
src-tauri/) - Mail: IMAP via
imapcrate, JMAP via rawreqwestHTTP - Sending: SMTP via
lettre(IMAP accounts), JMAP Submission (JMAP accounts) - Calendar: JMAP Calendar + CalDAV via
reqwest+uppsalaXML parser - Storage: Maildir on disk + SQLite index, passwords in OS keyring
See docs/adr/ for Architecture Decision Records.
Ask the admin to allow the application for permissions.
App details:
- Name: chithi
- Type: Public desktop client
- Auth flow: OAuth 2.0 Authorization Code with PKCE
- Redirect URI: http://localhost
- Client Application ID: b5941cd4-0385-40f1-953a-2c3b36f2a331
Access model:
- Delegated permissions only
- Access is limited to the signed-in user’s own mailbox, calendars, shared calendars, and contacts
- No client secret is stored on the device
- On desktop, OAuth tokens are stored locally in the OS keyring
Requested permissions:
- Microsoft Graph: `User.Read`, `Mail.ReadWrite`,
`Calendars.ReadWrite`, `Contacts.ReadWrite`, `Place.Read.All`
- Outlook: `IMAP.AccessAsUser.All`, `SMTP.Send`
- Sign-in: `offline_access`, `openid`, `profile`, `email`
GPL-3.0-or-later