Envoir simulated network
Sovereign metadata-private

Welcome to Envoir — you are sovereign now.

Envoir verified
envoir@envoir.org · to you, wherever you run it
pre-alpha · reference client

Here's the one idea that changes everything: your key is your identity. Every other inbox is an account a company issues you and can revoke — this one starts from a keypair you generate yourself, before any provider is involved. name@domain is just a memorable pointer to it, like a phone number pointing at a person. No provider holds the key, so no provider can read your mail, and you can move your whole life to another provider — or your own domain — without losing a single message or contact.

Mail, chat, files, and calendar all resolve to that one identity, held on a node you run instead of a company. It's the open-source reference client for DMTAP, designed to move through a peer mesh and mixnet so watching the wires never reveals who's talking to whom. What's real today, honestly, below ↓

Try scrolling — every folder in the list to the left opens the section it names, exactly the way a real folder would.

— Envoir

Your address, the moment you generate a key — provider-issued or your own domain you@envoir.org  Same key underneath if it ever rotates — the address doesn't move. Why a name, not a key string →
EnvoirWhy different4 ideas

the crux why this isn't just another inbox

Every other inbox is a courtesy. This one starts from your key.

Four ideas do all the work. None of them are exotic on their own — the difference is that Envoir actually builds on them, instead of adding privacy as a layer on top of a rented mailbox.

Your key is your identity

Everywhere else, an account is something a company issues you and can revoke. Here the keypair comes first — you generate it before any provider is involved, and it's what every other name resolves to, not the other way round.

Your node is your provider

The address is a pointer to your key, not the key itself. Move to a different node, a different domain, even self-host tomorrow — the pointer gets republished and everyone still reaches the same you. Losing a provider was never supposed to mean losing an identity.

One object, every feature

Mail, chat, a shared file, a calendar invite — under the hood they're all the same sealed object (a MOTE), just rendered differently by the client. One identity, one mailbox, one set of devices, not a separate account and threat model per feature.

Useful with the mail you already have

Every DMTAP identity can also send and receive with ordinary SMTP inboxes through a gateway. You're not asking your contacts to migrate before you can use it — day one, it's already useful.

EnvoirYour addressspec §3.9 · §0.4

spec §3.9 · §0.4 your address

One key. One recommended address. Three layers of indirection between them.

The identity is always the key — that never casually changes. name@domain is the address you actually give people: human, and federated, so there's no single namespace to squat or fight over.

Only the middle layer — the key — is the thing that can't be taken from you. The name is convenience; the location is just where you happen to be right now.

A message between two DMTAP identities never touches a mail server. It's built, sealed, and routed hop-by-hop by the sender's own node:

the headline address · §3.9.1
Provider-issued you@envoir.org Free, handle-shaped, zero DNS work — yours the moment you claim it (Tier B, §3.8)
Your own domain you@yourbrand.com Full sovereignty; records auto-published, never hand-edited (Tier C, §3.8)

Both flavours are one format, reachable from Gmail and Outlook on day one, and survive key rotation and even a future post-quantum migration — the name binds to your identity's stable anchor, not to whichever key happens to be signing today (§1.5–§1.6, §3.9.1).

@handle @thisismyname Optional, opt-in global registry — first-come, small anti-squat cost, audited so it can't be silently repointed (§3.9.2)
Petname "Mom" → a key Local only — a name you give a contact; never leaves your devices (§3.9.3)
Alias / plus-address you+news@domain One identity, several names — even an old address you already own can be folded in once it's verified to point back at your key (§3.9.4)
EnvoirProduct tour11 screens

spec §2 · §5 · §8 · §13 the product

Mail, chat, files, and login — one key, no central provider

Everything below really is kind of the same object — a MOTE — rendered differently by the client. One identity, one mailbox, one set of devices, no separate service to trust per feature.

Same envelope, same seal, same keys — the client just decides how to draw it depending on kind.
Envoir mail: three-pane inbox. The open message shows a green "verified" badge next to the sender's name, and the message list shows a "legacy-origin" label on the one thread that crossed the SMTP gateway.
Mail. Three-pane inbox, threading, folders, star/archive/snooze. The verified badge means you've checked that sender's safety number; legacy-origin means the message crossed the SMTP gateway to reach you.
kind = mail · private tier is the design default

Mail

