mrkeyoor.com_
Thu 24 Sept 23:59 UTC
Dataevaluationupdated 26 Aug 2026

msgvault review

msgvault is a local archive for email, chat, calendar events, meeting notes, contacts, and attachments. It syncs or imports data into SQLite and content-addressed storage, then provides offline search, DuckDB analytics, a Web UI, a TUI, and MCP access.

+5stars / 7d
Verdict

Our msgvault build took 128 seconds, and the test run timed out at 900 seconds with 34 passed and 6 failed packages reported. It is one of the more ambitious personal-message archives, especially for people who need several sources, attachments, local analytics, and MCP in one place. Use it only with verified backups and source-by-source spot checks while the project labels itself alpha and current import defects remain open.

We ran it

Lab card: what happened when we ran msgvaultScreenshot of msgvault (msgvault.io)
Install✓ · 76s346 packages
Build✓ · 128s
Tests✗ timed out · 900s34 passed · 6 failed of 40 (go test)
Repo2080 files~779,715 lines of source · 32.2 MB · 8 CI workflows · Dockerfile

Answers from our run

Does msgvault build from source?

Dependencies installed in 76 seconds (346 packages), and the build succeeded in 128 seconds. We cloned commit aaff9f8 into a clean Debian container with 3 CPUs and no project-specific setup.

Do msgvault's tests pass?

Not all of them: 34 of 40 passed and 6 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use msgvault?

Anyone unwilling to run alpha storage software: the README says APIs, storage format, and CLI flags may change without notice.

What are the alternatives to msgvault?

Piler, ArchiveBox, Google Takeout. Our msgvault build took 128 seconds, and the test run timed out at 900 seconds with 34 passed and 6 failed packages reported.

Setup2/5Release install is simple; source build and provider setup are extensive
Docs5/5Detailed source, OAuth, search, backup, storage, TUI, and Web UI guides
Community4/52,039 stars and active August 2026 issue and pull request work
Maturity2/5Alpha storage format with a 900-second timed-out test run

Who it’s for

People consolidating years of Gmail, IMAP, Slack, Discord, Teams, calendars, and exported mail.
Researchers who need local full-text search and analytics across several message sources.
Self-hosters willing to manage OAuth apps, tokens, a daemon, backups, and attachment storage.
Claude Code, Codex, or MCP users who want controlled archive search through bundled skills and tools.

Who it’s NOT for

Anyone unwilling to run alpha storage software: the README says APIs, storage format, and CLI flags may change without notice.
PST users who require reliable conversation grouping today: issue #690 reports missing message identifiers and 7% to 12% of conversations split in one archive.
Archives that cannot tolerate partial MIME parsing: issue #692 says one malformed attachment type can leave a message unsearchable, though pull request #695 proposes recovery.
Teams expecting a quick green source check: our test command timed out after 900 seconds with 34 passed and 6 failed packages reported.

Setup reality

Our sandbox completed dependency installation in 76 seconds with 346 packages, then built in 128 seconds. The Go test command hit the 900-second cap after reporting 34 passed packages and 6 failed out of 40. The log tail identifies internal/granola as failed but does not show its assertions.

Gmail and Calendar need a Google Cloud OAuth app; Teams, Slack, Discord, CardDAV, Granola, Circleback, and Beeper each need their own access setup. Vector search requires a configured embedding endpoint and explicit modes.

Source builds require Go 1.27 or newer, Bun 1.3.14 or newer, a C/C++ compiler, and CGO for static DuckDB linking. Release binaries avoid that toolchain. The Dockerfile helps deployment, but archives, tokens, attachments, and backups still need durable protected storage.

One archive can hold mail, chats, calendars, and meetings

msgvault supports live sync from Gmail, IMAP, Google Calendar, Teams, Discord, Slack, CardDAV, Granola, Circleback, and Beeper Desktop. Offline import paths cover MBOX, Apple Mail EMLX trees, PST files, SMS Backup & Restore XML, and common chat exports.

The storage model keeps message metadata and search indexes in SQLite, uses DuckDB and Parquet for analytics, and deduplicates attachments by SHA-256. Sealed packs reduce filesystem overhead for large attachment collections. The daemon owns archive writes so CLI commands do not open competing SQLite writers. That is thoughtful engineering for long-running sync, but it also means the daemon, database, token directory, and attachment tree must be backed up as one system.

Offline is the default, with explicit paths back to networks

After data is downloaded, keyword search, analytics, the TUI, Web UI, and MCP server work against the local archive without mailbox access. Remote deployment is self-hosted rather than a msgvault cloud service. All data lives under ~/.msgvault by default, with owner-only token files for OAuth and CardDAV credentials. These defaults make local control believable instead of a label applied to a hosted account.

Network boundaries return when you sync or enable optional intelligence. Gmail and Calendar require a Google Cloud OAuth credential; the README estimates about 5 minutes for that setup. Slack, Discord, Teams, meeting tools, CardDAV, and Beeper have separate authorization paths. Semantic or hybrid search sends query text to the configured embedding provider, while lexical search remains local. Treat each connection as a separate consent and retention decision.

