Skip to content

Open source · MIT · Cloudflare-native

Run your company's email on your own Cloudflare account.Then drive it with a client that's actually good.

Cirro Mail is the client layer on top of cloud-mail, an open-source mail system: the server runs on Cloudflare Workers, and your messages, attachments and sessions all live in your own account. One client, five platforms, with AI you bring yourself.

Free and open source. If you would rather not do it yourself, we deploy and migrate it for you.

A diagram: three separately deployed instances merging into one timeline

Your instance
A friend's instance
A second brand domain
  • 09:14Your instanceStatement — October
  • 09:02Friend's instanceContract attached
  • 08:47Second domainNew order #10231

Do the math first

Per-seat subscriptions scale with headcount — add a colleague, add a line item. Self-hosting does not work that way. Every number below is yours to fill in; we do not put anyone else’s price on this page.

20people

Take last month’s bill and divide it by your headcount.

(The Cloudflare tier converted at the current exchange rate)

Over a year

Traditional per-seat subscription

—/ year

seats × per-seat price × 12

Cirro Mail, self-hosted

Within the Cloudflare free tier

Difference

—/ year

The free tier is not unlimited: requests, storage and outbound messages all have quotas, and past them you move to the $5/month paid tier. For most teams of 5–50, day-to-day usage stays inside the free tier.

The per-seat price is editable. Put in what you actually pay, and the math becomes yours.

How this differs from traditional business email

Not the same thing for less money — five structural differences.

  • 01

    Priced by usage, not by head

    Fifty more mailboxes, three more domains, the bill barely moves. On a per-seat plan every new colleague is another line item.

  • 02

    Your mail stays in your own account

    Bodies in D1, attachments in R2, sessions in KV — all inside your Cloudflare account. Leaving means exporting your own database.

  • 03

    Domains and mailboxes, without a ceiling

    One deployment hosts several domains, and each user can add mailboxes and aliases beyond their primary address. On traditional email that is an upgrade.

  • 04

    The AI can be yours

    Endpoint, key and model are all yours to set, across three API shapes. Traditional email gives you either nothing, or one vendor-chosen model.

  • 05

    One client, every instance

    Your own instance and a friend’s can sit side by side, each with its own login, all receiving mail at once into a single timeline.

Not another mail app — a whole system you can hold yourself

On the left, the foundation. On the right, the surface you actually touch. Both are open source.

Server · cloud-mail

MIT licensed, running on Cloudflare Workers

  • Cloudflare Workers — no VPS, no SSH, no patches to apply
  • D1 for bodies, R2 for attachments, KV for sessions
  • Inbound mail arrives through Cloudflare Email Routing
  • Outbound goes through Cloudflare Email Service, falling back to Resend
  • One deployment, many domains
  • Admin console with an RBAC permission tree

Client · Cirro Mail

One codebase, five platforms: Android / iOS / macOS / Windows / Linux

  • Multi-instance: your instance and a friend’s, together
  • Native push, without exposing a port on your instance
  • Preview, save-as and share attachments
  • Lists and bodies cached locally, readable offline
  • No backend changes — it speaks the existing HTTP API
  • On desktop, closing the window keeps mail flowing
  1. Inbound message

  2. Cloudflare Email Routing

  3. Worker parses

  4. Body → D1 · Attachments → R2

  5. Forward to Telegram / another mailbox

    fans out in parallel

  6. webhook → push relay → FCM / APNs

  7. Phone notification

The path of one inbound message

AI

AI you plug in yourself, not a feature bolted on

The endpoint, the key, the model — all yours to set. We do not build models and we do not pick one for you.

Three API shapes, pick one

  • OpenAI-compatible
  • Anthropic
  • New API-style gateways

Your API key lives in the OS keychain — never on disk, never in logs.

Six things on the writing side

  • 01

    Rewrite a selection

    Polish, formalise, warm it up, tighten it, or translate either way.

  • 02

    Draft from bullet points

    Hand it a few points; get a whole letter back.

  • 03

    Inline continuation

    Stuck halfway? Let it pick up your tone and carry on.

  • 04

    Subject line

    The body is done and the subject is still blank.

  • 05

    Pre-send check

    Before it goes out, catch the missing greeting, attachment or recipient.

  • 06

    Reply openers

    A few ways to start the reply, before you commit to one.

Rewrite a selection — the first of six abilities.

Mail suggestions — the reading side

It reads the subject, sender and body, then streams back what the message is about and what you might do next: reply, forward, remind, delete, mark read, mark unread, star.

  1. 01Reads subject, sender, body
  2. 02Streams a summary and suggested actions
  3. 03Runs the one you pick

