Repository navigation
Releases
v0.23.0
New features
- Import Telegram Desktop JSON exports with
msgvault import-telegram <export-dir>. Re-imports add new messages and missing media while preserving previously archived text. Single-chat exports require--me. - Archive Inline chats and threads with scheduled, resumable sync and attachment capture. Browser OAuth is the default connection; an authenticated Inline CLI connection is also available.
- Add personal Pocket meeting sources with
add-pocketandsync-pocketto archive transcripts and recorded actions. Audio downloads and organization API keys are not included. - Recover encrypted Matrix history from your account's server-side key backup, including edits, reactions, and replies. Setup requires a recovery secret, or
--skip-key-backupto retain placeholders. Keys absent from the backup remain unavailable. - Keep locally available iMessage photos, videos, and voice notes with
import-imessage. Configure[imessage].media_max_participantsandmax_media_mb, or pass--max-media-mbfor one import. Defaults remain 20 participants and 250 MiB per file. - List archived calendar events with
msgvault calendar events --from <date> --to <date>. Results expand repeats, show moved meetings at their new times, and mark cancellations. Existing Google Calendar archives need no re-sync. - Browse people and domains in one People workspace, with messages, files, calendars, and editable profile details together. Saved profiles remain available even without archived messages.
- Review possible duplicates through People → Filter → Possible duplicates. Merge profiles, keep them separate, undo a decision, or split a merged profile through History.
- Preview contact tiers with
person tiers previewand inspect the reasons withperson tiers explain <person-id>. Tiers reflect message exchanges, shared meetings, and qualifying answered calls. Previewing does not track anyone. - Track or untrack several people in one command by passing multiple IDs to
person trackorperson untrack. - Find archived chats across networks with
find-chatand MCPfind_chat. Results include network labels and a message reference for opening the chat. - Search text inside mirrored PDFs and documents through media search, the HTTP API, and MCP. Attachment results open their messages and require attachment mirroring.
- Enable local semantic search without setting up an embedding server. Switching from Ollama's
nomic-embed-textpreserves the existing index; switching from another model asks before rebuilding it. - Connect an authenticated Streamable HTTP MCP client directly to
msgvault serveat/mcp. Reads require the owner bearer key.--mcp-allow-writesenables a separate/mcp/writescatalog, with additional write families requiring their own flags. - Read the MCP connection and safety guide offline with
msgvault quickstart --mcp, without a configured archive or running daemon. - Read archive totals with
msgvault stats --json, including active and source-deleted message counts and the scope they cover. - Find saved people with
person directory --queryor literal, case-insensitive--addressfiltering. Address filtering is also available through the Directory API and MCP. - Inspect and save room policy overrides with
msgvault policy list,set, andreset. This release does not enforce those tiers or hide rooms.
Improvements
- Navigate the Web UI through Messages, People, Files, and Sources. Saved searches live in the sidebar, and the footer status dot opens queued jobs, running jobs, failures, and past runs.
- Save ordinary settings through one Save changes bar. Settings opens on Overview, warns before leaving with unsaved edits, and identifies changes that require a restart.
- Find attachments, recordings, linked tasks, and actions under each message. Message menus offer original downloads, meeting export, text or HTML switching, and Add to task where available.
- Manage mail and Contacts sync independently in Sources. Staged deletion batches show their date, message count, and account, and staging opens a review dialog before
msgvault delete-stagedperforms deletion. - Load message lists, searches, statistics, person files, and large conversation windows faster. In a SQLite benchmark, opening a message in a million-message conversation drops from about two seconds to 98 ms.
- Refresh analytics faster after sync on Linux, macOS, and Windows. Measured incremental updates after one added message take 23% less time on Linux and 29% less on macOS and Windows.
- Build analytics with a memory budget based on available resources unless explicitly configured. Large chat archives and linked participant sets use less memory, and exhaustion errors identify the limits and retry command.
- Import SQLite mailboxes and growing group chats faster. Participant merges, attachment verification, and message deletion or re-embedding also avoid repeated work across unrelated archive data.
- Select verification samples faster with
msgvault verify. Selecting 1,000 samples from a million-message SQLite archive takes about 233 ms instead of 95 seconds in benchmarks. - Let queued mail and contact syncs run during large indexing jobs. Automatic indexing yields in bounded passes, and
embeddings optimizeallows archive writes between preparation batches. - Choose activity day boundaries during
msgvault setup. Restart the daemon after changing the time zone; later activity updates re-date existing rows. - See which Beeper chats failed and which command retries their messages or media. Slack sync and media backfill summaries also include an example download error.
- Allow time and disk space for new archive indexes during upgrade. The analytics cache also rebuilds once to exclude drafts and unsent messages from contact activity.
Bug fixes
- Keep previously indexed messages searchable across daemon restarts while keyword backfill fills remaining gaps.
- Find newly imported or edited iMessage, SMS, and Google Voice messages by keyword immediately. Re-run imports or the normal search backfill to fill existing omissions.
- Remove archived iMessage text when a re-import finds that the source body is empty, including after an unsend. The message record remains in the archive.
- Include Spam and Trash in Gmail full sync. To recover historical omissions, run one unfiltered, unlimited
sync-fullwithout query, date, or limit filters. - Retry failed Gmail downloads and saves during later incremental syncs, even without new mail. Sync stops before advancing its checkpoint if it cannot save the failure record. Older failures outside the retained retry history still require a full sync.
- Respect saved IMAP folder exclusions during scheduled and manual syncs. Configure
sync.imap_skip_foldersby account; explicit folder flags replace those exclusions for one run. Filtered syncs pause deletion tracking. - Wait and retry when an IMAP server rejects reads because of command limits. Set
[sync].imap_max_commands_per_minuteand restart the daemon to enable pacing. The default0leaves pacing off. - Keep drafts and unsent messages out of relationship activity and person file listings while retaining them in general search. Re-import Synctech backups to correct older draft, queued, and failed text classifications.
- Load person calendars, timelines, and domain details without the previous memory exhaustion on large chat archives. The TUI relationship calendar also loads with default system time zones; Windows groups its days in UTC and labels that choice.
- Show readable text for HTML-only email in the TUI and
show-messagethrough the daemon. JSON output keeps HTML inbody_htmlinstead of mislabeling it as plain text. - Flag messages whose HTML appears to hide readable text in MCP and CLI output. Detection checks inline styles and legacy attributes, so an unset flag does not guarantee that all text was visible.
- Stage every source-deletable match through MCP
stage_deletion, up to 100,000, or refuse without saving a batch. Larger queries receive guidance to narrow the search. - Reconnect local MCP proxies after a daemon restart without restarting the proxy.
- Leave supervised daemons for systemd or launchd to restart after
msgvault update. Use--no-restartto leave a self-started daemon stopped. Homebrew installations receivebrew upgrade msgvaultguidance instead of self-updating. - Preserve the host daemon's runtime record when commands run inside a PID-namespace sandbox.
- Report empty stored originals as sample errors in
verifyand as inconclusive in Gmail audits. Verification sample errors appear in the summary without changing the exit status. - Restore Mistral document extraction with
mistral-ocr-4-1. Update or remove an explicitmistral-ocr-4-0setting, then runmsgvault documents probe-mistralandmsgvault documents consent-mistralagain. - Process long PDFs through Docling in 50-page jobs and reuse saved progress after restarts. Saved range text is plaintext; status and backups disclose it, and
documents purge-derivedremoves it. - Complete embedding builds when a message contains only invisible or control characters by skipping empty content.
- Reject schedules with out-of-range wrapped values in both Settings and the daemon. Rewrite previously saved invalid ranges, such as
60-5, using valid field values. - Apply HTML sanitizer bypass fixes to email rendering in the Web UI.
Acknowledgements
Thanks to everyone who contributed to this release:
- @AndrewWiggins for complete Gmail full syncs that include Spam and Trash, retrying failed Gmail downloads, and verifying empty stored originals.
- @cpcloud for faster person and domain pages, lower Explore memory use, consistent page headers, and CI hardening.
- @elviskahoro for keeping sync progress lines aligned.
- [@eserie](https://github...
v0.22.0
This release builds msgvault with Go 1.27.3. Its crypto/x509 rejects the compromised intermediate certificates listed in GO-2026-6809 for every TLS connection msgvault makes, even when the operating system's trust store has not been updated yet. Upgrade from 0.21.0 and earlier.
Known issue: documents commands that use Mistral still fail because Mistral retired the pinned mistral-ocr-4-0 model (#1436).
Before upgrading
- Cron schedules now use go-cron. Schedules with a step as large as its range, such as
*/60 * * * *, and an empty zone name, such asCRON_TZ= 0 3 * * *, are rejected. Replace them first, for example with0 * * * *andCRON_TZ=UTC 0 3 * * *. - A standalone
|between full-text searches now means OR. Quote it as"a | b"to search for the literal text. Saved Views created before this release keep the literal meaning. - Stored people provider keys move into
tokens/provider-credentials.jsonthe first time msgvault uses them. An older release cannot read that file, so before downgrading runmsgvault person provider remove <name>for each profile with a stored key. - A stored person-enrichment suppression key now overrides
suppression_key_env. Make the two agree before upgrading. - A server bound to a non-loopback address without an API key now generates
tokens/server-api-keyand reuses it, so the Web UI asks for a login on127.0.0.1too. - msgvault now sends anonymous usage telemetry. Turn it off with
[telemetry] enabled = false,MSGVAULT_TELEMETRY_ENABLED=0orDO_NOT_TRACK=1.
New features
- Archive joined Matrix and Element rooms from any homeserver with
msgvault add-matrix --homeserver <url> --user-id <id>andsync-matrix, on demand or on the[matrix]schedule. Edits show their newest text, and redacted edits and reactions are removed. Only plaintext rooms are supported. - Archive Plaud cloud recordings, full transcripts with speaker labels, and every note tab as searchable meetings with
add-plaudandsync-plaud.--limit,--after,--fulland--probebound, filter, repair or dry-run a sync. Audio stays at Plaud. - Archive Twenty call recordings, including those from its Granola, Fathom, Fireflies and Teams integrations, as searchable meetings with
add-twentyandsync-twenty. - Archive Omi conversations with summaries, action items and speaker transcripts from hosted or self-hosted Omi. Sources share resumable sync and per-key request pacing.
- Archive Chatwoot shared inboxes, files, source transcripts and linked call meetings.
- Archive Twilio calls as searchable meetings, with their recordings saved locally up to 1 GiB each by default (
max_media_mb). - Keep Muesli M4A and WAV recordings as meeting attachments with
recordings = true, including from a remote recorder's Mac. Sync Muesli to a remote daemon with the owner credentials in[remote], and keep it current withsync-muesli --watchor Muesli's completion hook. - Give Notion meeting attendees verified email addresses, guests included, by adding a workspace-users integration token as
users_tokenon a[[notion_meetings]]entry, then rerunningsync-notion-meetings. - Archive Slack with a token limited to public channels, including channels you haven't joined;
search:readis no longer required. Turn private channels on or off with[slack].private_channelsorsync-slack --private-channels. - Search spoken words in recording transcripts with
msgvault media search, MCPsearch_mediaandGET /api/v1/media/search. Everything search shows transcript matches for plain-word full-text queries, and the Web reader shows each recording's transcript under the expanded message. - Route Loom and Cap links and native Teams recording pointers to Docbank for transcripts, with separate reference consent. Self-hosted Cap requires an exact configured origin.
- Mirror stored attachments to a Docbank folder, including files retained after source deletion. Status reports progress and failures, and message and attachment details show delivery receipts. Requires HTTP API schema 3.23.0.
- Extract document text on your own hardware with a self-hosted Docling Serve instance: set
provider = "docling"andendpointunder[attachments.documents]. - Match any of up to eight pipe-separated alternatives in full-text message search, for example
invoice | receipt. Remote clients need a daemon with API schema 3.19.0 or newer. - Find mail by the address that received it with
received:[email protected], and add sent mail and calendar events withaccount:[email protected]. The TUI account picker, the Web UI's Explore account filter, MCP and vector and hybrid search accept the same choices. - Create, update, delete and move calendar events, respond to invitations and check availability from the CLI, HTTP API and MCP. Write consent and source permissions are opt-in, and guest notifications default to
none. - Read and edit Gmail labels, IMAP keywords and Microsoft Graph categories on an archived message with
msgvault message-tags, HTTP or MCP. Microsoft Graph sync now archives categories, so the first sync of an existing Microsoft account walks every folder once. - Quote an exact passage from a message, transcript or file in a Kata issue from the Web UI,
msgvault kata, HTTP or MCP (--allow-kata-writes).msgvault kata issuesfinds issues that already cite a message or file, andmsgvault kata contextreads back each cited passage. - Prepare and manage drafts through MCP with the caller's own daemon permissions, including restricted agent grants. msgvault never sends.
- List the email addresses, phone numbers and chat IDs your archive holds for a person with
msgvault person identitiesorGET /api/v1/people/{id}/identities, to pick an address fordraft-compose --to. - Find people by name and read the messaging routes your archive has verified for a person through MCP
find_contact_candidatesandget_person_messaging_routes, or the matching/api/v1/people/routes. - Let MCP clients check source status and scheduler work, request syncs, change Slack conversation selection and edit display names. Source writes need
--allow-source-writes, display-name edits need--allow-profile-writes, and HTTP also needs--http-allow-writes. - Sync Microsoft 365 and Outlook.com contacts over CardDAV with
msgvault add-carddav --microsoft <email>. - Look up a person by a subscribed CardDAV card's UID with
msgvault person get --vcard-uid <uid>. - Find a person's attachment when you misremember its name by one letter with
msgvault person files <person-id> --filename <name> --fuzzy-filename. - Link many people at once from Relationships: hover to show checkboxes, Shift-click for ranges or select all, then choose Same person…. Directory and Saved views add bulk deletion.
- Click a day on a relationship's activity heatmap to show that day's messages in the timeline.
- Merge a replaced or duplicate account into one live source with
msgvault merge-account --from <account> --into <account> --dry-run, then again with--yes.update-accountadds--alias,--history-onlyand--accept-reanchor. - Grant read-only remote clients their own reader credentials with response limits and optional collection writes.
- Issue agent tokens for scoped archive reads through the remote CLI and MCP with
msgvault agent-token issue, optionally with--expires. Requires[server] agent_access = true. - Keep Google OAuth client secrets and tokens in a password manager or macOS Keychain with
[oauth] client_secrets_commandand the commands under[oauth.tokens]. Existing plaintext credentials are not migrated. - Configure containers and supervised installs without startup scripts:
MSGVAULT_HOME,MSGVAULT_BIND_ADDR,MSGVAULT_API_PORTandMSGVAULT_REMOTE_URLoverride config,iface:NAMEbinds to an interface's address, key files mount throughapi_key_file,MSGVAULT_REMOTE_API_KEY_FILEandmcp --http-token-file, andmsgvault credentials set <id> --from-filestores provider keys. - Use msgvault as a Go library through
go.kenn.io/msgvault/pkg/archive: set up and open SQLite or PostgreSQL archives, run the Slack and Discord importers, purge channels and sources, scope reads per request, and mount the HTTP API in your own server. PostgreSQL-only programs build without CGO. - Check embedding coverage, running and queued jobs, throughput with an ETA, and per-batch timings with
msgvault embeddings status,GET /api/v1/embeddings/statusor MCPget_embeddings_status. - Compare a new binary's expected archive version with the stored one using
schema-version, then runmigratebefore replacing the executable. - Anonymous usage telemetry: a daemon ping at startup and once each later UTC day, Web UI opens, screen views at most once per day, session length in four buckets, and counts of searches, empty searches, message opens, manual syncs, displayed errors and failing sources. Events carry the version, commit, OS, architecture and a random install ID, never query text, IDs or archive content. CI runs and non-release builds never send, and the CLI and TUI wait at most 50 ms for pending reports at exit.
Improvements
- Rerunning
import-whatsappon an AppleChatStorage.sqlitereads only chats that changed and writes only new and changed messages, and picks up senders thatLID.sqliteresolves later.--fullcompares every message, and--afterand--beforelet a first import fetch recent messages first. - Repeat
import-emlxruns skip unchanged Apple Mail files and write less to disk while still noticing late attachments.--full-reconcilerevisits every file, and--max-message-bytesraises the 128 MiB merge limit. - SQLite metadata searches use substring indexes. Initialization backfills them once, so large archives need extra startup time and disk space.
- Changing owned address...
v0.21.0
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 [email protected] --headlessormsgvault add-teams [email protected] --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...
v0.20.0
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 ...
v0.19.3
-
Start the API immediately while the analytics cache builds in the background.
-
Respect provider rate limits during Circleback syncs.
-
Improve daemon job scheduling and meeting import reliability.
-
Repair dangling message recipients automatically during database upgrades.
-
Prevent keyed-object Circleback insights from blocking sync.
-
Treat cooperative embedding scheduler yields as normal instead of job failures.
v0.19.2
-
Shows cache-building progress during daemon startup.
-
Bounds relationship index builds to improve resource usage and reliability.
-
Preserves checksum compatibility for automatic updates.
-
Accepts Fastmail pod-scoped JMAP API URLs.
v0.19.1
- Advance Slack
--limit 1sweeps beyond the certified overlap window. - Stop Windows daemons cleanly during releases.
- Recover interrupted releases from existing tags.
v0.18.0
-
Archive and browse Granola and Circleback meeting notes in the terminal UI.
-
Archive Beeper Desktop chats and media.
-
Install bundled agent skills for search, analytics, and attachment workflows.
-
Search within individual messages and access lexical or semantic search through MCP.
-
Retrieve archived attachments by hash through the REST API.
-
Build natively on Windows and download Windows ARM64 releases.
-
Store attachments in sealed content-addressed packs with pack, unpack, and repack maintenance commands.
-
Use Kit’s pack-based backup engine and restore attachment packs directly from backups.
-
Stream attachment reads to reduce memory usage.
-
Make SQLite restore integrity checks opt-in.
-
Import partial Apple Mail
.emlxfiles. -
Preserve correct IMAP high-water marks during fast sync.
-
Discover the daemon correctly when the home directory uses a symlink.
-
Enforce metadata-only and body-only search scopes consistently.
v0.17.1
-
Add web API endpoints for staging and managing deletions.
-
Add generated client support for the new deletion staging API.
-
Add CLI search status reporting for full-text search readiness.
-
Stop blocking CLI search while checking full-text index completeness.
-
Index deletion timestamps to improve daemon cold start performance.
-
Expand API server, CLI, setup, querying, vector search, and Teams documentation.
-
Migrate automated dependency updates from Dependabot to Renovate.
-
Update project dependencies.
-
Fix IMAP UID enumeration.
-
Improve IMAP raw fetch robustness.
-
Improve deletion manifest handling and API validation.
v0.17.0
-
Add
msgvault backupcommands for initializing, creating, listing, verifying, and restoring backups. -
Add Google Calendar sync support.
-
Add Microsoft Teams ingestion through delegated Microsoft Graph sync.
-
Add search and query filters by message type.
-
Add scoped embedding builds for rebuilding vectors over selected data.
-
Add OpenAPI daemon API docs and generated Go client support.
-
Move archive access to the daemon-only model, with CLI commands routed through daemon HTTP.
-
Skip unchanged IMAP folders during resync using
UIDVALIDITYandUIDNEXT. -
Improve
serve stopstatus messages by showing active daemon operations. -
Read large MCP message bodies in windows instead of all at once.
-
Replace the pending embeddings queue with per-message embedding generations.
-
Persist full-sync batch error counts.
-
Integrate the documentation site into the project, including CLI, API, setup, backup, calendar, and vector-search docs.
-
Add macOS installation instructions for Homebrew.
-
Finish the TUI migration to Bubble Tea v2.
-
Reject Gmail-only search operators in MCP list searches.
-
Re-probe Parquet schemas when the cache changes under a running query engine.
-
Prevent empty text or subject search terms from matching every message.
-
Preserve multiple Facebook Messenger attachments instead of collapsing them into one row.
-
Normalize imported message and reaction dates to UTC.
-
Avoid mixed SQLite access during TUI startup.
-
Fix API server documentation sidebar overflow.
-
Fix release publishing and Nix update flow.