Modal-vim
email.
IMAP, SMTP, Gmail, Outlook, JMAP. One client, every inbox.
Maildir on disk. SQLite index. hjkl-powered composer.
- a ● GitHub PRkryptic-sh/inbx #42 — wire IMAP IDLE socket 2m
- s ★ Linus T. Re: Maildir layout — looks fine, ship it 14m
- d ● Fastmail JMAPYou have 3 new messages 1h
- f · cron daemon [backup] nightly snapshot complete (124 GB) 3h
- g · Stripe workReceipt for invoice #INV-2026-0418 yest
- h · rust-announce Rust 1.95.0 released — let-chains stabilized 2d
why
An email client shaped like vim, not Outlook.
Modal everything
Normal/insert/visual modes in the message list, the reader, and the composer. Real motions, real text objects, real ex commands.
Hint mode
Press f, every visible message gets a label. Type the label, you're in the thread. No j-spamming.
Multi-provider, one client
IMAP/SMTP, Gmail XOAUTH2, Microsoft Graph, JMAP. One config, every account. Provider abstracted behind a trait.
Maildir + SQLite + tantivy
On-disk Maildir per account. SQLite index in WAL mode (TUI + sync hold the DB concurrently). tantivy full-text index for search. Offline-first.
hjkl-powered composer
Composer embeds hjkl — the same modal editor. Headers and body share one FSM. MIME built with mail-builder. <Space>t opens a template picker; PGP key lookup runs inline.
Multi-folder sync · friendly names
Each cycle syncs every server folder; IMAP IDLE / JMAP push
triggers a full re-sync. [Gmail]/Trash renders as
Trash, \Noselect virtual parents hidden.
Two-line message rows: sender on top, subject below.
inbx-sync IPC daemon
Optional inbx-sync daemon (or
inbx sync subcommand) runs the IDLE / fetch /
indexing loop out of process. TUI auto-detects via unix-socket
IPC; falls back to in-process sync when the daemon isn't running.
CalDAV + CardDAV + Sieve
Two-way CalDAV via inbx cal put|delete|rsvp. CardDAV
auto-push on contact upsert. ManageSieve overlay caches the
session across list/get/put. Etag-aware delta fetches.
PGP — gpg or local keys
Per-account pgp.key_source picks between the system
GnuPG keyring or inbx-managed keys on disk. Composer signs and
encrypts inline.
TLS or nothing
Implicit TLS or STARTTLS only. Never falls through to plaintext. Remote content blocked by default. HTML sanitized via ammonia. Keyring backend selected per platform — no mock-keystore fallback.
providers
Whatever you use, inbx talks to it.
/me/messages,
/me/sendMail) tomorrow. Tenant-aware.
install
Prebuilt binaries on every tagged release.
macOS via Homebrew tap, Arch via AUR, Alpine .apk, or grab a prebuilt binary. Linux (x86_64) — .tar.gz. macOS (Apple Silicon) — .tar.gz. Windows (x64) — .zip. SHA-256 sidecars on every artifact. More targets land as the workspace stabilises.
$ brew install kryptic-sh/tap/inbx $ inbx
$ yay -S inbx-bin $ paru -S inbx-bin # installs inbx + inbx-sync to /usr/bin/, auto-tracks tagged releases
$ # download .apk from releases page, then: $ apk add --allow-untrusted inbx-*.apk $ inbx
$ git clone https://github.com/kryptic-sh/inbx $ cd inbx $ cargo build --release # binaries in target/release/{inbx,inbx-sync}