Skip to content

Releases: gausejakub/vimail

v0.10.4

21 Mar 19:13

Choose a tag to compare

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 disconnectDisconnect() now uses tryLock with force-close fallback instead of blocking indefinitely on opMu, preventing TUI freezes when the network is down.

Full Changelog: v0.10.3...v0.10.4

v0.10.3

19 Mar 16:49

Choose a tag to compare

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

16 Mar 20:05

Choose a tag to compare

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.JoinHostPort for correct IPv6 handling
  • 0 known vulnerabilities — verified with govulncheck ./...

v0.10.1

16 Mar 08:04

Choose a tag to compare

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

13 Mar 19:47

Choose a tag to compare

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 safetyString() 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

08 Mar 22:11

Choose a tag to compare

What's new

  • Global search — press / to search across all accounts and folders with deduplication of Gmail labels
  • Export to ZIP — press E to export messages (single or batch) with text, HTML, metadata, and attachments
  • Restore from Trash — press u to move messages back to Inbox (single or visual mode batch)
  • Search commands:search <query> / :s <query> as alternative to /

v0.8.0

08 Mar 20:40

Choose a tag to compare

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 Esc to clear search and return to folder view

v0.7.0

08 Mar 13:00

Choose a tag to compare

What's New

  • Structured logging — async JSON logs at ~/.local/share/vimail/vimail.log covering 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

08 Mar 11:54

Choose a tag to compare

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 dd in 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

07 Mar 11:45

Choose a tag to compare

What's new

  • Attachment pickerS on a message with multiple attachments opens a selection overlay (Space to toggle, a for 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