Release Notes - v1.0.8
Overview
v1.0.8 is a large performance, sync, and security release. The IMAP layer was rebuilt around a warm connection pool with IDLE push and aggressive timeouts, inbox history now syncs by message count instead of a fragile date cutoff, and the decrypt/render path was parallelized and cached so threads paint progressively instead of blocking on a full batch. Alongside the speedups, private keys and email passwords no longer touch the frontend at all, spam handling became provider-aware, and a class of IMAP parser crashes on refresh was fixed.
What's New
⚡ Faster, More Reliable IMAP Sync
- New IMAP connection pool with per-operation timeouts and IDLE push for near-instant new-mail delivery on the active account
- Inbox history now syncs by message count (
sync_initial_count/sync_max_scan, configurable per folder) instead of a date cutoff that silently clipped older mail - Backward UID pagination ("fetch older") with infinite scroll replaces the old Load More buttons on inbox and sent
- Scroll and bootstrap windows are prefiltered server-side instead of fetching every message body, and date-fetch on scroll was cut to a single UID
- Gap-fill now examines each UID once and watermarks it, instead of rescanning the whole inbox on every refresh; the Refresh button fills gaps and tab switches auto-sync new mail
- Multiple IMAP folders can be selected for inbox refresh, with provider-aware default folders
🚀 Faster Decryption & Rendering
- Thread email decryption is parallelized; inbox, sent, and thread cards render progressively as each message finishes instead of waiting for the whole batch
- Process-wide caches for glossia detect/decode, armor parsing, and subject decode; eager glossia decode skipped for NIP-44
- Attachments lazy-load with an
attachment_countbadge rather than being fetched up front - Glossia submodule bumped for a cached wordlist tree, speeding up DM and email decoding
- "Decrypting…" placeholders and skeleton rows show on encrypted content until decryption completes
🗂️ Smarter Spam & Folder Handling
- Provider-aware default inbox folders;
*spam*/*junk*/*bulk*folders auto-discovered and kept out of the main inbox - Automated spam rescue for nostr mail, gated on transport auth and using
\Seenas intent - New "Move to folder" action for inbox emails and in the conversation view, with robust server-truth folder moves
- "Auto-file Nostr Mail" setting (default off, opt-in), scoped to INBOX only
- Read state now syncs with the IMAP
\Seenflag in both directions
📎 Attachments
- Fixed Android attachment downloads; added Download and Share buttons
- Fixed inbox attachment download for self-authored mail
- Attachments render inline inside thread/conversation cards
What's Fixed
🐛 IMAP Parser Desync Crash
- Fixed a parser desync that could crash the app on inbox refresh
- Fixed
gap_filltreating the entire non-nostr inbox as recoverable gaps require_signaturedrops are now recoverable when the setting is toggled off
🔒 Security Hardening
- Private keys are no longer persisted to the frontend — they live only in the OS-native keychain
- Email passwords are no longer written to
localStorage - Removed private-key QR logging; revealing the private-key QR now requires explicit confirmation
- Verbose
[RUST]/[RUST-PERF]andget_emaillogging gated behindNOSTR_MAIL_DEBUG
💬 Direct Messages
- NIP-17 DMs deduplicated by rumor id, with legacy duplicates collapsed and content-addressed dedup at insert time
- Conversation loading paginated with lighter contact-list previews
🎨 UI
- Sidebar shows the real bundle version instead of a hardcoded string
- "Unsigned" badge for messages with no signature; clearer "Require Signatures" / "Hide Unverified" help text
- Tom Select-based folder multiselect with palette-matched pills
- Dropped redundant email labels for known contacts in conversation cards
🛠️ Build & CI
- Staging pushes build all platforms; concurrency groups cancel superseded runs
- Android build scoped to the
androidbranch and release tags; fixed Android build for imap 3.x
Upgrade Notes
- The new count-based sync supersedes the old date cutoff. If older mail was previously clipped, it becomes reachable again via infinite scroll / Refresh on this version
- "Auto-file Nostr Mail" defaults to off — enable it in settings if you want nostr mail filed automatically
- Existing installs keep their database on upgrade (Android
-rreinstall / desktop in-place update)