Rich compose, scheduled and undo send, color labels — over the same MOTE substrate as everything else, sealed end-to-end always; mixnet-routed once the mix workstream lands (today, delivery runs on the direct fast tier — see Honest status).

  • Real client protocols: JMAP natively, plus a genuinely complete IMAP/POP3/SMTP-submission surface (CONDSTORE, SEARCHRES, SORT/THREAD…) so existing mail apps just work.
  • A verified ✓ badge once you've checked a sender's safety number, and a plain legacy-origin marker on anything that crossed the gateway.
  • Calendar and contacts ride the same node as JSCalendar/JSContact MOTEs, with CalDAV/CardDAV compatibility.
Envoir chat: a direct-message thread with Ada Okonkwo, a green verified badge, an online-presence dot, and a Deniable 1:1 protocol indicator in the header. The thread discusses chat and mail being the same MOTE object.
Chat. DMs and channels riding the fast tier by default — the header states plainly which cryptographic mode a conversation uses.
kind = chat · fast tier · MLS or deniable 1:1

Chat

DMs and channels on the same substrate as mail — just a faster default tier. The two available cryptographic modes make genuinely different tradeoffs, so the client is explicit about which one's in use.

  • MLS group · signed — the default for channels and any group of three or more; strong forward secrecy and post-compromise security, but non-repudiable by design (RFC 9420).
  • Deniable 1:1 — an explicit, opt-in X3DH/PQXDH + Double Ratchet mode for conversations that need cryptographic repudiation; never a silent default.
  • Presence and typing indicators are opt-in and off by default — metadata Envoir doesn't turn on unless you ask.
Envoir files: a grid of files each showing a content hash prefixed b3:, an E2E badge, and two shared folders rendered as groups (DMTAP Core, Design Crit).
Files. Content-addressed by BLAKE3 hash (the b3: prefix), end-to-end encrypted, no protocol size cap. A shared folder is a group.
content-addressed · any size

Files

A BLAKE3 Merkle-DAG manifest over encrypted chunks — resumable, deduplicated, swarmed BitTorrent-style, and self-verifying. Drop a file into a shared folder, and everyone with membership can read it.

  • The file's key travels only inside the sealed MOTE that announces it — holders relay encrypted chunks blind, never able to read what they're serving.
  • Small and normal attachments keep the full mixnet privacy guarantee; only very large bulk transfers trade some of that for bandwidth — disclosed, not hidden.
  • Removing someone from a shared folder re-keys everything they had access to, by default.
Envoir identity page: sovereign identity card for Ada Okonkwo with key age, device count, and verified-contact count; a key-name naming ladder card; and a DNS-discovered ada@envoir.org address marked primary.
Identity. The naming ladder made concrete: a zero-authority key-name at the floor, DNS discovery layered on top, all pointing at one root key.
root key + device subkeys · §1 / §13

Identity

A safety number is a deterministic fingerprint of your whole keyset, rendered as words or a scannable grid so two people can verify each other's key out-of-band. The same keypair signs you into the web — no password, no central identity provider.

  • Root key held cold; each device carries its own signed subkey, so compromising one device never hands over the root, and revoking it is cheap and targeted.
  • Recovery is a first-class, versioned policy (phrase / devices / social guardians) with two deliberately asymmetric thresholds.
  • DMTAP-Auth: an origin-bound challenge signed by your key — phishing-resistant like a passkey, because a passkey is what gates it.
Key rotation, same address
Three different signing keys, one address the whole time — contacts who pinned the address never had to re-add you.
Bridging to legacy mail
The gateway's attestation is sealed inside the payload — so mail your node receives can prove whether it ever touched a gateway at all (see Traceability).

more of the app the rest of the surface

Compose, calendar, contacts, groups, and settings

EnvoirHow to use it6 steps

walkthrough how you'd actually use it

From nothing to a verified, sent message

Six real screens from the onboarding flow and the app itself — not a mockup of what it might look like eventually.

1

Generate a key

The client generates an Ed25519 keypair on your device and shows a recovery phrase once. Nothing is sent anywhere yet — there's no account to create, because the key is the account.

no server round-trip
Onboarding: Save your recovery phrase screen showing a 12-word demo phrase and a warning that anyone with the phrase can recover the identity.
Onboarding always renders dark, before the shell's own theme toggle exists — shown here as it actually appears, not faked light.
2

Claim your address

Pick a provider-issued handle or point your own domain at your key. The moment it's live, that's your safety number too — the same fingerprint two people compare to confirm they both pinned the real key.

