Skip to content

Public Rust crates

mxr is shipped as one binary. Most workspace crates stay private on purpose.

Four smaller email contracts are public Rust crates because they are useful outside mxr and have their own conformance story.

Terminal window
cargo tree -p mxr-search -i mail-query
cargo tree -p mxr-sync -i mail-threading
cargo tree -p mxr-mail-parse -i list-unsubscribe
cargo tree -p mxr-export -i mailbox-formats

What you get: the exact registry crate version currently wired into this mxr checkout.

Do not assume the newest crates.io release is the version mxr consumes. Docs-only and metadata patch releases can ship without requiring mxr to move immediately. Check the two surfaces separately:

Terminal window
# Version pinned by this mxr checkout:
cargo tree -p mxr-search -i mail-query
# Registry metadata from Cargo's local index/cache:
cargo info mail-query

What you get: the app-consumed version first, then Cargo’s registry metadata for the package. If you need the release-sensitive newest version, confirm on crates.io as well.

CrateContractmxr consumer
mail-queryGmail-style search parser and typed ASTmxr-search
mail-threadingRFC 5256 / JWZ client-side threadingmxr-sync
list-unsubscribeRFC 2369 / RFC 8058 unsubscribe header parsingmxr-mail-parse
mailbox-formatsmbox variants and Maildir reader/writermxr-export

Add the package you need:

Terminal window
cargo add mail-query
cargo add mail-threading
cargo add list-unsubscribe
cargo add mailbox-formats

What you get: the standalone package, not the mxr daemon, store, or provider model.

The crate owns the portable contract. mxr owns local execution policy.

mail-query, for example, parses Gmail-style search syntax into an AST. mxr then maps that AST onto SQLite, Tantivy, and semantic search. Parser support does not always mean Gmail-identical execution over local data.

Inspect the two sides separately:

Terminal window
cargo info mail-query
rg -n "mail_query|register_filter|QueryNode" crates/search

What you get: package metadata from crates.io, then the mxr-specific execution layer that consumes it.

When one of these crates publishes a new patch, update package docs in the standalone crate repo first. Then decide whether mxr needs a dependency bump.

Terminal window
rg -n "mail-query|mail-threading|list-unsubscribe|mailbox-formats" \
Cargo.toml Cargo.lock README.md docs site/src/content/docs

What you get: every mxr doc or manifest that names the public crates. Patch claims about mxr’s consumed version only when Cargo.toml or Cargo.lock changes.