What happened when we ran it

Our sandbox installed 346 packages in 76 seconds and used the Go 1.24 image specified in the measurement. The build completed in 128 seconds. The checkout contained 2,080 files, about 779,715 source lines, and 32.2 MB, with 8 CI workflow files and a Dockerfile. It did not have a top-level tests directory, which is normal for Go packages that keep tests beside implementation files.

The Go test command did not finish within the 900-second cap. Before timeout, the harness reported 34 passed packages and 6 failed out of 40. The final lines show internal/granola failing after slow SQL logs, while gvoice, HTTP retry, identity index, identity operations, IMAP, and iMessage packages passed in that portion. The supplied tail does not contain the Granola assertion or justify a cause.

Our 3-CPU, 8 GB unprivileged container had no secrets and did not sync a live account. We did not measure search latency, import throughput, storage savings, or archive correctness. The project README now requires Go 1.27 or newer plus Bun 1.3.14 and a C/C++ compiler for source builds. Release binaries are the lower-effort evaluation path, while contributors inherit CGO and DuckDB compilation.

Search is broad, but import fidelity decides whether it can be trusted

FTS5 supports Gmail-like fields such as sender, attachments, and dates. Vector search adds pure semantic or hybrid retrieval through an OpenAI-compatible embedding endpoint, with Reciprocal Rank Fusion combining lexical and vector results. Scoped embeddings require a matching message-type filter, preventing a partial vector index from being presented as complete archive coverage. That safeguard is important for mixed archives.

Input quality remains the harder problem. Issue #690 reports a 46 GB PST import where message and reply identifiers were empty across 75,188 messages, splitting an estimated 7% to 12% of conversations. Issue #692 reports malformed attachment content types causing the whole parsed message to become an unsearchable placeholder, although raw MIME is retained. Pull request #695 proposes continuing with a generic binary type for recoverable parts.

MCP access makes private history available to agents

The MCP server can expose archive search, analytics, attachments, and semantic retrieval to Claude Desktop and other clients. Bundled skills target Claude Code and Codex. This can answer questions across years of correspondence without pasting mailbox exports into a chat session. It also turns a private archive into a high-value tool endpoint whose client permissions and logs deserve the same attention as the underlying token files.

Run MCP locally where possible, restrict tool access to the people and applications that need it, and test deletion and source filters. A prompt can request more history than a user intended even when the server is functioning correctly. Semantic search may also contact an embedding service. Keep lexical mode as the default for sensitive work unless the selected endpoint and consent settings are acceptable.

Backups are part of normal operation, not disaster cleanup

msgvault has append-only backup repositories with create, list, verify, and restore commands. Packed attachments are supported directly, while an unpack command provides a downgrade path and requires exclusive local access with the daemon stopped. Those details are good signs for an archive product, because storage maintenance and recovery are first-class commands rather than manual SQLite copying.

The README's alpha warning still governs adoption. Back up before upgrades, verify snapshots, and restore one into a separate home directory before trusting the only copy. After each source import, compare counts and spot-check threads, attachments, dates, and deleted records. A successful sync is not enough when current reports show that raw bytes can survive while searchable structure or conversation grouping is wrong.

v0.19.3 is active and still changing core behavior

GitHub recorded 2,039 stars, 96 combined issues and pull requests, and a last push on August 26, 2026. Release v0.19.3 was published August 9 with background analytics-cache building, Circleback rate-limit handling, daemon scheduling work, and repair for dangling recipients. Current development includes people profiles, document vectors, Web UI changes, deletion scopes, and parser fixes.

That pace is impressive for a repository created in January 2026, and it confirms the alpha label. Choose msgvault for a personal or research archive where you can inspect results and keep independent source exports. Compliance retention or the only copy of irreplaceable history calls for a more settled system, external backups, or both. The 900-second test timeout should be resolved in your target build before unattended upgrades.

Alternatives

ProjectWhat it isPick it when
PilerA self-hosted email archiving and search system built for centralized retention.pick this instead when organizational email compliance matters more than personal multi-source chat and calendar history.
ArchiveBox gh↗A self-hosted web archiver for URLs, pages, media, and documents.pick this instead when websites and bookmarks are the archive, rather than mailboxes and conversations.
Google TakeoutGoogle's export service for downloading mailbox and account data snapshots.pick this instead when a periodic portable export is enough and you do not need unified live search or sync.

What people are saying

  1. [github-trending] kenn-io/msgvault

Sources

  1. msgvault README
  2. msgvault v0.19.3 release
  3. Issue 690: PST conversation splitting
  4. Issue 692: malformed MIME handling
  5. Pull request 695: malformed MIME recovery
  6. msgvault OAuth setup guide

More data reviews

go-stock · sqlitebrowser · hydradb · DouYin_Spider · helix-db · abu · the whole board →