░░░ ░░░
▒▒▒ ▒▒▒
▓▓▓ ▓▓▓▄▄
▄██▀██▄ ███ ███ ▄██▀██▄ ███ ███ ▄██▀██▄ ███ ▄██▀██▄ ▄██▀██▄ ▄██▀██▄ ▄█▄ ▄█▄
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███▀███
███ ▀▀▀ ███ ███ ███ ▀▀▀ ███▀██▄ ▀██▄▄▄ ███ ███ ███▀▀▀▀ ▄▄▄███ ███ ███
███ ███ ███ ███ ███ ███ ███ ███ ▄▄▄ ███ ███ ▄▄▄ ███ ███ ███ ███ ███ ███ ███
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
▀██▄██▀ ▀██▄███ ▀██▄██▀ ███ ███ ███ ▀██▄██▀ ▀██▄██▀ ███ ▀██▄██▀ ▀██▄███ ███ ███
█▀ ▀█ █▀ █▀ █▀ ▀█ ▀█ █▀ ▀█ █▀
▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄| 1. invitation | ........................... | an admin creates a single-use invite. no public signups, no randoms, no mystery meat accounts. |
| 2. registration | ........................... | you pick a strong password/passphrase (16+ chars) and enroll TOTP in your authenticator app. |
| 3. identity | ........................... | your browser generates keys: an ML-DSA-87 auth key for login signatures and an ML-KEM-1024 + X448 mailbox key for encrypted messages. private keys stay with you; the server stores public keys. |
| 4. activation | ........................... | verify TOTP, get recovery codes, and store your local private keys safely on your device(s). Private keys stay in your browser (encrypted in IndexedDB) and are never uploaded; the server stores public keys only. Lose your keys and encrypted mail cannot be decrypted — that’s the deal. |
| 5. login | ........................... | three checks: password (Argon2id), signed challenge (ML-DSA-87), then TOTP/recovery. no password-only vibes. |
| 6. mailbox | ........................... | messages are stored as encrypted envelope objects. your unlocked identity decrypts in the browser; the mailbox UI renders plaintext/HTML safely (sanitized, sandboxed). |
Argon2id password hashing, mandatory TOTP, ML-DSA-87 challenge-response signatures, CSRF checks, HttpOnly/SameSite sessions, rate limits, separate admin auth.
Per-message envelope encryption (CME1) with ML-KEM-1024 + X448 hybrid key agreement, HKDF-derived wrapping, AES-256-GCM content encryption, key IDs, ciphertext object storage.
Database holds metadata/indexes/refs. Ciphertext objects hold encrypted message payloads/summaries. Mailbox storage APIs are ciphertext-oriented. 256 MiB hard quota per account.
Folders, flags/read state, aliases, compose mock/local encrypted send, export, delete/trash, downloads/attachments handling, quota display, HTML/plain viewing.
Localhost SMTP ingestion abstraction and IMAP ciphertext gateway for development. Conventional IMAP/SMTP clients won’t transparently decrypt custom envelopes. External delivery is mocked in dev.
Plain HTML, CSS, and vanilla JS (OG.im-style static vibe), Go templates, Go/WASM crypto helper, system monospace font. No React circus.
| smtp ingestion | ........................... | if normal unencrypted SMTP mail arrives and the server encrypts it, the ingestion path can see plaintext before storage. stored encrypted != magically invisible in transit. |
| custom crypto | ........................... | the envelope/hybrid construction is project-specific and needs independent review. it’s built to be careful, not crowned by a wizard. |
| interop | ........................... | custom ciphertext envelopes aren’t drop-in compatible with mainstream clients. for outside email, conventional providers and trust boundaries apply. |
| metadata | ........................... | routing metadata, sizes, timestamps, access patterns, and operational traces can still leak information. encryption-at-rest is not a cloaking device. |
| clients/backups | ........................... | a compromised browser/device, stolen identity backup, bad passphrase hygiene, or XSS/runtime compromise can ruin anyone’s day. protect the keys. |
| admin | ........................... | admin can invite, suspend, delete, and inspect operational status/audit metadata — but has no supported mailbox decryption function. |