A Gmail client you run yourself. Your inbox, your server, your AI key — Volt never sees your credentials in the clear, never touches your inference bill, and never sends an email without you clicking send.
Every fast, AI-powered email client on the market asks you to hand your inbox to someone else's cloud. Volt doesn't. It's a single Docker Compose stack you run on your own machine: Postgres, a Go backend, a Next.js frontend. Your Gmail token and AI key are encrypted with a passphrase only you know — not stored anywhere, not recoverable if you lose it, gone from memory the moment the process restarts.
If that sounds like more responsibility than a hosted inbox, it is. That's the trade this project makes on purpose.
- Keyboard-first.
j/kto move,xto archive,sto star,zto undo,/to search,⌘Kfor everything else. Press?any time for the full list. - Bring your own AI key. Claude, OpenAI, Gemini, Groq, Kimi, or OpenRouter — pick one, paste a key, it's verified against the provider before it's ever saved. Summarize a thread, draft a reply, search your inbox in plain English, or just ask the sidebar chat what's going on — it can see your recent inbox, not just your last message.
- Send later, split inbox, follow-up nudges. Newsletters sort themselves out of your primary view automatically. Threads you sent and never heard back on resurface after a few days. None of this needs AI — it's just paying attention to headers Gmail already gives you.
- Real attachments. View what people sent you, attach files to your own replies, both go over actual MIME — not a workaround.
- A native MCP server. Point Claude Code or Cursor at your own running instance and ask it to read, search, organize, or draft in your real inbox. There is no send tool. There has never been a send tool. That's not a missing feature, it's the whole point.
- No read receipts. Not deferred, not on a roadmap — Volt doesn't do open tracking, full stop.
Every prompt Volt uses — for summarizing, drafting, searching, chatting —
lives in docs/prompts/ as plain text files, loaded from
disk at runtime. Not a string buried in code, not a black box: open
/prompts in the running app and read the exact words your AI provider
receives before you send it anything.
One command, one machine, nothing else to manage:
curl -fsSL https://volt-xi-rust.vercel.app/install.sh | bashNo GitHub clone, no manual .env editing. The script needs Docker
already installed and running, clones Volt into ~/.volt, and opens
localhost:3000 once it's healthy. It'll ask for your Google OAuth
client the first time you open the app, no config file editing.
Don't have Docker yet? Grab Docker Desktop first, it's free.
Rather read the script before piping it into bash, reasonable instinct:
curl -fsSL https://volt-xi-rust.vercel.app/install.sh -o install.sh
less install.sh
bash install.shUpdate: volt update — pulls the latest release, rebuilds, restarts.
Your data and passphrase are untouched.
Uninstall: volt uninstall — stops the stack, removes ~/.volt.
Nothing else was touched on your system.
git clone https://github.com/Nishal77/volt && cd volt/deploy
cp .env.example .env # add your own Google OAuth client
docker compose up --buildFull walkthrough: docs/SELF_HOSTING.md.
Something broke? docs/TROUBLESHOOTING.md.
Your Gmail token and AI key are encrypted with AES-256-GCM. The key that encrypts them is never written anywhere — not the database, not an env var, not disk.
Instead, it's derived from a passphrase you choose on first run, using Argon2id (the same memory-hard KDF libsodium uses for this exact job), and held only in the server process's memory for as long as that process lives. Restart the container and the key is gone. You unlock again with your passphrase before Gmail or AI features work — every time, no exceptions, no backdoor.
Practically: someone with your database dump and your server still can't read your credentials. The key only ever existed in your head and briefly in memory. If you lose the passphrase, there's no recovery — that's not a bug, it's what "zero-knowledge" actually has to mean.
Full writeup: docs/decisions/0003-zero-knowledge-vault.md.
list_inbox · get_thread · search_inbox · draft_reply
archive_thread · star_thread · mark_thread_read
Seven tools, all read/organize/draft. No send_email tool exists in this
codebase, on purpose — an AI can help you triage and write, but a human
being clicks send. Setup: mcp-server/README.md.
Go (Gin) on the backend, Next.js on the frontend, Postgres for storage,
Docker Compose to run it all. Every architecture decision that mattered
enough to argue about is written down in
docs/decisions/ — not after the fact, the same day it
was made.
Issues and PRs welcome. There's no separate contributing guide yet — for now, open an issue before a big PR so the direction's agreed on first.
Apache 2.0 — see LICENSE.
