Project · 05 / 05
Tern
Mail that never waits on the network
Why Tern
local firstEverything on screen comes from a SQLite database on the device, so lists, threads and search never wait on the network. Searching a common word across 50,000 messages takes 2.5 ms. Changes are made locally first: archive, move, star and send wait five seconds before reaching the server, z takes them back, and a send that may already have gone out is never retried on its own.
System Architecture
rust engine & tauri shellA Rust engine, tern-core, keeps the mailbox in SQLite: the schema, the list, thread and search queries, and an outbox that holds each change through its undo window. One sync worker per account speaks IMAP through io-imap, with IDLE for new mail, QRESYNC so an unchanged folder costs one round trip, and headers before bodies, and sends over SMTP. Both run on rustls; nothing links OpenSSL. A Tauri 2 shell hands the engine to a SolidJS interface: a virtualized list, the conversation view, compose and the command bar. Passwords live only in the OS keyring, and mail HTML renders in a sandboxed frame with no scripts and remote content blocked until you load it.
Interface
9 screens · drag or scroll to previewSpecifications
stack & status- Source
- Public — nedimperva/tern
- Built with
- Rust, Tauri 2, SolidJS, SQLite, IMAP