key-name floor · zero authority
Onboarding: You're sovereign screen showing the new address ada@envoir.org, its fingerprint, algorithm Ed25519, and a scannable safety-number grid with word-coded verification.
The safety number is derived from the key alone — deterministic, unforgeable, and never used to route mail.
3

Add a contact, verify their safety number

Compare the word list or scan the grid with your contact, out-of-band — in person, on a call, wherever you already trust each other. That's the one gap first-contact pinning leaves open, and it's what closes it.

key verified
Envoir contact card showing a green Key verified confirmation after comparing a safety number out of band.
"You compared this safety number out-of-band, so a look-alike key would be detected." That line is the whole anti-phishing story.
4

Compose and send

Address it by name, key-name, ENS/SNS name, @handle, or a group address. Pick Private or Fast — the same tier choice you'll see again on every message you receive.

signed with your real key
Envoir compose window addressed from ada@envoir.org with a Private/Fast send-tier switch and a sealed/signed disclaimer.
Today: the client itself is honest about its own build — "sealed · signed with your real key · simulated delivery, connect your node to send for real."
5

What the recipient sees

A verified badge if they've already pinned your key, a legacy-origin label if it crossed a gateway, and — on any message — a transport-path panel showing exactly which trust boundaries it crossed.

legacy-origin, when it applies
Envoir inbox showing a received welcome message with a verified sender badge and a transport-path panel confirming pure-mesh delivery with no gateway attestation.
"Pure-mesh — never plaintext at a gateway": the absence of a gateway attestation is itself the proof.
6

See exactly what happened

Open the inspector on any message for the full picture: what the network could see, what's signed, and what's sealed for your eyes only — the three layers, laid out instead of asserted.

private · mixnet
MOTE inspector showing outer mixnet/sealed-sender layer, signed envelope layer, and end-to-end encrypted payload layer for a received message, with a simulated-network delivery path.
The delivery path shown here is explicitly labelled "simulated network" — see Honest status for exactly what that means today.
EnvoirTraceabilityspec §7

spec §7 transport-path provenance

Know which trust boundaries a message crossed — without weakening the mixnet

Every message you receive carries a recipient-only, verifiable record of what it crossed on the way to you: which privacy tier, and whether it ever touched a legacy gateway. That record never leaves your own devices.

Envoir's transport-path provenance panel: sender name, private-tier mixnet hop with a floor of at least 3 hops, an arrow to you on this device, and a green pure-mesh — never plaintext at a gateway attestation.
Sender → private-tier mixnet (≥3-hop floor) → you, this device. Green means no gateway ever touched it.

What you can learn about a message

  • Which tier it arrived on — the metadata-private private tier (mixnet + cover traffic) or the faster, direct fast tier — something your own node observed at receipt, not a claim the sender made.
  • Whether it's pure-mesh or gateway-touched. A gateway-touched message carries that gateway's cryptographic attestation, sealed inside the encrypted payload. A native message carries no such attestation — proof it was never plaintext at any gateway.
  • A coarse hop-count floor for the private tier (≥3 hops standard, ≥5 high-security) — never an exact path.

What it deliberately withholds: no individual mix node, no exact hop count beyond the profile floor, no per-hop timing — a record that could reveal more would be leaking the exact thing the mixnet exists to hide. This is also the same attestation an operator would bill against, so a gateway charge is independently checkable, never taken on faith.

EnvoirFeature parity52 features audited

spec §17 · sense-check feature parity

Checked feature by feature against the email you use today

52 mail, contacts, and calendar features, audited one at a time against the legacy inbox. Where DMTAP genuinely loses a capability, this says so.

34clean
same or better
16different
works, changed shape
2n/a
legacy premise doesn't survive — correctly
1harder
disclosed, not hidden
§17.1 · #36

Contact verification is the real upgrade

Legacy contacts are unauthenticated names. Here every contact is a key, audited by transparency logs and verifiable out-of-band — the one place parity wasn't the goal, improvement was.

§17.1 · #4

Search stays on your device

No provider ever builds a searchable index of your mail. Your always-on node indexes everything locally — the same capability as a server, just held by you instead of them.

§17.6

What's still open

Full-fidelity encrypted export/backup and a zero-setup org directory aren't fully specified yet — real gaps, tracked in the open spec rather than glossed over.

EnvoirHonest statusspec §6

spec §6 privacy, honestly

Metadata-private by architecture, not by promise

