Release Notes
Fixed
- Large-account IMAP syncs no longer fail when Gmail/Exchange throttles (#396). Rate limits are now recognized as throttling instead of bad credentials, the round
backs off per account and defers the remaining folders, and a round with failures reports Partial (e.g. 393/394 folders) instead of Failed — so you can tell how
complete the archive actually is. Folders with nothing new are skipped without opening a connection, and a proven-expunged UID tail no longer re-enumerates on
every sync. - Blob store: interrupted garbage collection no longer risks data loss (#393). The GC index cursor confused payload bytes with file offsets (an interrupted run
could truncate a segment's tail and poison a backup object), and a stale index after a crash could make reads return another key's data. Both are fixed; recovery
now rescans and heals affected segments. - Auto-adding a newly discovered mailbox no longer silently drops INBOX/Sent for accounts that never made an explicit folder selection.
- Emails without a subject can be opened from the attachment list (#394); removed a non-functional bulk-selection control there (#395).
Added
- /healthz liveness endpoint — returns 200 ok even in maintenance mode, so orchestrators stop restarting the process an operator needs alive for a migration.
/api/status remains the readiness probe. - reindex --yes — explicit non-interactive confirmation for scripts and Kubernetes Jobs; a non-TTY run without it now fails loudly (exit code 2) instead of
cancelling silently with exit code 0.
Changed
- DELETE /api/v1/account/:id on a nonexistent account now returns 404 instead of a silent success, consistent with GET.
- async-imap now tracks the official crate (0.12.0, with imap-proto 0.17) instead of our fork; brings additional IMAP parser fixes.
Full Changelog: 2.3.0...2.3.1