Gmail’s web interface is capable. Powerful search, labels, filters, keyboard shortcuts — Google has layered a lot onto what started as a simple inbox. But it’s still fundamentally a web application, which means it loads in a browser, it sends your activity to Google’s servers, and it shows you your email in a long, scrollable list.

cji.email connects to Gmail the same way your phone does — through IMAP — and then gets out of the browser entirely.

How the Connection Works

cji.email uses OAuth2 to authenticate with Google. You click “Add Account,” choose Google, and complete the familiar Google sign-in flow. At no point does cji.email see or store your Google password. The OAuth2 access token Google issues is stored in your operating system’s keychain — on macOS that’s the macOS Keychain, on Windows it’s the Credential Manager. The token never leaves your device.

Once authenticated, cji.email connects to Gmail’s IMAP server and begins syncing. Gmail’s IMAP implementation exposes your labels as folders, which is exactly what cji.email needs to build the Kanban board.

Gmail Labels as Kanban Columns

If you’ve used Gmail labels for any amount of time, you’ve probably noticed that they work more like tags than folders — a message can have multiple labels at once. cji.email handles this correctly: each top-level label appears as a Kanban column, and messages appear in the column corresponding to their primary label.

The labels cji.email creates or uses for its Kanban workflow are:

  • Kanboard/Open — triaged messages waiting for a first response
  • Kanboard/ToDo — messages where you owe someone something
  • Kanboard/Waiting — messages where you’re waiting on a reply
  • Kanboard/Done — resolved threads

Dragging a card between columns in cji.email applies the corresponding label in Gmail immediately. Open Gmail in a browser tab and you’ll see the label change reflected there. The sync goes both ways.

Local Processing, Not Cloud Processing

Gmail is processed on Google’s servers before it reaches you. Filters, categorization, spam detection — it all happens in Google’s infrastructure. cji.email operates on a different model.

The Rust backend syncs your email to a local cache. Search, filtering, local rules, and attachment handling all run on your machine. This has concrete implications:

  • Speed: Searching your archive doesn’t require a round-trip to Google’s servers. Results appear instantly from local indexes.
  • Privacy: Your local rule logic, your reading patterns, and your search queries stay on your device.
  • Offline access: You can read, search, and compose drafts without an internet connection. Everything syncs when connectivity is restored.

What You Don’t Lose

Connecting through IMAP means cji.email is fully compatible with everything Gmail already does. Your existing labels, your starred messages, your archived threads — they all appear correctly. Sent messages go out through Gmail’s SMTP server and appear in your Sent label on Gmail’s side. Filters you’ve set up in Gmail still run on Google’s servers before the message reaches cji.email.

The one Gmail feature IMAP doesn’t expose is Threads in the Google-specific sense, where replies are grouped regardless of subject-line changes. cji.email uses standard IMAP thread grouping based on message references and subject lines, which works correctly for the overwhelming majority of email conversations.

Getting Started

Add your Gmail account in cji.email, complete the OAuth2 sign-in, and let the initial sync run. For large Gmail accounts, the first sync can take a few minutes. After that, new messages arrive within seconds via IMAP IDLE.

Once the sync is complete, take five minutes to set up your Kanboard label hierarchy if you haven’t already. Create them in Gmail’s label settings or let cji.email create them for you when you first move a card. After that, you’ll have a Kanban board backed by your existing Gmail account — no data migration, no new email address, no lock-in.