Content privacy is table stakes. DMTAP also treats the social graph itself — who talks to whom, when, how much — as something to protect.

Every message today ships on the solid line. The dashed line is the specified, roadmapped default — not something currently running.
  • Sealed sender

    Intermediaries relay a MOTE without ever learning who sent it.

  • Mixnet + cover traffic

    Onion-routed hops, mixing delays, and padding hide timing and size — email's tolerance for latency is what makes this affordable.

  • Push, not poll

    Your always-on node receives through the mixnet — there's no store-and-poll step for an observer to time.

  • Private lookups

    Name→key resolution is routed through the mixnet too, so the directory never learns who's asking about whom.

honest boundary · §6.6

DMTAP targets a global passive adversary — one that can watch traffic everywhere, but not inject, drop, or delay it at will.

  • A global active adversary with unlimited resources can still degrade anonymity — cover traffic and mixing approach a perfect defense asymptotically, never for free.
  • Large-file bulk transfer trades some of that protection for speed (the fast/onion tier, not the full mixnet) — a disclosed tradeoff, not a hidden one.
  • A seized or keylogged device exposes its whole synced mailbox, not a slice — mitigated by at-rest encryption and recovery, not eliminated.
  • v0 key transparency is tamper-evident, not yet equivocation-proof across multiple logs — a real, stated tension while KT gossip matures.
  • Today, only the fast tier actually runs end-to-end. node/src/onion.rs's Sphinx onion-wrap is a structural, keyed-BLAKE3 stand-in for the real mix cryptography (X25519/ChaCha20-Poly1305/LIONESS) — it models the cell layout and replay-freshness contract, not live mix crypto, and no mix network is deployed. The private tier above is this project's design target, tracked as the top roadmap item, not something delivered yet.

The protocol is specified so that private (full mixnet, minutes) is the eventual default and fast (direct, seconds) is the disclosed-cost opt-in; until the mixnet workstream above lands, every message actually ships on the fast tier. Honest, disclosed limits beat a marketing promise of "perfectly anonymous."

EnvoirSelf-hostingspec §12

spec §12 operators

Free to self-host, forever. Paid is optional — for not running it yourself.

Envoir is MIT-licensed end to end: protocol, node, gateway, and client. Nothing that matters is held back for a paid tier.

Self-host

$0 · your hardware
  • Run the node on a Pi, NAS, old laptop, or $2 VPS
  • Full protocol surface: mesh, mail/chat/files, MLS, DMTAP-Auth — nothing gated (the mixnet is a design target, not yet real — see Honest status)
  • Unlimited by default — the operator seam's self-host implementation is a no-op
  • MIT license, auditable top to bottom

Hosted operator

optional · none run today
  • Someone else runs the always-on node for you
  • Billing, quotas, and multi-tenant management
  • Same protocol, same client, same privacy guarantees
  • Never a crippled feature set — the paid thing is only running it

Both modes are the same code, talking through one documented contract — the dmtap-seam: metering, provisioning, policy, and gateway authorization. Self-host gets the unlimited defaults; a hosted operator implements the same seam without forking or gating the protocol.

what operators see the seam has two consoles

Domain admin, and fleet operator — neither one reads your mail

The org console administers names under a domain, never a sovereign member's key. The fleet superadmin view is explicitly content-blind — health and metering, never message content.

EnvoirTrustspec §0.5

spec §0.5 where state lives

Your key, not our servers

The middle of the network — mesh, mixnet, gateway — is built to hold no durable user data at all. Durability always lives at an edge you control.

StateLives onNotes
Keys, mailbox, files, retry queueyour nodeAll durable state — the edge, not the middle
Name → keyDNS + key transparencyStable; small; auditable for silent key swaps
Key → locationmesh DHTDynamic, signed, TTL'd, self-republished
In-flight ciphertextmixnet / relayHeld only until delivered — content-blind
Legacy reputationgatewayThe one real operational cost, if you bridge legacy mail
EnvoirGet startedMIT

start here

Run your own front door.

Two pieces of software, plus DNS you already have. The node holds the mailbox; the gateway is optional and only needed if you correspond with the legacy world.

pre-alpha — spec is detailed, reference implementation is a scaffold. not production-ready.
# build the workspace cargo build # run a reference node cargo run -p envoir-node -- --help # the web client needs no build step serve client/ with any static server
node: simulated b3:27e1adf8946a… fast tier Welcome pre-alpha envoir 0.1.0