Mailda

Shared inboxes that know who replied.

Mailda turns an email address into governed work. Who is answering, whether anybody has, what a rule held back and why. It runs in your own Cloudflare account, so you own the domain, the messages, the keys and the bill. There is no Mailda service to depend on, no licence server, no telemetry. Disconnect us and nothing stops working.

For the owner Workers Paid is the one thing it needs: $5 a month, 3,000 emails included, then $0.35 per thousand. A twenty-person team sending ten thousand a month pays about $7.45. Inbound mail is unlimited. Not for newsletters; not for Outlook. Open source, Apache-2.0.

Install it Put it in your AI

mailda doctor functional alpha what is built, what is thin, and the page that holds each claim to account

  1. ok install Three commands into your own Cloudflare account: deploy, claim, point a domain. The first install measured 108 s; a second Node in the same account is a name. onboarding-journey.md
  2. ok receiving Shared inboxes with a queue: claim, hand over, close, a first-response clock per mailbox. Threads, labels, read state, search over subjects, senders and bodies. application-shell.md
  3. ok mail_security The receiving server's SPF/DKIM/DMARC verdict on every message; attachments judged by name and magic bytes; links judged against what they say and your own domains; quarantine and suppression, both per mailbox. No model. mail-security.md
  4. ok sending Every send is sealed to a manifest first, then held for fifteen seconds, then dispatched. Policies, approvals with two people, domain pauses, rate breakers, a suppression list the provider's own bounces build. send-breakers.md
  5. ok butlers Programs that act on mail: deterministic, refused at publication if they cannot afford to run, paused if they loop, released by a person before anything leaves. The llm.* node types are declared and refused. butler-engine.md
  6. ok your_ai A contract-generated SDK, an agent Skill and an MCP server, every one derived from the same route registry. Agents hold a pinned ceiling of capabilities and an org.admin can never be minted. machine-surfaces.md
  7. ok governance An audit trail nothing trims, matters, legal holds two people lift, supervised reads that leave a record, e-discovery exports approved before they run. supervised-access.md
  8. ok custody Evidence sealed under keys only your Node holds, escrowed to ten recovery codes; a backup you can verify offline; a restore drilled three times, once through to receiving mail. disaster-recovery.md
  9. warn a_restore_has A restore has worked three times, and once through to receiving mail. Three drills (#92): cross-account on 2 September; a real backup on 15 September; and on 16 September a same-account restore that took a domain, wrote its own routing through the restored grant, and accepted a message from outside, with four defects found in the receiving step and fixed. Scale, half… README
  10. warn deployment_promotes_on Deployment promotes on its own, measured twice. mailda deploy does expand/contract with a canary and refuses to promote a version whose doctor is worse than the incumbent's (#98). Preview URLs do not exist for a Worker with Durable Objects, so the canary is reached by a version override on the production hostname, and on 17 September that… README
  11. warn a_second_node A second Node in one account is a name. mailda deploy --name <worker> derives the config (Worker, Workflow and WORKER_NAME together) into a git-ignored file beside wrangler.jsonc and deploys from it; every other resource derives from the name (receipt: first install 108 s). Deploying a second Node without --name is still refused when the… README
  12. warn mail_security_is Mail security is thin. The receiving server's SPF/DKIM/DMARC verdict is read, stored and shown on every message since 17 September (docs/mail-security.md), deterministic, no model. Attachments are judged by name and by magic bytes (executable, script, disguised, archive, plain), listed on every message and read by Butler guards. README
  13. warn the_mail_client The mail client is thin. Since 17 September: read/unread per person, Cc/Bcc and reply-all with the original quoted, hand a case to a colleague by their address (audited), download one attachment (recorded as an export; a flagged part is served as octet-stream), a drafts strip that resumes any draft, retry/resend from the… README
  14. warn ai_is_reserved AI is reserved, not built. The Butler engine is deterministic and the llm.* node types are declared and refused. There is no provider configuration, prompt versioning, cost governance or evaluation. README
  15. report receipts Every limit, cost and timing in the product has a receipt saying how it was measured and when it goes stale. The build refuses a constant without one. docs/receipts/

The warn rows are the README's own words. A vendor's page would leave them off. Read the whole status before you rely on any of this.

Three commands, one afternoon

export CLOUDFLARE_ACCOUNT_ID=<your account>
node packages/cli/src/mailda.mjs deploy --url https://<your-node>.workers.dev
node packages/cli/src/mailda.mjs claim-secret

Then open the Node, claim it, and point a subdomain at it from Setup. The Node writes the Cloudflare records through its own grant, reads them back, and refuses if they are not there. If you would rather arrange the account by hand, the dashboard path is written down too. Every setting it needs, in one page.