No description
  • Rust 67.3%
  • Vue 18.5%
  • TypeScript 13.6%
  • Just 0.2%
  • Kotlin 0.2%
  • Other 0.1%
Find a file
Micke Nordin 4cb9f087f2
fix(mail): add configurable sender full name (#296)
* fix(mail): add configurable sender full name

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-08-28 17:16:38 +02:00
.cargo deps: resolve current cargo-audit findings 2026-07-20 14:58:38 +02:00
.github/workflows test(mail): add EAI message parser fixtures 2026-08-07 11:30:44 +02:00
docs fix: resize HTML mail reader and add portable AppImage build 2026-08-24 12:45:43 +02:00
src fix(mail): add configurable sender full name (#296) 2026-08-28 17:16:38 +02:00
src-tauri fix(mail): add configurable sender full name (#296) 2026-08-28 17:16:38 +02:00
tests/fixtures test(mail): add EAI message parser fixtures 2026-08-07 11:30:44 +02:00
web feat(meet): add La Suite Visio integration (#294) 2026-08-28 15:15:08 +02:00
.dockerignore refactor: switch to container-based packaging (tugpgp style) 2026-04-12 09:31:15 +02:00
.gitignore docs(site): mkdocs scaffold for chithi.org with Zoom OAuth bounce 2026-05-10 12:10:51 +02:00
.gitmodules test(mail): add EAI message parser fixtures 2026-08-07 11:30:44 +02:00
Dockerfile.android ci(android): dockerfile for reproducible APK builds 2026-04-20 16:47:10 +02:00
Dockerfile.appimage fix: resize HTML mail reader and add portable AppImage build 2026-08-24 12:45:43 +02:00
Dockerfile.arch fix(packaging): add PC/SC deps to Linux package builds 2026-07-17 00:19:18 +02:00
Dockerfile.deb fix(packaging): add PC/SC deps to Linux package builds 2026-07-17 00:19:18 +02:00
Dockerfile.rpm fix(packaging): add PC/SC deps to Linux package builds 2026-07-17 00:19:18 +02:00
index.html feat: chithi 2026-04-05 07:06:20 +02:00
justfile fix: resize HTML mail reader and add portable AppImage build 2026-08-24 12:45:43 +02:00
LICENSE add: license 2026-04-08 12:20:19 +02:00
mkdocs.yml docs(meet): documetn remaining integrations 2026-08-28 12:46:23 +02:00
package-lock.json Add more logging (#187) 2026-05-22 15:44:54 +02:00
package.json chore(deps-dev): bump vite from 8.0.7 to 8.0.16 2026-06-16 01:36:39 +00:00
pnpm-lock.yaml chore(deps-dev): bump vite from 8.0.7 to 8.0.16 2026-06-16 01:36:39 +00:00
README.md feat(meet): add La Suite Visio integration (#294) 2026-08-28 15:15:08 +02:00
SECURITY.md ci: add GitHub Actions workflows and security policy (#62) 2026-04-18 16:44:48 +02:00
tsconfig.json test(menu): assert app version from package.json directly 2026-04-26 20:34:57 +02:00
vite.config.ts feat(menu): compose-window menus + shortcuts (ADR 0044 phase 3) 2026-04-26 20:34:57 +02:00

Chithi

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).

Why?

Need a client with first class support for OpenPGP. Also allowing doing Calendar in the application without a plugin :)

Features

  • 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, Zoom, and La Suite Visio meeting integration
  • Dark and light themes

Zoom OAuth scopes

Chithi requests these four Zoom scopes for its user-managed meeting integration:

  • meeting:write:meeting
  • meeting:update:meeting
  • meeting:delete:meeting
  • user:read:user

See the complete Zoom end-user guide for setup, usage, troubleshooting, and removal. The Zoom Marketplace test plan maps each scope to its user action and REST endpoint.

Prerequisites

  • Rust (stable toolchain)
  • Node.js (v20.19.x or v22.12+)
  • pnpm (v10; the repository pins the exact version)

System Dependencies

Arch

  sudo pacman -S --needed \
    base-devel \
    openssl \
    dbus \
    gtk3 \
    webkit2gtk-4.1 \
    libayatana-appindicator \
    pcsclite \
    librsvg \
    curl \
    wget

Debian / Ubuntu

sudo 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 \
  wget

Fedora

sudo 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 \
  wget

macOS

xcode-select --install
brew install openssl

Tauri uses the built-in WebKit framework on macOS. The keyring crate uses the native Keychain — no extra dependencies needed.

Build & Run

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 build

The release binary will be in src-tauri/target/release/.

Running Tests

# Frontend tests (Vitest)
pnpm test

# Rust backend tests
cd src-tauri && cargo test

# Type-check frontend
pnpm exec vue-tsc --noEmit

Data Storage

Desktop 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.

Architecture

  • Frontend: Vue 3 + TypeScript + Pinia (in src/)
  • Backend: Rust + Tauri v2 (in src-tauri/)
  • Mail: IMAP via imap crate, JMAP via raw reqwest HTTP
  • Sending: SMTP via lettre (IMAP accounts), JMAP Submission (JMAP accounts)
  • Calendar: JMAP Calendar + CalDAV via reqwest + uppsala XML parser
  • Storage: Maildir on disk + SQLite index, passwords in OS keyring

See docs/adr/ for Architecture Decision Records.

To enable usage in your work/school O365

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 users 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`

License

GPL-3.0-or-later