Reply and forward fill a real draft in the compose screen; a reminder becomes a real reminder with OS scheduling — not a paragraph for you to copy.

It will not handle your mail for you: no auto-execution, no batching, no caching. One message at a time, one action per click, and deletes ask again.

The suggestion panel — what it thinks you might do with this message.

Against AI in traditional email

You either have none, or you get the one vendor-chosen model and upload your content to it. Here you can switch it off, switch it out, or cap it with a daily call limit.

Why the client matters

The web app works. It just does not give you these.

Three panes — several instances living in one client.
  • 01

    Multi-instance, all receiving at once

    Your own instance and a friend’s, each with its own login, all receiving into one timeline — or filter down to just one.

  • 02

    Native push, no open ports

    Inbound mail reaches your phone’s notification shade, and tapping it opens that message. It goes through a self-hosted relay Worker — nothing exposed on your instance.

  • 03

    Office files never leave the machine

    docx, xlsx and pptx are parsed locally — no online preview service involved. Date columns show as dates, not as serial numbers.

  • 04

    Readable offline

    Lists and bodies are cached locally; messages you have already opened stay readable on a plane.

  • 05

    Five platforms, one codebase

    Android, iOS, macOS, Windows, Linux. On desktop, closing the window does not quit — mail keeps arriving and notifications keep firing.

  • 06

    It degrades against older instances

    If an instance lacks a feature, the client hides that part instead of failing.

Narrow layout: every instance merged into one timeline.
Multi-instance: separate logins, all receiving at once.
Office attachments are parsed locally — the file never leaves the machine.

Three steps — or hand it to us

Doing it yourself takes three things.

  1. 01

    A domain

    If you already have one, this step is done.

  2. 02

    Deploy the server

    Deploy cloud-mail into your own Cloudflare account, create the D1, KV and R2 bindings, then wire the domain up to Email Routing in the Cloudflare dashboard.

  3. 03

    Hook up sending and push

    Configure Resend for outbound (or use Cloudflare’s own mail service), and deploy a relay Worker for push to get your pairing code.

Rather not touch any of this?

We offer paid deployment and migration: domain setup, Resend configuration, getting push working, and bringing your history across.

Who it fits, and who it does not

This section matters as much as the ones above. Read it, and if it does not fit, that is fine.

Fits

  • You already own a domain
  • Per-seat pricing has worn you down, and the team keeps growing
  • No dedicated IT, and you would like to keep it that way
  • You are fine working through the web app plus this client
  • You care where your mail actually lives

Does not fit

  • You need IMAP / SMTP for Outlook or a native mail app — this system does not offer them
  • You need cc / bcc approval flows — the send API does not support them
  • You need very large attachments — there are per-message count and size limits
  • You need an SLA or a compliance certification — there are none
  • Nobody on the team wants to touch the Cloudflare dashboard — we can do it for you, but this is not a fully self-serve product for everyone

Let us be clear up front

These are the real boundaries of the system, not a disclaimer.

Can I connect Outlook or the built-in mail app on my phone?+

No. There is no IMAP or SMTP here: inbound goes through Cloudflare Email Routing, outbound through Cloudflare’s mail service or Resend. What you get is the web app and the Cirro Mail client.

Does it support cc and bcc?+

No. The send API takes a single recipient field, and the client says so plainly.

How large can attachments be?+

Up to 10 attachments and 10 inline images per message, with a 20 MB soft cap in total. The real constraint is the server: a Worker has 128 MB of memory and has to decode the attachments and hash them twice.

Will mail ever be missed?+

There is one specific gap: push only fires on inbound external mail. Messages sent within the system, or from another client, do not trigger it — those arrive on the client’s polling interval.

Where does my mail actually live?+

In your own Cloudflare account: bodies in D1, attachments in R2, sessions in KV. No third party reads your message bodies. Leaving means exporting your own database.

Do the AI features cost extra?+

They use your own key and your own model account, billed by that provider. The client lets you cap daily calls (200 by default, a soft warning rather than a hard block) or switch AI off entirely.

How many domains and mailboxes can it host?+

One deployment hosts several domains at once. Mailboxes and aliases are not capped by the software; an administrator sets quotas through role permissions.

Can a login get pushed out?+

Yes. The server keeps the 10 most recent sessions, and the 11th login drops the oldest. Worth knowing if several people share one account.

Do I need to change any backend code?+

No. The client touches zero backend code and speaks only the existing HTTP API.

Is there a web app?+

Yes — the admin console that ships with cloud-mail. Cirro Mail is the desktop and mobile client on top of it, and both see the same mail.

Deploy it yourself, or let us do it

Both roads end in the same place: your mail system, in your hands.