Skip to content

Releases: gausejakub/vimail

v0.12.1

Choose a tag to compare

@gausejakub gausejakub released this 27 Aug 08:55

Bug Fix

  • Vim motions in the mailbox pane — counted j/k (e.g. 5j), gg, G, and counted line jumps now work in the account/folder sidebar, the cursor stays visible while moving through long lists, and quickly typed commands such as 5j are no longer swallowed when the terminal coalesces input. Help overlay updated. (#44)

Full Changelog: v0.12.0...v0.12.1

v0.12.0

Choose a tag to compare

@gausejakub gausejakub released this 27 Aug 08:00

What's Changed

MCP server — complete mailbox operations

  • restore_messages — move one or many messages back from Trash to Inbox (or another folder). Server-first: the cache is only reconciled once the server confirms, with the new destination UIDs; offline restores are queued and retried.
  • mark_all_read — mark a folder, an account, or every account read in one call. Uses a whole-folder IMAP operation, so uncached messages are covered without enumerating UIDs; Spam and Trash are included by default.
  • list_operations — check whether queued mark-read, delete, restore, and send operations were delivered, are retrying, or failed (the MCP counterpart of the TUI's :ops view).
  • sync with full: true — rebuild cached headers authoritatively after server-side moves or deletes, keeping already-downloaded bodies.

Together with v0.11.0 this makes review, bulk mark-read/delete, delivery verification, restore-from-Trash, and cache reconciliation all possible directly from an MCP client — no helper scripts or per-UID orchestration.

TUI

  • Select-all + r in visual mode now issues one whole-folder mark-read operation instead of one queued op per message.

(#43)

Full Changelog: v0.11.0...v0.12.0

v0.11.0

Choose a tag to compare

@gausejakub gausejakub released this 26 Aug 18:58

What's Changed

MCP server — use vimail from AI clients

  • vimail mcp — a Model Context Protocol server on stdio for Claude Code, Claude Desktop, and other local AI clients. Reads (list_accounts, list_folders, list_messages, read_message, search_messages) are served from the local cache and never open IMAP connections. (#31)
  • Write toolssave_draft, delete_draft, mark_read, delete_message (Trash only) and an explicit sync tool; writes go through the same offline queue as the TUI. mark_read/delete_message take a uids batch. (#32, #39)
  • Mail review in two callslist_recent_messages scans a time window across every account; read_messages reads the selected bodies as a batch without marking them read. (#41)
  • Sending is opt-insend_email exists only with [mcp] allow_send = true; otherwise it is not registered at all. (#33)
  • Safe next to the TUI — queued operations run exactly once across processes, account syncs take a cross-process lock, and the TUI refreshes itself when the MCP process changes the cache. (#30, #37, #40)

Themes

  • cliamp (Winamp-style black/green) and omarchy (follows the current Omarchy palette, ANSI fallback). Every theme now passes a WCAG contrast gate. (#26)

Compose editor (Vim)

  • Operators follow real Vim motion classes (dw, cw, d0, dF, …); c{motion} + typing undoes in one step. (#21)
  • V + d deletes whole lines and pastes linewise. (#42)
  • Count prefixes on editing commands: 2dd, 3x, 3J, 2p, >>, <<. (#23)
  • / ? wrap correctly on the cursor line; n/N keep the search direction. (#24)

Reliability fixes

  • Failed offline operations stay retryable, with exponential backoff; mark-read failures are no longer reported as success. (#28, #37)
  • One recovery sync per folder on stale-UID bursts instead of one per message. (#29)
  • Search deduplicates by Message-ID, keeps real folder/UID handles for label copies, and searches encrypted bodies correctly. (#38)
  • MCP deletes use the server's real Trash mailbox; stale IMAP connections are replaced before batched writes; large deletes get per-chunk deadlines. (#40)
  • Log rotation and 3-day retention are enforced during long sessions; the async logger is race-free. (#19, #20)

Security

  • Go 1.26.6 and golang.org/x/net v0.58.0 in both modules — govulncheck clean. (#17)

Project

  • CHANGELOG.md introduced; CI now enforces the standalone pkg/vimtea suite. (#18, #25)
  • The editor module is tagged separately as pkg/vimtea/v0.2.0.

Full Changelog: v0.10.4...v0.11.0

v0.10.4

Choose a tag to compare

@gausejakub gausejakub released this 21 Mar 19:13

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

Choose a tag to compare

@gausejakub gausejakub released this 19 Mar 16:49

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

Choose a tag to compare

@gausejakub gausejakub released this 16 Mar 20:05

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

Choose a tag to compare

@gausejakub gausejakub released this 16 Mar 08:04

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

Choose a tag to compare

@gausejakub gausejakub released this 13 Mar 19:47

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

Choose a tag to compare

@gausejakub gausejakub released this 08 Mar 22:11

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

Choose a tag to compare

@gausejakub gausejakub released this 08 Mar 20:40

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