New features
- Navigate the Web UI through a grouped sidebar and search from any page. Press
/to focus global search. Everything and Files also let you save the current view directly from their headers. - Sync Microsoft 365 and Outlook.com mail through Microsoft Graph with
add-o365 --graphwhen IMAP is unavailable. Staged deletion supports these accounts, including moving messages to Deleted Items and permanent deletion. Deletion requiresMail.ReadWriteconsent and that permission in the app registration. - Sign in to Microsoft 365 and Teams without a local browser using
msgvault add-o365 you@example.com --headlessormsgvault add-teams you@example.com --headless. MsgVault prints a Microsoft URL and a code to use on another device. - Create and manage plain-text Gmail reply drafts, compose fresh IMAP drafts, and reply-all to archived mail. Enable drafts for each source. Delegated agents can read, edit, and delete managed drafts within their granted account access.
- Forward archived email with its stored attachments using
msgvault draft-forward. MsgVault creates an IMAP draft with your note and the original message quoted as text. Missing attachments or an exceeded server upload limit prevent draft creation. - Save draft replies to archived Slack, Teams, and Discord conversations with
draft-compose --conversation. Review, edit, or delete them in MsgVault. MsgVault never sends these replies. - Place draft replies directly in Beeper Desktop's message box through the draft commands after enabling
[[beeper.drafts]]. MsgVault rejects writes when it finds unrelated text already there. Text typed between its check and write can still be lost. - Export a conversation's visible emails as numbered
.emlfiles withmsgvault export-eml <id> --thread -o DIR. MCP clients can list threads and download stored emails and attachments without shell access. PST email exports contain reconstructed MIME. - Import iMazing Messages CSV exports with
import-imazing-csv, including available attachments. Supply--meand use--timezonewhen the export's timezone differs from your local zone. - Archive completed Muesli meetings, notes, transcripts, and later edits with
add-muesliandsync-muesli. MsgVault must run on the Mac containing Muesli. Grant the daemon Full Disk Access to read Contacts; meetings still sync without Contacts access. - Link meeting attendees to existing people through email or phone evidence. Names alone never establish a match, and conflicting ownership goes to review.
- Export selected meetings as JSON or Markdown context with archive citations and optional transcripts. Query recorded action items and meeting activity through the Web UI, CLI, HTTP, or read-only MCP tools. Existing archives gain this data without a provider resync.
- Show live Kata todos on a person's page through the opt-in
[integrations.kata]connection. Create and unlink tasks in the Web UI, or link existing tasks through the CLI and API. Edit and complete tasks in Kata. This requires Kata API schema 0.21.0 or later. - Connect multiple named CardDAV accounts, each with its own credentials, schedule, and sync history. Select one with
--connectionor in Settings.sync-carddavwithout a connection syncs all enabled connections and exits nonzero on partial failure. Contact publication still uses one target. - Connect CardDAV servers that require Digest authentication or an approved private HTTPS destination. Configure
trusted_originandtrusted_addresseslocally before adding a private destination. - Accelerate SQLite semantic, hybrid, and similar-message searches with an approximate index and exact reranking. Run
msgvault embeddings optimizeto build or resume it from stored embeddings without provider calls. Set[vector.search].sqlite_accelerator = "exact"for exhaustive search. - Review identity suggestions, which propose linking archived identities to people, through the CLI or MCP. MCP also supports person merges and CardDAV writes. Enable each capability with its corresponding
--allow-identity-decisions,--allow-person-merges, or--allow-carddav-writesflag. Each confirmation requires user approval. - Score identity suggestions with the optional Jev service. Scoring is disabled by default and requires configuration and consent.
msgvault person scoring statuslists the names, email addresses, phone numbers, identifiers, scopes, and matching evidence sent toapi.typesafe.ai. Scores remain advisory and never accept matches or merge people. - Configure people inference with OpenAI, OpenRouter, or Venice presets and explicit model, privacy, and consent choices. Setup no longer enables inference just because an OpenAI key exists. Codex sign-in and inference remain unavailable in this release.
- Process stored WAV and MP3 recordings from captured sources through Docbank, preserving supplied transcripts or using a configured speech-recognition profile. Enable
all_sources_upload_consent = true. Existing Beeper audio users must consent again; the formerupload_consentsetting no longer permits uploads. - Select Slack direct conversations independently with
[slack].dmsandgroup_dms, or override either setting for one sync using--dmsand--group-dms. Skipped conversations retain their incremental progress. - Query archive analytics through the advanced MCP
query_sqltool on supported SQLite daemons. - Compare search rankings with Jev reranking using
msgvault eval --rerank-jev. This sends queries and bounded message text to TypeSafe usingTYPESAFE_API_KEY. Results include quality, latency, usage, and cost measurements, with incomplete usage marked.
Improvements
- Keep querying published analytics while a cache refresh runs in the background.
--freshrequests include writes committed before the request. CLI queries wait when a build is required; HTTP and MCP callers receive a build job to poll. - Refresh analytics with less repeated work. New messages, label changes, and identity-link changes reuse retained cache data where possible, including when sync overlaps a build. Existing caches require one full rebuild after upgrade.
- Keep scheduled syncs moving under load. Background maintenance yields to queued work and resumes saved progress across restarts. Scheduled activity and attachment maintenance use one-minute budgets; scheduled Beeper imports use three-minute budgets. Status distinguishes queued jobs from running jobs.
- Reduce query work for full-text, semantic, hybrid, and address-filter searches. Large People and Domain groupings also avoid the memory exhaustion reproduced with a 512 MB limit.
- Reduce CPU time spent preparing messages for embedding builds. Existing vectors remain compatible, and no rebuild is required.
- Show readable chat snippets in CLI search tables and fit columns to the terminal width. Redirected output preserves full sender and subject or snippet text. Slow searches show elapsed time without implying that search waits for concurrent daemon work.
- Check full-text index coverage without reading stored message content. Searches show an incomplete-results warning when the index needs rebuilding or is rebuilding.
- Read person records through separate scroll areas and organized sections. Populated attributes appear near the top, empty fields stay hidden until requested, and linked identities explain their service and match origin.
- Show readable statuses and errors across Sources, Operations, Deletions, and Settings. Settings remembers its category and applies saved theme or density changes to the open tab unless a Display override is active.
- Finish
msgvault setupwithout Google credentials by pressing Enter at the credential prompt. The wizard then shows IMAP, Microsoft 365, and file-import examples. - Control implicit daemon startup with
[server].daemon_auto_start = falsewhen a supervisor manages the daemon. CLI commands use a running daemon or return an actionable error. - Discover MCP tools without waiting for archive statistics. Upgrade clients and daemon together to API schema 3.0.0, which replaces token-free identity decisions with reviewed decisions. HTTP MCP writes also require
--http-allow-writes, and confirmation-dependent writes require MCP protocol 2026-07-28 or newer. - Diagnose document extraction failures through specific build errors and status details. Inline attachments remain excluded by default; enabling
attachments.documents.scope.include_inlinerequires fresh consent.
Bug fixes
- Preserve PST message identifiers and repair reply chains after importing all folders. To repair an earlier import, rerun the same PST with the same account identifier and
--no-resume. Existing messages remain counted as skipped. - Complete IMAP syncs for supported legacy and damaged Message-IDs without replacing archived messages or repeatedly enumerating folders. DavMail messages with empty header responses receive a full-header retry to recover identities and labels.
- Skip unchanged partial Apple Mail messages during repeated
import-emlxruns. Only newly restored attachments trigger re-ingestion, and the restored count reports attachments added during that run. - Keep invalid Apple Messages dates from blocking analytics builds. Rerun
msgvault import-imessagewithout date filters or a message limit to correct an earlier import, retaining any original--db-pathand--meoptions. Undated messages remain archived. - Build analytics caches despite invalid UTF-8, late-occurring quoted fields, or pre-1970 messages. Damaged display text uses replacement characters, while damaged identities export as unknown. Repair an older damaged cache with
msgvault build-cache --full-rebuild. - Return complete API JSON when archived subjects, snippets, or names contain invalid UTF-8.
- Complete activity updates for affected upgraded SQLite archives with missing message timestamps. The first startup after upgrade scans the messages table once to fill those timestamps.
- Recover Gmail syncs when quota pauses exceed an individual request timeout. Quota retries honor
Retry-After, cancellation, and the caller's deadline. - Stop repeatedly downloading Beeper media that the source reports as permanently unavailable. Sync and backfill summaries report those files, while temporary failures remain eligible for retry.
- Complete repeated person enrichment lookups without failing on reused citations or duplicate values. Scheduled lookups stop repeating terminal failures, and disabling a profile retains queued work for re-enablement.
- Preserve
--no-default-identitychoices during scheduled sync and re-authorization. - Give newly promoted people an observed display name when one is available. Contacts without names also receive generated full names so vCard publication succeeds.
- Filter Directory by Email, Chat, Meeting, or Other through the Primary channel menu. Directory media and file filters also apply.
- Keep cached Files listings usable when a provider resync retains the same attachments. Old attachment links no longer trigger endless page requests.
- Preserve files created at a SQLite backup target while the backup is running. MsgVault returns
backup target already existsinstead of overwriting the competing file. - Avoid a panic when updating MsgVault and restarting a running daemon.
- Load the full MCP tool catalog in strict clients through the corrected Saved View schema.
Acknowledgements
Thanks to everyone who contributed to this release:
- @aaronwolen for fixing quoted fields in analytics caches and initial Google Contacts sync.
- @eliemada for preserving legacy IMAP Message-IDs.
- @exactmike for Microsoft mail sync, deletion, and headless sign-in.
- @franklintra for recovering empty IMAP header responses.
- @fucx for fixing daemon restart during updates.
- @mariusvniekerk for Web pane dividers, vector requests, retries, and backup protection.
- @metcalfc for recovering Gmail syncs after quota throttling.
- @rodboev for mail and chat drafts, audio processing, and archive maintenance.
- @salmonumbrella for people and meeting workflows, reviewed agent tools, analytics, and scheduling.
- @shntnu for Slack DM selection and narrower people-fact migration checks.
- @spf13 for generating full names for nameless contacts.
- @wesm for Web navigation, search, sync, activity, and documentation.