Skip to content

Releases

v0.23.0

Choose a tag to compare

@wesm wesm released this 05 Nov 01:36
214e7bc

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-pocket and sync-pocket to 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-backup to 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_participants and max_media_mb, or pass --max-media-mb for 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 preview and inspect the reasons with person 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 track or person untrack.
  • Find archived chats across networks with find-chat and MCP find_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-text preserves the existing index; switching from another model asks before rebuilding it.
  • Connect an authenticated Streamable HTTP MCP client directly to msgvault serve at /mcp. Reads require the owner bearer key. --mcp-allow-writes enables a separate /mcp/writes catalog, 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 --query or literal, case-insensitive --address filtering. Address filtering is also available through the Directory API and MCP.
  • Inspect and save room policy overrides with msgvault policy list, set, and reset. 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-staged performs 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 optimize allows 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-full without 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_folders by 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_minute and restart the daemon to enable pacing. The default 0 leaves 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-message through the daemon. JSON output keeps HTML in body_html instead 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-restart to leave a self-started daemon stopped. Homebrew installations receive brew upgrade msgvault guidance 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 verify and 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 explicit mistral-ocr-4-0 setting, then run msgvault documents probe-mistral and msgvault documents consent-mistral again.
  • 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-derived removes 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:

Read more

v0.22.0

Choose a tag to compare

@cpcloud cpcloud released this 23 Oct 18:33
39f18b7

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 as CRON_TZ= 0 3 * * *, are rejected. Replace them first, for example with 0 * * * * and CRON_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.json the first time msgvault uses them. An older release cannot read that file, so before downgrading run msgvault 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-key and reuses it, so the Web UI asks for a login on 127.0.0.1 too.
  • msgvault now sends anonymous usage telemetry. Turn it off with [telemetry] enabled = false, MSGVAULT_TELEMETRY_ENABLED=0 or DO_NOT_TRACK=1.

New features

  • Archive joined Matrix and Element rooms from any homeserver with msgvault add-matrix --homeserver <url> --user-id <id> and sync-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-plaud and sync-plaud. --limit, --after, --full and --probe bound, 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-twenty and sync-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 with sync-muesli --watch or Muesli's completion hook.
  • Give Notion meeting attendees verified email addresses, guests included, by adding a workspace-users integration token as users_token on a [[notion_meetings]] entry, then rerunning sync-notion-meetings.
  • Archive Slack with a token limited to public channels, including channels you haven't joined; search:read is no longer required. Turn private channels on or off with [slack].private_channels or sync-slack --private-channels.
  • Search spoken words in recording transcripts with msgvault media search, MCP search_media and GET /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" and endpoint under [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 with account:[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 issues finds issues that already cite a message or file, and msgvault kata context reads 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 identities or GET /api/v1/people/{id}/identities, to pick an address for draft-compose --to.
  • Find people by name and read the messaging routes your archive has verified for a person through MCP find_contact_candidates and get_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-account adds --alias, --history-only and --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_command and 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_PORT and MSGVAULT_REMOTE_URL override config, iface:NAME binds to an interface's address, key files mount through api_key_file, MSGVAULT_REMOTE_API_KEY_FILE and mcp --http-token-file, and msgvault credentials set <id> --from-file stores 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/status or MCP get_embeddings_status.
  • Compare a new binary's expected archive version with the stored one using schema-version, then run migrate before 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-whatsapp on an Apple ChatStorage.sqlite reads only chats that changed and writes only new and changed messages, and picks up senders that LID.sqlite resolves later. --full compares every message, and --after and --before let a first import fetch recent messages first.
  • Repeat import-emlx runs skip unchanged Apple Mail files and write less to disk while still noticing late attachments. --full-reconcile revisits every file, and --max-message-bytes raises 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...
Read more

v0.21.0

Choose a tag to compare

@wesm wesm released this 02 Oct 22:26
598ca5c

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 --graph when IMAP is unavailable. Staged deletion supports these accounts, including moving messages to Deleted Items and permanent deletion. Deletion requires Mail.ReadWrite consent and that permission in the app registration.
  • Sign in to Microsoft 365 and Teams without a local browser using msgvault add-o365 [email protected] --headless or msgvault 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 .eml files with msgvault 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 --me and use --timezone when the export's timezone differs from your local zone.
  • Archive completed Muesli meetings, notes, transcripts, and later edits with add-muesli and sync-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 --connection or in Settings. sync-carddav without 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_origin and trusted_addresses locally before adding a private destination.
  • Accelerate SQLite semantic, hybrid, and similar-message searches with an approximate index and exact reranking. Run msgvault embeddings optimize to 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-writes flag. 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 status lists the names, email addresses, phone numbers, identifiers, scopes, and matching evidence sent to api.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 former upload_consent setting no longer permits uploads.
  • Select Slack direct conversations independently with [slack].dms and group_dms, or override either setting for one sync using --dms and --group-dms. Skipped conversations retain their incremental progress.
  • Query archive analytics through the advanced MCP query_sql tool on supported SQLite daemons.
  • Compare search rankings with Jev reranking using msgvault eval --rerank-jev. This sends queries and bounded message text to TypeSafe using TYPESAFE_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. --fresh requests 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 setup without 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 = false when 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_inline requires 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-emlx runs. 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-imessage without date filters or a message limit to correct an earlier import, retaining any original --db-path and --me options. 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...
Read more

v0.20.0

Choose a tag to compare

@wesm wesm released this 22 Sep 14:01
a36a394

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 ...
Read more

v0.19.3

Choose a tag to compare

@github-actions github-actions released this 09 Aug 14:15
e90bcdc
  • 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

Choose a tag to compare

@github-actions github-actions released this 09 Aug 03:00
13d6f4f
  • 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

Choose a tag to compare

@github-actions github-actions released this 08 Aug 01:33
a134376
  • Advance Slack --limit 1 sweeps beyond the certified overlap window.
  • Stop Windows daemons cleanly during releases.
  • Recover interrupted releases from existing tags.

v0.18.0

Choose a tag to compare

@github-actions github-actions released this 16 Jul 19:01
1a959f9
  • 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 .emlx files.

  • 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

Choose a tag to compare

@github-actions github-actions released this 07 Jul 03:24
f89dc5b
  • 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

Choose a tag to compare

@github-actions github-actions released this 05 Jul 00:46
18bede4
  • Add msgvault backup commands 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 UIDVALIDITY and UIDNEXT.

  • Improve serve stop status 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.