AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
Turn mbox and PST mailboxes into a static, Gmail-style website with full-text and semantic search. Parquet + DuckDB-WASM, no server.
Developer toolsTypeScript · PythonGitHub @rahimnathwaniOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Turn an mbox or PST file into a static website that looks and works like Gmail: conversations, labels, attachments, Gmail's search operators and in-browser semantic search. There is no server. The build writes Parquet files you can host on Cloudflare R2 or any static file host, and the viewer is a static site that queries them from the browser with DuckDB-WASM.
It was built for public-records and FOIA responses, which tend to arrive as a PST or mbox that most people can't open, let alone search or share.Read the full README ↗Turn an mbox or PST file into a static website that looks and works like Gmail: conversations, labels, attachments, Gmail's search operators and in-browser semantic search. There is no server. The build writes Parquet files you can host on Cloudflare R2 or any static file host, and the viewer is a static site that queries them from the browser with DuckDB-WASM.
It was built for public-records and FOIA responses, which tend to arrive as a PST or mbox that most people can't open, let alone search or share.
Try the live demo (a fictional mailbox, served exactly as the docs describe: viewer on Vercel, data on Cloudflare R2) · Documentation
uv tool install git+https://github.com/rahimnathwani/mailbox-viewer
Smart search embeddings and building the viewer need Node.js 20+; PST input needs readpst (brew install libpst). Or clone the repository and use uv run mbv, or use the Docker image. Details: getting started.
mbv build ~/Downloads/response.pst --slug county-2026-05 --title "County records, May 2026"
mbv preview # http://localhost:8000/county-2026-05
mbv publish county-2026-05 # upload to Cloudflare R2
Deploy the viewer once (Vercel, Netlify, GitHub Pages or any static host) with VITE_DATA_URL pointing at the bucket. From then on, each new mailbox is just build and publish. See publishing.
| Any mailbox export | .pst/.ost (via readpst), mbox, Maildir/Maildir++, .eml; several at once, deduplicated, folders kept as labels |
| Gmail's interface | Conversations, labels, stars, read state, keyboard shortcuts, dark mode, mobile layout |
| Gmail's search | from:, to:, subject:, has:attachment, filename:, before:/after:, label:, "phrases", -exclusions, OR (all operators) |
| Search inside attachments | Text extracted from PDF, Word, Excel, PowerPoint, RTF and attached emails |
| Smart search | A small embedding model runs in the browser and finds messages by meaning |
| Static and cheap | Opening a conversation fetches ~0.5 MB, even from a 50,000-message mailbox; nothing to run or patch |
| Safe by default | Email HTML is sanitized and sandboxed; remote images and tracking pixels stay blocked until you ask |
| Open data | Every mailbox is a set of documented Parquet tables anyone can query with DuckDB, Polars or pandas |
| Conversation | Search |
|---|---|
mbv build parses the mail, rebuilds conversations, extracts attachment text, and writes Parquet tables plus a word index sorted by term, so a search downloads only the few row groups that hold its words. Embeddings are computed with the same transformers.js model the browser later uses for queries. In the browser, DuckDB-WASM reads byte ranges of those files; nothing else is needed on the server. Architecture covers the design decisions, performance and security model.
There is no login: anyone with the link can read what you publish, so review a mailbox with mbv preview before publishing it. Nothing is redacted for you.
Bug reports and pull requests are welcome; see CONTRIBUTING.md. Please report security issues privately (SECURITY.md).