Documentation · Setup Guide · Interactive TUI
Alpha software. APIs, storage format, and CLI flags may change without notice. Back up your data.
Archive a lifetime of email. Analytics and search in milliseconds, entirely offline.
Your messages are yours. Decades of correspondence, attachments, and history shouldn't be locked behind a web interface or an API. msgvault downloads a complete local copy and then everything runs offline. Search, analytics, and the MCP server all work against local data with no network access required.
Currently supports Gmail and IMAP sync, plus offline imports from MBOX exports and Apple Mail (.emlx) directories.
msgvault serve instance or runs locallyfrom:, has:attachment, date ranges)macOS / Linux:
curl -fsSL https://msgvault.io/install.sh | bash
Windows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://msgvault.io/install.ps1 | iex"
The installer detects your OS and architecture, downloads the latest release from GitHub Releases, verifies the SHA-256 checksum, and installs the binary. You can review the script (bash, PowerShell) before running, or download a release binary directly from GitHub.
To build from source instead (requires Go 1.25+ and a C/C++ compiler for CGO and to statically link DuckDB):
git clone https://github.com/kenn-io/msgvault.git
cd msgvault
make install
Conda-Forge:
You can install msgvault from conda-forge using Pixi or Conda:
pixi global install msgvault
conda install -c conda-forge msgvault
Prerequisites: You need a Google Cloud OAuth credential before adding an account. Follow the OAuth Setup Guide to create one (~5 minutes).
msgvault init-db
msgvault add-account you@gmail.com # opens browser for OAuth
msgvault sync-full you@gmail.com --limit 100
msgvault tui
| Command | Description |
|---|---|
init-db |
Create the database |
add-account EMAIL |
Authorize a Gmail account (use --headless for servers) or add an IMAP account |
sync-full EMAIL |
Full sync (--limit N, --after/--before for date ranges) |
sync EMAIL |
Sync only new/changed messages |
tui |
Launch the interactive TUI (--account to filter, --local to force local) |
search QUERY |
Search messages (--account to filter, --json for machine output) |
show-message ID |
View full message details (--json for machine output) |
mcp |
Start the MCP server for AI assistant integration |
serve |
Run daemon with scheduled sync and HTTP API for remote TUI |
stats |
Show archive statistics |
list-accounts |
List synced email accounts |
verify EMAIL |
Verify archive integrity against Gmail |
export-eml |
Export a message as .eml |
import-mbox |
Import email from an MBOX export or .zip of MBOX files |
import-emlx |
Import email from an Apple Mail directory tree |
build-cache |
Rebuild the Parquet analytics cache |
update |
Update msgvault to the latest version |
setup |
Interactive first-run configuration wizard |
repair-encoding |
Fix UTF-8 encoding issues |
list-senders / list-domains / list-labels |
Explore metadata |
See the CLI Reference for full details.
msgvault can search your archive semantically using vector embeddings in addition to the default FTS5 keyword search. Point it at a self-hosted OpenAI-compatible embedding endpoint (Ollama, llama.cpp, LM Studio) and three surfaces accept either pure semantic search or BM25+vector fused via Reciprocal Rank Fusion:
msgvault search "..." --mode vector or --mode hybridGET /api/v1/search?q=...&mode=vector or mode=hybridsearch_messages tool with a mode argument set to vector or hybridA separate MCP tool, find_similar_messages, returns nearest neighbors for a seed message. See the Vector Search guide for setup, backfill, and troubleshooting.
Import email from providers that offer MBOX exports or from a local Apple Mail data directory:
msgvault init-db
msgvault import-mbox you@example.com /path/to/export.mbox
msgvault import-mbox you@example.com /path/to/export.zip # zip of MBOX files
msgvault import-emlx # auto-discover Apple Mail accounts
msgvault import-emlx you@example.com ~/Library/Mail/V10 # explicit path
synctech-sms)Msgvault can import XML backups produced by SMS Backup & Restore by SyncTech Pty Ltd. The Android app is listed in Google Play as SMS Backup & Restore and uses package com.riteshsahu.SMSBackupRestore; the Pro app uses com.riteshsahu.SMSBackupRestorePro.
Install the Android app on the phone that owns the messages, then configure a scheduled backup:
4:00 AM.Configure Msgvault to read that Drive folder:
msgvault add-synctech-sms-drive pixel \
--owner-phone +15550000001 \
--folder-id 1exampleDriveFolderId \
--google-account you@gmail.com \
--schedule "30 4 * * *"
The folder ID is the final path segment in a Google Drive folder URL. For example, in https://drive.google.com/drive/folders/1exampleDriveFolderId, the folder ID is 1exampleDriveFolderId.
Run the source immediately:
msgvault sync-synctech-sms pixel
You can also import local files, folders, or unencrypted ZIP backups:
msgvault import-synctech-sms --owner-phone +15550000001 ~/Downloads/sms-backup.xml
msgvault import-synctech-sms --owner-phone +15550000001 ~/Downloads/sms-backups/
msgvault import-synctech-sms --owner-phone +15550000001 ~/Downloads/sms-backup.zip
SMS and MMS messages appear in text-message search. Call logs are imported as searchable call records with message_type = synctech_sms_call, so missed and outgoing calls do not mix into normal text threads.
Msgvault stores Google OAuth refresh tokens under the Msgvault home directory with file permissions restricted to the current user. Tokens and client secrets are not written into config.toml, logs, README examples, or exported fixtures.
All data lives in ~/.msgvault/ by default (override with MSGVAULT_HOME).
# ~/.msgvault/config.toml
[oauth]
client_secrets = "/path/to/client_secret.json"
[sync]
rate_limit_qps = 5
See the Configuration Guide for all options.
Some Google Workspace organizations require OAuth apps within their org.
To use multiple OAuth apps, add named apps to config.toml:
[oauth]
client_secrets = "/path/to/default_secret.json" # for personal Gmail
[oauth.apps.acme]
client_secrets = "/path/to/acme_workspace_secret.json"
Then specify the app when adding accounts:
msgvault add-account you@acme.com --oauth-app acme
msgvault add-account personal@gmail.com # uses default
To switch an existing account to a different OAuth app:
msgvault add-account you@acme.com --oauth-app acme # re-authorizes
Workspace admins can use a Google service account with domain-wide delegation instead of per-user OAuth tokens:
[oauth.apps.acme]
service_account_key = "/secure/path/service-account.json"
In Google Admin Console, authorize the service account client for https://www.googleapis.com/auth/gmail.readonly and https://www.googleapis.com/auth/gmail.modify. If you will run delete-staged with permanent deletion, also authorize https://mail.google.com/. Keep the key file owner-only, for example chmod 600 /secure/path/service-account.json.
msgvault add-account you@acme.com --oauth-app acme
msgvault sync-full you@acme.com
msgvault includes an MCP server that lets AI assistants search, analyze, and read your archived messages. Connect it to Claude Desktop or any MCP-capable agent and query your full message history conversationally. See the MCP documentation for setup instructions.
Run msgvault as a long-running daemon for scheduled syncs and remote access:
msgvault serve
Configure scheduled syncs in config.toml:
[[accounts]]
email = "you@gmail.com"
schedule = "0 2 * * *" # 2am daily (cron)
enabled = true
[server]
api_port = 8080
bind_addr = "0.0.0.0"
api_key = "your-secret-key"
The TUI can connect to a remote server by configuring [remote].url. Use --local to force local database when remote is configured. See the Web Server reference for the HTTP API.
Join the msgvault Discord to ask questions, share feedback, report issues, and connect with other users.
git clone https://github.com/kenn-io/msgvault.git
cd msgvault
make install-hooks # install pre-commit hook (requires prek)
make test # run tests
make lint # run linter (auto-fix)
make install # build and install
Pre-commit hooks are managed by prek (brew install prek).
MIT. See LICENSE for details.
$ claude mcp add msgvault \
-- python -m otcore.mcp_server <graph>