Unlimited users, mailboxes, aliases and domains, hosted entirely in your own free Cloudflare account.
No per-seat fees, no servers to run, no vendor holding your mail.
Features · Screenshots · Deploy · Roadmap · Contributing
Warning
OpenInbox is in beta. It may have bugs and needs extensive testing. Try it on a spare domain before you rely on it for important mail. See Project status.
- Why OpenInbox
- Who it's for
- Features
- Screenshots
- How it works
- Deploy
- Free-tier limits
- Use it responsibly
- Updating
- Troubleshooting
- Roadmap
- Project status
- Contributing
- License
Business email usually costs a few dollars per user per month, every month. OpenInbox gives you the same thing for free: one Cloudflare Worker and one D1 database, deployed into your Cloudflare account with a single click. You own the data and the domains, and adding the tenth or the hundredth user costs nothing.
| Typical hosted email | OpenInbox | |
|---|---|---|
| Price | Per user, per month | Free on Cloudflare's free plan |
| Users and mailboxes | Paid seats | Unlimited |
| Domains and aliases | Often capped | Unlimited |
| Where your mail lives | The vendor's servers | Your own Cloudflare account |
| Source code | Closed | Open source (MIT) |
| Who | What OpenInbox gives them |
|---|---|
| Solo and indie developers | you@yourproduct.com for every side project, without paying for each one |
| Small businesses and startups | Shared support@, sales@ and billing@ for a growing team, with no per-seat bill |
| Freelancers, agencies and consultants | Mail for several brands or client domains, managed from one place |
| Open-source projects, nonprofits and communities | Role addresses and shared inboxes on a zero budget |
| Families and personal domains | A mailbox for everyone on yourname.com |
| Privacy-minded people and self-hosters | Mail in your own account, running code you can read |
OpenInbox is built for everyday conversations. It is not a bulk or marketing sender (see Use it responsibly).
- Receive on any domain in your Cloudflare account. Email Routing is set up for you.
- Send through Resend, Brevo, Mailjet, Cloudflare Email Sending or any SMTP server. When one provider hits its free limit, mail falls back to another.
- Threads, All Mail, search (
from:has:attachmentbefore:), labels, filters, snooze, scheduled and undo send. - Command palette and keyboard shortcuts, dark mode, mobile layout.
Teams
- Unlimited users, with personal and shared inboxes.
- Aliases,
you+tag@addressing and catch-all.
Admin
- Dashboard with traffic, free-tier usage and delivery and audit logs.
- Domain health checks with one-click repair. DNS records (SPF, DKIM, DMARC) are written for you.
Security
- HTML mail is sanitized and sandboxed, and remote images are blocked until you allow them.
- Mail that fails SPF, DKIM or DMARC goes to Spam.
- Optional two-factor sign-in. Stored credentials are encrypted.
Click any screenshot to open it full size.
![]() Inbox, light |
![]() Inbox, dark |
![]() Composer |
![]() Command palette |
Admin
![]() Overview, light |
![]() Overview, dark |
![]() Mail flow |
![]() Users |
![]() Domains |
![]() Integrations |
Everything runs inside your own Cloudflare account. There is no OpenInbox server in between.
| Part | What it does |
|---|---|
| Cloudflare Email Routing | Receives mail for your domains and hands it to the Worker |
| One Worker | Runs the web app, the API, inbound mail handling and scheduled jobs |
| One D1 database | Stores mailboxes, messages, users and settings |
| A sending provider | Delivers outgoing mail (Resend, Brevo, Mailjet, Cloudflare or SMTP), with fallback between them |
| R2 (optional) | Keeps large attachments |
- A free Cloudflare account, with a domain on Cloudflare's nameservers.
- A GitHub account.
- A free account with a sending provider. This is only needed to send; receiving works without one. To send through Cloudflare itself instead, the account needs the Workers Paid plan.
1. Click Deploy to Cloudflare, then Deploy. The form asks for nothing else. Keep the default names or change them.
2. Open the Worker's workers.dev address. The setup page asks for a Cloudflare API token, which OpenInbox uses to set up Email Routing and DNS for you. Click Create token: Cloudflare opens with every permission filled in, so you only click Continue to summary → Create Token and paste the token back. It is stored encrypted.
Tip
If the Worker shows no workers.dev URL, turn it on in the Worker's Settings → Domains & Routes.
Important
Connecting the token creates your recovery key and shows it once. Save it in a password manager. You paste it to finish setup, and it is the only way back into the owner account if you lose your password.
3. Follow the setup page. It checks the token's permissions, creates your admin account and connects your domain.
4. Connect a sending provider in Admin → Integrations.
Each screenshot shows one step of a real deploy. Click one to open it full size.
The token's permissions (filled in for you by this link)
| Scope | Permission | Access | |
|---|---|---|---|
| Zone | Zone | Read | required |
| Zone | DNS | Edit | required |
| Zone | Zone Settings | Edit | required: turn on Email Routing |
| Zone | Email Routing Rules | Edit | required |
| Account | Workers Scripts | Edit | required |
| Account | Account Settings | Read | recommended |
| Zone | Workers Routes | Edit | optional: app on mail.yourdomain |
| Zone | Analytics | Read | optional: delivery log |
| Account | Email Routing Addresses | Edit | optional: forwarding |
| Account | Email Sending | Edit | optional: send through Cloudflare |
| Account | Account Analytics | Read | optional: usage on the dashboard |
| Account | Workers R2 Storage | Edit | optional: attachments bucket |
| What | Free limit |
|---|---|
| Worker requests | 100,000 / day per account |
| D1 storage | 500 MB, roughly 50,000–100,000 messages |
| Incoming message size | 25 MB |
| Sending | Resend 100/day, Brevo 300/day, Mailjet 200/day; Cloudflare 3,000/month on Workers Paid |
Mail is stored text-only by default, and attachments are kept only on messages under 950 KB. To keep every attachment, turn on R2 storage in Admin → Integrations → Attachments. R2 has a 10 GB free tier, but Cloudflare requires a payment method on the account first.
Caution
OpenInbox is for real conversations with people who expect to hear from you. It is not a tool for cold outreach, bulk marketing, purchased lists or spam automation, and it must not be used that way.
- Provider bans. Resend, Brevo, Mailjet and other providers have strict anti-spam and acceptable-use policies. High bounce or complaint rates, unsolicited mail, or getting around daily limits (for example by opening many free accounts) can get your sending account suspended or permanently banned. It can also hurt your domain's reputation, so that even your normal mail lands in spam.
- Cloudflare's terms apply too. Abusing Email Routing or Workers can get features or your whole account restricted.
- Stay within the free tiers. If you genuinely need more volume, move to a paid plan with your provider rather than stretching free accounts.
- Follow anti-spam laws such as CAN-SPAM, GDPR and CASL. Send only to people who agreed to hear from you, and honour unsubscribe requests.
You are responsible for the mail you send. The OpenInbox maintainers accept no liability for suspended accounts, blocked domains or misuse.
Updates are manual: your instance only changes when you choose to update it. When the admin overview shows a new version, read its release notes, then in your copy of the repo on GitHub run Actions → Sync upstream → Run workflow. Cloudflare redeploys automatically, and the Worker applies any database migrations itself.
If your copy was created before automatic updates were removed, its workflow still has a weekly schedule. Once it has synced to a version with this change, those scheduled runs do nothing; you can also delete the schedule: lines from .github/workflows/sync-upstream.yml.
Note
Don't click the Deploy button again to update. It creates a second, separate instance.
| Problem | What to do |
|---|---|
| Mail not arriving or not sending | Start with Admin → Domains → Check health and Admin → Mail flow |
| Locked out of the owner account | On the sign-in page, choose Owner locked out? and enter the owner email and your recovery key |
| "A repository with that name already exists" on the Deploy form | An earlier deploy already made that repo. Change Project name, or update the existing instance instead |
These are planned or in progress and are not available yet:
- Inbox API: a REST API with per-user API keys to list, read, search and send mail, so apps, scripts and automations can use your mailboxes.
- AI email writing with Cloudflare Workers AI: draft replies, rewrite or shorten text, change tone and summarize long threads, using Workers AI's free daily allowance in your own account.
- Webhooks for incoming mail.
Ideas and pull requests for any of these are welcome.
OpenInbox is young and under active development. It may have bugs and needs extensive testing across different domains, providers, mail clients and Cloudflare account setups before you rely on it for important mail.
- Try it on a spare domain first.
- Keep your recovery key safe.
- Open an issue when something breaks.
The project is open for collaboration. Testers, bug reports, fixes, new sending providers and help with the roadmap are all very welcome.
Contributions of every size are welcome: testing on your own domain, bug reports, docs fixes, UI polish, new sending providers (each one is a single adapter in src/worker/providers/) or work on the roadmap.
- Open an issue to report a bug or discuss a larger change before you start.
- Fork the repo and set up the development environment below.
- Before opening a pull request, run
npm run lint && npm run typecheck && npm test && npm run test:e2e.
npm ci
# create .dev.vars with the lines below
npm run db:migrate:local
npm run dev:mock # terminal 1: mock Cloudflare and provider APIs on :8790
npm run dev # terminal 2: app on http://localhost:5173Local .dev.vars (never put real credentials here):
ENCRYPTION_KEY=any-long-random-string-for-local-use
CF_API_TOKEN=dev-token
CF_API_BASE=http://127.0.0.1:8790/cf
RESEND_API_BASE=http://127.0.0.1:8790/resend
BREVO_API_BASE=http://127.0.0.1:8790/brevo
MAILJET_API_BASE=http://127.0.0.1:8790/mailjet
GITHUB_API_BASE=http://127.0.0.1:8790/github
WORKER_NAME=openinboxReport security issues privately through GitHub's Security → Report a vulnerability, not in a public issue.


















