github kenn-io/msgvault v0.20.0

3 hours ago

New features

  • Manage people in the new Web Directory and TUI People browser. Profiles bring together contact details, custom fields, private Notes, messages, meetings, files, and change history.
  • Record organizations, current and past employment, and dated relationships between people. Review uncertain identity matches, merge duplicate profiles, and split mistaken merges while retaining history.
  • Browse people by last contact through msgvault person directory and MCP. Relationship calendars show contact activity over time.
  • Keep tracked profiles current with optional model-assisted updates from archived conversations. Provider setup requires explicit consent and budgets; saved evidence explains profile changes, and pinned facts preserve manual choices.
  • Enrich profiles through Exa or SixtyFour using explicitly permitted identity details. External enrichment stays off by default and does not send message bodies or private attributes.
  • Catch up with a "Last time we talked" brief that cites archived messages. Briefs require separate enrollment for each person and currently summarize their supported chat and text messages, excluding email, meetings, and your replies.
  • Find people by meaning with msgvault person search. This requires separate consent for profile embeddings and search queries.
  • Sync contacts bidirectionally with a CardDAV address book, including Google Contacts OAuth setup. Publication is explicit per person, conflicts remain reviewable, and profile edits preserve unrelated vCard properties.
  • Find a person's files across linked accounts and conversations through the Web Files view, msgvault person files, or MCP. Search attachment details, extracted text, or visual content, with links back to the original messages.
  • Search text extracted from PDF, CSV, and PPTX attachments. Extraction requires a successful provider capability check, explicit consent, and a manual build. CSV conversion is opt-in, and PPTX requires a verified slide limit.
  • Search indexed attachment text by meaning or combine keyword and semantic results. Document embeddings and query uploads require separate consent; default document searches remain local keyword searches.
  • Find images and supported MP4 attachments with text or image queries. Visual search requires provider capability checks and consent before archive uploads.
  • Preserve conversation context in chat and meeting search with optional Voyage contextual embeddings. The existing embedding method remains the default.
  • Filter messages with list:, list-id:, and conversation_id:. Mailing-list views are available in the Web UI and TUI; run msgvault repair-list-ids --apply and rebuild the cache to backfill existing mail.
  • Compare keyword, semantic, and hybrid search quality with msgvault eval, using your own queries and relevance ratings. Reports include ranking quality and query timings in table or JSON form.
  • Import EML mailbox trees and Maildir archives directly with import-eml and import-maildir. Both preserve folder labels and support repeat imports without duplicating archived messages.
  • Import Google Groups Takeout MBOX files and ZIPs with import-mbox --source-type google-groups. Imports retain group labels, threads, and attachments without treating the group address as your identity.
  • Import Slackdump Standard and Mattermost export directories or ZIPs without a live Slack token.
  • Import Apple WhatsApp ChatStorage.sqlite text conversations, including supported participant names. Media, reactions, and reply relationships remain outside this importer.
  • Sync Notion AI Meeting Notes into meeting views and search. Sync retains summaries, notes, and transcripts, retries pending transcripts, and reports Notion's partial 50-meeting discovery window.
  • Keep Google Voice Takeout voicemail recordings with their archived messages. Stored audio remains available after the Takeout files move.
  • Create, retrieve, edit, and delete plain-text IMAP reply drafts through the CLI. Enable drafts for each source and configure its mailbox first; sending remains in your mail client. draft-recover resumes identified interrupted edits or deletions from saved receipts without appending another copy.
  • Give an agent account-scoped permission to create reply drafts with msgvault agent-token. Delegation requires explicit server configuration and an owner API key. Tokens remain valid until revoked or the daemon restarts.
  • Archive remote email images for offline reading with [sync] archive_remote_images = true. The feature is off by default because downloads can activate tracking pixels. Backfill existing email separately with msgvault archive-remote-images --allow-tracking.
  • Authorize Gmail with read-only access using msgvault add-account <email> --readonly. Existing write grants require revocation and reauthorization; adding the flag does not narrow an existing grant.
  • Start bounded Gmail and IMAP historical imports through the API and retrieve persistent progress and completion status.
  • Stage Gmail deletions from search criteria or explicit IDs with msgvault stage-delete, including --dry-run. Mixed selections stage eligible Gmail messages and report skipped items; each batch remains tied to one source.
  • Inspect background work in the new Operations workspace. Filter run history and open outcomes, recovery guidance, and available actions.
  • Manage daemon, source, search, and attachment settings in the Web UI or press , in the TUI. Web settings include schedule presets, time zones, numeric limits, and masked API-key hints.
  • Configure optional search and people providers with msgvault setup providers. Use msgvault setup status to see missing credentials, checks, consent, and next steps.
  • Let MCP clients discover, run, and manage Saved Views, the saved queries created in the Web UI. New people tools expose profiles, recent contacts, saved briefs, and person-specific file search.
  • Discover running HTTP MCP listeners with msgvault mcp status --json, including their ports and token-file paths without printing tokens.
  • Reclaim SQLite space from messages deleted at their source with msgvault gc, which requires confirmation and creates a backup by default. Remove embeddings left by hard-deleted messages with msgvault embeddings prune without paying for a full embedding rebuild.

