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 directoryand 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:, andconversation_id:. Mailing-list views are available in the Web UI and TUI; runmsgvault repair-list-ids --applyand 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-emlandimport-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.sqlitetext 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-recoverresumes 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 withmsgvault 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. Usemsgvault setup statusto 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 withmsgvault embeddings prunewithout 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_prefixandquery_prefixfor models that require task instructions; changing either requiresmsgvault 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 = 0to 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_urlfield. - Browse, download, and open individual attachments from the TUI with
e. Presssin email detail to save an.emlfile on the client machine without overwriting existing files. - Reuse TUI searches with Up and Down, navigate with
Ctrl+nandCtrl+p, and select named collections withA. Semantic search is available when vector search is enabled. - Stage the current TUI selection with
d, or resolve every filter or search match withDbefore confirmation. Set[data].export_dirto 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, andquery_temp_limit. Cache builds now allow up to 32 GB of temporary disk use by default, andmin_rebuild_intervallimits automatic rebuild frequency. - Select an exact source with
--source-idfor sync, account maintenance, and staged deletion when account names are ambiguous. - Search retained source-deleted mail with
--deletion-scope deletedoranyin 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
aggregateorsearch_by_domainsmust readstructuredContent.data. - Update API integrations to use
/api/v1/participantsfor observed-contact analytics and/api/v1/peoplefor saved profiles. The old people-analytics routes and/api/v1/personsroutes 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 --auditandrepair-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_mailboxessetting. - 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 runbuild-cache --full-rebuildto 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. Useenvelope_addresswhen 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, andrepair-labels. Sender and label repairs preview changes by default.