ztrash.com is a disposable email inbox paid for with shielded ZEC
I built a disposable-email service where the only way to activate an inbox is a shielded Zcash payment. No accounts, no signup, no email-for-an-email nonsense. Plus no ads or trackers paying the bills, because you do ($1 for 24 hours, $4 for a week, and $12 for the month [30 days]).
How it works (screenshots below)
- Hit Generate. You get two credentials, mirrored from Zcash itself: a public address (
xyz@ztrash.comreceives, safe to share) and a secret viewing key (zvk1...reads, never share). Shown exactly once. - Send exactly the amount for the chosen tier in (this is converted automatically for you based on a price oracle), shielded ZEC, to the unified address on screen.
- The payment shows up as “detected in mempool” within seconds, counts down confirmations live, and the inbox goes active in ~5 minutes.
- Mail arrives in real time. Verification codes get auto-extracted with a copy button. After 24 hours, the inbox and every message in it are permanently deleted.
Why I hope the community likes this:
- Shielded-only payments. Transparent or deshielded sends don’t activate anything. Each inbox is a fresh diversified address (Sapling + Orchard receivers in a ZIP-316 unified address) of a single ZIP-32 account. Payment detection is server-side trial decryption of compact blocks with the account IVKs (e.g. the same way your wallet finds its own notes).
- The server cannot spend. It holds only a unified full viewing key. The spending seed was generated offline and has never touched the box.
- Viewing keys for email. The address/viewing-key split you know from Zcash, applied to an inbox: knowing the address lets the world send you mail; only the viewing key reads it. The server stores a hash of the key so it can’t recover, reset, or email it to you. Your private link keeps the key in the URL fragment, which never leaves your browser in a request.
- No third-party mail pipeline. Inbound SMTP is built into the same Rust binary and is receive-only. There is no Mailgun/SES/relay seeing your mail, and nothing to abuse for sending spam.
- Hosted in Iceland on a privacy-focused provider (1984.hosting), paid for like everything else here. DNS is plain grey-cloud records and traffic does not transit a CDN.
- Nothing to subpoena. No accounts, no access logs, no archives. Expiry is a hard delete, and it runs on schedule whether anyone asks or not.
Real limitations
- Receive-only. You can’t send from a ztrash address (that’s what keeps it spam-proof).
- 24-hour lifetime, 1-hour payment window. Burn after reading is the product, not a bug.
- Lose the viewing key, lose the inbox. That’s the point.
Stack, for the curious: Rust + Axum, compact-block scanner and mempool watcher over lightwalletd gRPC, Postgres, React. Self-hosting a Zebra/Zaino node is on the roadmap once volume justifies it.
Would love feedback from this community especially on the payment UX and anything you’d want hardened further or new ideas that you might have!
EDIT: a few things have shipped since I posted this.
Mail is encrypted at rest now. Each inbox has an X25519 keypair derived from its viewing key. The server only holds the public half, so it seals incoming mail and can’t open what it just wrote. Sender, subject, body, and attachment filenames are all ciphertext. Decryption happens in your browser. A seized disk or me running SELECT * FROM emails gets you sealed boxes, and backups are payment records only, no mail in them at all.
The viewing key never reaches the server. Stronger than what I wrote above. The zvk1... key is generated in your browser now. Only a hash and a derived public key get sent at creation, and reads authenticate with a derived token (zvt1...) instead of the key itself. I’m not storing a hash of something I received. I never receive it.
STARTTLS on inbound SMTP, plus MTA-STS. Senders that support it now deliver over an encrypted hop instead of cleartext. I don’t reject plaintext senders at the server, since that would bounce older mail servers and lose you mail. The MTA-STS policy at mta-sts.ztrash.com is the right way to get enforcement: senders that implement it (Gmail, Outlook) refuse to deliver in the clear, and senders that don’t are unaffected, so nothing gets dropped. It’s in testing mode while TLS reports come in, then it goes to enforce.
Sender authentication. SPF, DKIM, and DMARC get checked on arrival and the verdict is sealed with the message. A sender only shows as “verified” on a DMARC pass. An SPF pass authenticates the SMTP envelope, not the From: you actually see, and treating it as verification is how a forged sender ends up looking legitimate. Anything I couldn’t check reads as unverified, not as fine.
To be clear: this is encryption at rest, not end-to-end. Mail arrives over SMTP in the clear, so the server sees plaintext for the moment it takes to parse and seal it, and I’m the one serving you the web client. It covers disk seizure, stolen backups, a compromised database, or an operator reading the tables. It doesn’t cover a hostile operator.