Improvements

  • Sync large IMAP accounts incrementally with or without QRESYNC. Unchanged folders avoid full scans, and full enumerations update only changed records. In one 96,000-message Microsoft 365 benchmark, syncing after one message moved drops from 1 hour 46 minutes to 24 seconds.
  • Scope embedding builds to selected accounts or named collections. Configure document_prefix and query_prefix for models that require task instructions; changing either requires msgvault embeddings build --full-rebuild --yes.
  • Control chat attachment downloads by account, conversation size, and file size. Beeper, Slack, Discord, and Teams now skip downloads in conversations with more than 20 participants by default; set media_max_participants = 0 to remove that cap.
  • Retain larger individual attachments by default in Beeper, Slack, and Teams, with the limit rising to 250 MiB. Discord stays at 50 MiB. Existing files remain stored until you explicitly run purge-excluded-media.
  • Read HTML email with dark colors and a resizable right-side preview in Everything. A per-message "Use original colors" control restores the sender's presentation.
  • Share shorter Web UI links while preserving filters and selected items. Back and Forward retain the full session state, and shared links retain their search mode.
  • Open messages in the browser from CLI JSON and MCP results through the new web_url field.
  • Browse, download, and open individual attachments from the TUI with e. Press s in email detail to save an .eml file on the client machine without overwriting existing files.
  • Reuse TUI searches with Up and Down, navigate with Ctrl+n and Ctrl+p, and select named collections with A. Semantic search is available when vector search is enabled.
  • Stage the current TUI selection with d, or resolve every filter or search match with D before confirmation. Set [data].export_dir to choose the destination for attachment exports.
  • Use curated person names in search, relationship analytics, completion, and message exports. Existing analytics caches require one full rebuild; later name changes refresh derived data without rebuilding message shards.
  • Tune daemon query resources with [analytics] query_memory_limit, query_threads, and query_temp_limit. Cache builds now allow up to 32 GB of temporary disk use by default, and min_rebuild_interval limits automatic rebuild frequency.
  • Select an exact source with --source-id for sync, account maintenance, and staged deletion when account names are ambiguous.
  • Search retained source-deleted mail with --deletion-scope deleted or any in keyword searches. Message output includes deletion timestamps, and archived raw email remains exportable.
  • Enable remote deletion persistently in the invoking CLI's configuration with [deletion] remote_enabled = true. The daemon's own configuration does not grant consent to a remote caller.
  • Connect MCP clients using protocol 2026-07-28 with sessionless HTTP discovery. HTTP remains read-only unless explicitly enabled. Clients consuming aggregate or search_by_domains must read structuredContent.data.
  • Update API integrations to use /api/v1/participants for observed-contact analytics and /api/v1/people for saved profiles. The old people-analytics routes and /api/v1/persons routes are removed.
  • Install through the supported scripts, Homebrew, or release binaries instead of Nix, which is no longer supported. Source builds require Go 1.27.0.

Bug fixes

  • Preserve the local message, raw email, metadata, and attachments when permanently deleting mail from Gmail.
  • Reconcile Gmail source deletions after history expires without removing archived content. Incremental sync also retries failed fetches from the latest completed run recorded as incremental.
  • Reject cached Gmail credentials that belong to a different mailbox during add-account. Gmail and Google OAuth requests now have bounded waits, and authentication errors include complete recovery commands.
  • Audit and repair mismatched Gmail snapshots from archives written between February and May 2026 with repair-message --audit and repair-message <id>.
  • Pick up new Teams chat messages after the first sync and archive self-chats. Existing accounts need no migration or reauthorization.
  • Store readable Beeper message text instead of HTML markup and check daily for newly available older history. Existing archives repair derived text on the next sync or through repair-derived --source-type beeper.
  • Preserve Beeper transcript metadata and Discord voice-message flags and waveforms. Existing Discord records support repair with repair-derived --source-type discord.
  • Retry transient IMAP connection failures and reconnect after dropped connections during label collection. Confirmed mid-sync message removals no longer discard completed progress.
  • Refresh archived IMAP content when an edited outgoing message moves to a trusted Sent folder. Servers without advertised folder roles need an account-specific sync.trusted_imap_sent_mailboxes setting.
  • Recover cached top-level attachments from Apple Mail partial messages without duplicating messages on re-import. Nested attachment restoration remains unsupported.
  • Preserve Apple Mail Message-ID values and reply links. Re-import with the same source identifier and --no-resume, then run build-cache --full-rebuild to repair missing IDs and expose them in SQL and JSON.
  • Report unreadable Apple Mail directories instead of treating them as empty archives, including Full Disk Access guidance for macOS permission errors.
  • Import PST archives without counting search folders or empty attachment tables as errors.
  • Recover usable email text and attachments with malformed content types. When broken MIME structure prevents full parsing, intact headers still preserve identification and threading.
  • Prefer more complete duplicate copies when earlier source and eligibility rules tie. Deduplication previews no longer write derived metadata before confirmation.
  • Find recipient addresses in older archives through message_recipients.email_address. Use envelope_address when you need the original header address; the next cache rebuild adds both.
  • Recover Web views automatically after initial cache preparation and reduce memory use for ordinary Everything and Files listings. Query failures explain memory or disk limits, and Files offers Retry instead of displaying an unavailable count as zero.
  • Keep the daemon discoverable after VM clock changes, preventing a second daemon startup from failing on the existing archive lock.
  • Build macOS analytics caches without repeated DuckDB extension code-signature warnings. Account removal also completes unique-attachment cleanup before rebuilding the cache.
  • Preserve valid UTF-8 in calendar previews and repair affected historical snippets with repair-encoding.
  • Register calendars with service-account apps using domain-wide delegation. Missing Calendar permissions or a disabled API report errors without waiting through the full retry budget.
  • Import Android WhatsApp databases without the optional group-participant table and confirm the source identity after recoverable import errors. Contact matching requires explicit country codes.
  • Repair missing sender details, account-owner attribution, and IMAP labels with repair-senders, repair-identity, and repair-labels. Sender and label repairs preview changes by default.

Don't miss a new msgvault release

NewReleases is sending notifications on new releases.