A fast, local-first Gmail client built for the desktop.
Kisa caches and indexes mail locally for fast search, handles multiple Google accounts, and isolates untrusted content behind a narrow Electron security boundary.
Kisa is under active development.
Download
Download the latest release:
See the latest release for release notes and checksums.
Why Kisa
I started Kisa when Notion announced that Notion Mail will shut down on September 22, 2026. Rather than return to Gmail in a browser, I began building the fast, keyboard-first client I wanted.
- Mailbox-scale performance. Local caching, full-text search, virtualized lists, and resumable indexing keep large mailboxes responsive.
- Recoverable spam. A dedicated Spam mailbox surfaces newly classified mail without adding notifications or Inbox noise, and Not spam returns false positives to Inbox.
- Keyboard-first workflow. Switch accounts, search, compose, and navigate without the mouse.
- Privacy by default. OAuth credentials stay in the main process, and the local database is encrypted. Message HTML is isolated, and remote images are blocked until allowed.
- Built for multiple accounts. Caches, indexes, sync state, and mutations stay account-scoped, with an All Accounts view across them.
Tech stack
| Area | Technology |
|---|---|
| Desktop | Electron |
| Interface | React, TypeScript, Tailwind CSS, shadcn |
| Application runtime | Effect |
| Routing and state | TanStack Router, Zustand |
| Local data | better-sqlite3-multiple-ciphers, Drizzle ORM, FTS5 |
| Gmail integration | Gmail API client, OAuth 2.0 with PKCE |
| Tooling | pnpm, Turborepo, Vite, Vitest, Ultracite |
Architecture
Privileged capabilities stay in Electron's main process. The sandboxed renderer accesses them only through the typed window.desktopBridge; Effect Schema validates every IPC request, result, and event.
Synchronous database work runs in a utility process, keeping Electron's main thread unblocked. Gmail sync and indexing are bounded, resumable, and yield to foreground actions.
React feature or hook
-> renderer platform adapter
-> typed preload bridge
-> schema-validated Electron IPC
-> main-process service
-> Gmail API, or
-> database utility process -> SQLite
See the desktop architecture and Gmail API capabilities for details.
Repository
apps/desktop— Electron main, preload, database process, and React renderer.packages/database— database client, runtime, schemas, and migrations.packages/gmail— Gmail domain models, services, and boundaries.docs/architecture— current architecture and feature contracts.
Run from source
pnpm 12.4.2 is pinned through packageManager.
Dependency versions live in pnpm-workspace.yaml. Effect and @effect/vitest use the same stable v4 release (currently 4.0.6) with Vitest 5. Astro's checker uses the separate TypeScript 6 catalog because it requires the JavaScript compiler API. Upgrade @effect/tsgo, TypeScript, Oxlint, and oxlint-tsgolint together after checking the matching patch artifacts.
The verified lint toolchain is @effect/tsgo 0.36.5, Oxlint 1.78.0, and Ultracite 7.10.5. Newer releases require a separate React Compiler lint migration and currently flag valid TypeScript schema/type name pairs as redeclarations. Keep these versions together until they can pass the existing checks without additional suppressions.
OpenCode uses the 2.1.4 client. Scoped overrides keep its Effect peer and schema/protocol dependencies on the workspace Effect catalog. See AI writing for provider lifecycle and isolation details.
pnpm install
pnpm dev
To run only the desktop:
pnpm --dir apps/desktop dev
Development uses <userData>/database/app.dev.sqlite and its own sealed key, separate from the installed app's app.sqlite database and key.
Google authorization uses the user's own Desktop OAuth client, the system browser, PKCE, and a temporary loopback callback. Kisa does not ship shared Google credentials. Follow Connect Kisa to Google to create a personal Google Cloud project and import its credentials JSON.
Verification
Run all checks with:
pnpm check
pnpm typecheck
pnpm test
pnpm build
Packaging and releases
Build packages with pnpm build:mac, pnpm build:win, or pnpm build:linux. pnpm build:unpack creates an unpacked app.
Release by exact version or bump type:
pnpm release patch
pnpm release 0.1.0
The helper requires a clean tree, runs checks, updates apps/desktop/package.json, commits, tags, and pushes unless --no-push is supplied.
Inspiration
Kisa borrows T3 Code's narrow, typed Electron boundaries, adapted to a local-first mail client without its server and RPC layer. See the detailed comparison.
License
Kisa is MIT licensed.
