Releases: gausejakub/vimail
Releases · gausejakub/vimail
v0.10.4
What's Changed
IMAP Connection Stability
- Connection reuse — Reuse existing healthy IMAP connections instead of tearing down and reconnecting every sync cycle. Avoids exhausting server connection limits.
- Operation timeouts — Per-operation deadlines (45s for commands, 3min for full folder sync, 60s for body fetch) with force-close timers that unblock stuck
cmd.Wait()calls when the network is unresponsive. - Non-blocking disconnect —
Disconnect()now uses tryLock with force-close fallback instead of blocking indefinitely onopMu, preventing TUI freezes when the network is down.
Full Changelog: v0.10.3...v0.10.4
v0.10.3
Bug Fix
- Fix TUI freeze: Resolved a deadlock where the UI would freeze after ~5 minutes. The coordinator mutex was being held synchronously in the Update handler while periodic sync blocked on IMAP disconnect, deadlocking the entire event loop.
v0.10.2
Security & Dependencies
- Go 1.26.1 — upgraded from 1.24.2, resolves 16 stdlib vulnerabilities (crypto/tls, crypto/x509, net/url, net/http, database/sql)
- golang.org/x/net v0.52.0 — upgraded from v0.6.0, resolves 4 HTML parsing vulnerabilities (infinite loop, quadratic complexity, XSS)
- IPv6 support — IMAP/SMTP address formatting now uses
net.JoinHostPortfor correct IPv6 handling - 0 known vulnerabilities — verified with
govulncheck ./...
v0.10.1
Fixes
- Cross-folder delete — deleting a message now removes it from all folders (Inbox, Sent, etc.) by correlating via RFC 5322 Message-ID header
- Skip stale body fetches — rapidly scrolling through messages no longer queues redundant fetch operations
v0.10.0
What's New
Security Hardening
- AES-256-GCM encryption at rest for email bodies in SQLite cache (key stored in OS keyring)
- Signal handling — graceful shutdown on SIGTERM/SIGINT with cleanup
- IMAP body size limit (50MB) to prevent OOM on oversized messages
- SMTP hardening — reject unknown TLS modes instead of silent plaintext fallback
- Dangerous attachment warnings — detect
.exe,.bat,.docm, double-extension tricks - Temp file cleanup on exit
- Config file permissions enforced to 0600
- TCP keepalive (30s) on IMAP and SMTP connections
- Dial timeouts (30s) on both IMAP and SMTP
- Credentials safety —
String()method omits secrets from accidental logging - govulncheck — 0 known vulnerabilities
Features
- Soft line wrapping in compose editor and horizontal scroll
- Gmail label deduplication and cross-folder cache sync
Fixes
- Show To instead of From in Sent/Drafts message list
- Preserve quoted context when AI generates reply
- Dedicated IMAP connection for body fetches, stale UID recovery
v0.9.0
What's new
- Global search — press
/to search across all accounts and folders with deduplication of Gmail labels - Export to ZIP — press
Eto export messages (single or batch) with text, HTML, metadata, and attachments - Restore from Trash — press
uto move messages back to Inbox (single or visual mode batch) - Search commands —
:search <query>/:s <query>as alternative to/
v0.8.0
What's new
- Global search — press
/to search across all accounts and folders- SQLite-backed LIKE queries on subject, from, to, and body
- Results display inline with
[account/folder]context :search <query>command alias- Press
Escto clear search and return to folder view
v0.7.0
What's New
- Structured logging — async JSON logs at
~/.local/share/vimail/vimail.logcovering all operations with full context (account, folder, UID, duration). Auto-rotates at 10MB, cleans up after 3 days. - Sync timeout — 5-minute per-account sync timeout prevents forever-spinning indicators
- Batched mark-read retries — pending mark-read ops are batched by folder into single IMAP commands, preventing Gmail throttling
- Descriptive sync progress — process labels show "connecting…" then folder-by-folder progress
- Failed body fetch UX — preview shows "(failed to load body)" instead of infinite "(loading...)"
- Visual select-all mark-as-read — works beyond the 500-message sliding window limit
- Panic recovery — sync and fetch goroutines recover from panics and return error messages
v0.6.0
What's New
- Sliding window pagination — large folders (90k+ messages) no longer freeze the UI; G/gg jump instantly
- Visual select-all — batch delete and mark-as-read now work on the entire folder, not just the loaded window
- Folder deletion — delete custom folders with
ddin the mailbox pane (with confirmation) - Security hardening — path traversal fix, TLS 1.2 minimum, memory safety limits, file permissions
- Sync status fix — "Syncing..." no longer gets stuck after sync completes
v0.5.0
What's new
- Attachment picker —
Son a message with multiple attachments opens a selection overlay (Space to toggle,afor all, Enter to save). Single attachments save directly - Persistent operation queue — deletes, sends, and mark-read ops are queued in SQLite and automatically retried on reconnect. View the log with
:ops - Running processes display — status bar shows all active background operations with account/folder context. View details with
:ps - Paginated message list — folders with 100k+ messages load instantly (500 at a time, auto-loads more on scroll)
- Async folder switching — switching folders shows "Loading…" immediately instead of freezing the UI
- Attachment persistence — attachment metadata is now cached in SQLite, so attachments show correctly across sessions
Performance
- IMAP STATUS pre-check — resync skips unchanged folders by comparing UIDNEXT, dramatically reducing sync time
- Per-account sync tracking — each account shows its own sync status independently
- Sync/delete progress — real-time progress updates (e.g. "⟳ email 3/16 Inbox (19200 msgs)", "⊘ deleting 500/10000")
Fixes
- Gmail trash folder resolution for locale variants (
[Gmail]/Bin,[Gmail]/Koš, etc.) - Czech and UK Gmail folder names normalized to standard English labels
- Empty folders no longer stuck showing "Syncing…" after account sync completes
- Process labels now include account/folder context for clarity