Getting started
Claim an address and send your first encrypted message. Four steps, one signature, and gas as the only cost.
bMail runs entirely in your browser against contracts on BNB Smart Chain. There is nothing to install and no account to create: your wallet is the account.
What you need
Your mailbox key is derived from a signature only your wallet can produce. Hardware wallets work. Smart-contract wallets do not yet: they cannot produce the stable personal signature the derivation needs, and the app says so rather than hand you a key that changes underneath you.
1. Connect
Open the app and choose Connect wallet. If you are on another network, the app asks your wallet to switch to BNB Smart Chain, and to add it if you have never used it.
Connecting only reads your address. It moves nothing and costs nothing.
2. Sign once to unlock your mailbox
Your wallet's signing key protects your funds and cannot be used to encrypt. bMail derives a separate encryption key from a single signature, which your wallet displays in full before you approve it.
It is never broadcast, costs no gas, and moves nothing. It exists only to derive a key, which lives in the tab's memory and is never stored or sent anywhere. Close the tab and it is gone; reopen it and the same signature reproduces the same key.
Because the derivation is deterministic, the same wallet gives you the same mailbox on any device, with nothing to back up and nothing to sync.
Anyone who obtains that one signature can read every message sealed to that key. The warning is written inside the signed message so your wallet has to show it to you. If any other site asks you to sign it, refuse.
3. Claim your address
Type the name you want. The app checks it against the registry before you spend anything, and tells you if it is taken, reserved, or inside another owner's release window.
| Length | Fee | Plus |
|---|---|---|
| 5 characters and up | Free | gas only |
| 4 characters | 0.25 BNB | gas |
| 3 characters | 1 BNB | gas |
| 1 to 2 characters | Not available | |
Premium fees are one-off, set on chain, and can change. The app quotes you the current fee before you approve anything, and caps what you can be charged at the amount you were shown.
Names use a-z, 0-9 and single hyphens. Length is
counted without hyphens, so a-b-c is a three character name. Approve
the transaction and the name is minted to your wallet. No renewal, no rent.
4. Send something
Choose New message and address it by name or by wallet address. Before the transaction is built, the app resolves the recipient, fetches their published encryption key, and seals the subject and body in your browser. What reaches the chain is ciphertext.
Your wallet then asks you to approve one transaction. That is the whole cost.
What it costs
| Action | You pay |
|---|---|
| Claiming a 5+ character name | Gas only |
| Sending a message | Gas only, unless the recipient charges a stamp |
| Replying to a message someone paid to send you | Gas only, always |
| Reading your inbox | Nothing. Reads are queries, not transactions. |
| Receiving | Nothing. Only the sender pays. |
Reading your inbox
Messages are found by scanning the chain for events addressed to you, then decrypted in the tab. The first sync reads from the block the contracts were deployed at; after that only new blocks are read, so it stays quick.
Sync in the list header pulls anything new. Nothing arrives by push, because there is no server to push it.
Charging strangers to reach you
Under Settings you can set a stamp price. Anyone outside your contacts then has to escrow that amount to reach you. Answer them and it goes back automatically. Ignore them and after thirty days it is yours.
Contacts you allow always mail free, and answering someone who paid to reach you never costs you a stamp. Stamps has the full rules.
If something goes wrong
| What you see | What it means |
|---|---|
| Recipient not registered | That wallet has no published key, so there is nothing to encrypt to. They need an address first. |
| That name is reserved | Held back to stop impersonation. Pick another. |
| Wrong stamp | The recipient changed their price while you were composing. Reopen the message to re-quote it. |
| Blocked | They have blocked you. No price clears it. |
| Sync failed | A public node refused the query. Press Sync again; the app moves to another endpoint on its own. |
| It asks me to sign on every reload | Expected. The key is derived, never stored. |
Running your own copy
The client is static HTML, CSS and JavaScript with no build step, so any web
server can host it. Point app/js/config.js at the addresses on the
contract reference page and serve the directory.
Nothing about the protocol depends on our copy staying online. The contracts are the product; the interface is replaceable.