{"id":"01a0baed-8531-7f94-807c-65b5283d16bf","slug":"emailflare","name":"EmailFlare","oneLiner":"Transactional email API and shared team inbox built on Cloudflare Email Sending, Email Routing and D1","logoUrl":"https://www.emailflare.dev/favicon.svg","primaryCategory":{"slug":"email","name":"Email"},"services":[{"slug":"workers","name":"Cloudflare Workers","shortName":"Workers"},{"slug":"static-assets","name":"Workers Static Assets","shortName":"Static Assets"},{"slug":"d1","name":"Cloudflare D1","shortName":"D1"},{"slug":"r2","name":"Cloudflare R2","shortName":"R2"},{"slug":"kv","name":"Workers KV","shortName":"KV"},{"slug":"durable-objects","name":"Durable Objects","shortName":"Durable Objects"},{"slug":"queues","name":"Cloudflare Queues","shortName":"Queues"},{"slug":"email-workers","name":"Email Workers","shortName":"Email Workers"},{"slug":"cron-triggers","name":"Cron Triggers","shortName":"Cron"}],"deploy":"cli","hasOneClick":false,"licenseName":"MIT","licenseClass":"open_source","freeTierStatus":"paid_plan_required","isTested":false,"lastTestedAt":null,"stars":252,"isArchived":false,"publishedAt":"2026-10-02T22:28:39.740Z","contentUpdatedAt":"2026-10-05T13:27:44.211Z","latestCommitAt":"2026-09-20T08:23:20Z","screenshot":{"url":"/media/apps/01a0baed-8531-7f94-807c-65b5283d16bf/01a0fec9-5cf0-783c-9211-d8f3d5482968.png","alt":"EmailFlare Inbox landing page with a mockup of the conversation list and a contact thread"},"sourceHealth":"healthy","shortDescription":"EmailFlare is two Workers. The emailflare-api Worker sends mail for applications through Cloudflare Email Sending and has an admin panel. The emailflare-inbox Worker receives mail through Email Routing into a shared dashboard where a team replies and manages contacts.","longDescription":"The sending half is a Hono API with a React admin panel bundled into one Worker. The panel manages sending domains, templates, scoped API keys and suppressions, and shows send logs and stats. Applications send mail by calling POST /v1/send. Audience lists add RFC 8058 one-click unsubscribe headers; a recipient who unsubscribes is suppressed for every later send.\n\nOn the receiving side, mail arrives through Cloudflare Email Routing at an email handler on the inbox Worker, gets threaded into conversations, and several users reply from a shared dashboard. Contacts, lists and outbound sequences cover the CRM part. Attachments go to R2. Every five minutes a cron trigger finds due sequence steps, and a Queue consumer sends them. A Durable Object pushes real-time notifications to the dashboard.\n\nBoth Workers keep their data in D1. They rate-limit logins with a KV namespace and API calls with the Workers Rate Limiting binding. Separate just recipes set up each Worker by creating the Cloudflare resources, applying migrations, setting secrets and deploying, and a GitHub Actions workflow can deploy later updates.\n\nEach product also runs as a single Docker container with embedded SQLite for VPS hosting; in that mode the inbox also needs Redis.","useCases":["Send transactional email from an app through a REST API with scoped keys","Share one inbox on a custom domain across a team, with threaded replies","Run outbound email sequences with one-click unsubscribe","Manage templates, suppressions and send logs from one admin panel"],"targetAudience":"Developers and small teams who want a self-hosted sending API and shared team inbox in their own Cloudflare account","knownLimitations":"Receiving needs Email Routing enabled on a domain in the Cloudflare account.\nThe runtime Cloudflare API token needs Zone, DNS and Email Routing permissions.\nThe GitHub Actions workflow only updates Workers that the local setup already created.","editorialNote":null,"ownershipDisclosure":null,"homepageUrl":"https://emailflare.dev","demoUrl":null,"docsUrl":"https://github.com/0xdps/emailflare/blob/trunk/docs/CLOUDFLARE.md","repository":{"provider":"github","owner":"0xdps","name":"emailflare","url":"https://github.com/0xdps/emailflare","defaultBranch":"trunk","stars":252,"forks":37,"openIssues":47,"licenseSpdx":"MIT","isArchived":false,"latestRelease":null,"latestReleaseAt":null,"latestCommitAt":"2026-09-20T08:23:20Z","metadataFetchedAt":"2026-10-07T03:55:56.273Z"},"secondaryCategories":[{"slug":"customer-support","name":"Customer Support & Shared Inbox"}],"servicesDetailed":[{"slug":"workers","name":"Cloudflare Workers","shortName":"Workers","detectionKind":"explicit","note":null},{"slug":"static-assets","name":"Workers Static Assets","shortName":"Static Assets","detectionKind":"explicit","note":null},{"slug":"d1","name":"Cloudflare D1","shortName":"D1","detectionKind":"explicit","note":null},{"slug":"r2","name":"Cloudflare R2","shortName":"R2","detectionKind":"explicit","note":null},{"slug":"kv","name":"Workers KV","shortName":"KV","detectionKind":"explicit","note":null},{"slug":"durable-objects","name":"Durable Objects","shortName":"Durable Objects","detectionKind":"explicit","note":null},{"slug":"queues","name":"Cloudflare Queues","shortName":"Queues","detectionKind":"explicit","note":null},{"slug":"email-workers","name":"Email Workers","shortName":"Email Workers","detectionKind":"inferred","note":null},{"slug":"cron-triggers","name":"Cron Triggers","shortName":"Cron","detectionKind":"explicit","note":null}],"connectors":[],"externalRequirements":[],"deployMethods":[{"id":"01a0baf0-dd23-75b2-8c39-eb1d2e0cf46c","methodType":"cli","url":null,"command":"just install\njust emailflare-api-worker-login\ncp scripts/config.example.toml scripts/config.toml\njust emailflare-api-worker-setup","docsUrl":"https://github.com/0xdps/emailflare/blob/trunk/docs/CLOUDFLARE.md","branch":"trunk","isOneClick":false,"isPrimary":true,"requiredPlan":"Workers Paid","notes":"Fill in scripts/config.toml before running setup. After the first deploy, set admin_origin and public_url to the Worker URL and run setup again. The inbox Worker deploys with just emailflare-inbox-deploy and also needs VAPID keys in the config."}],"deployRequirements":[],"bindings":[{"bindingType":"d1_databases","bindingName":"DB","resourceName":"emailflare"},{"bindingType":"durable_objects","bindingName":"NOTIFICATIONS","resourceName":"NotificationsHub"},{"bindingType":"kv_namespaces","bindingName":"RATE_LIMIT_KV","resourceName":null},{"bindingType":"queues.consumers","bindingName":null,"resourceName":"emailflare-inbox-sequences"},{"bindingType":"queues.producers","bindingName":"EMAIL_QUEUE","resourceName":"emailflare-inbox-sequences"},{"bindingType":"r2_buckets","bindingName":"ATTACHMENTS","resourceName":"emailflare-inbox-attachments"}],"envVars":[],"screenshots":[{"id":"01a0fec9-5e29-7048-9b5d-ac35a55d84ef","url":"/media/apps/01a0baed-8531-7f94-807c-65b5283d16bf/01a0fec9-5cf0-783c-9211-d8f3d5482968.png","width":1440,"height":900,"altText":"EmailFlare Inbox landing page with a mockup of the conversation list and a contact thread","isPrimary":true,"sourceType":"upload"},{"id":"01a106ca-066b-72b1-b290-88bf92e2eff9","url":"/media/apps/01a0baed-8531-7f94-807c-65b5283d16bf/01a106ca-04c2-75c4-94fe-abfba20778d6.png","width":1440,"height":900,"altText":"EmailFlare homepage with a diagram connecting an app, the EmailFlare API and Cloudflare Email","isPrimary":false,"sourceType":"upload"},{"id":"01a106ca-0ab2-7e48-8eac-6b22a7aeb7ae","url":"/media/apps/01a0baed-8531-7f94-807c-65b5283d16bf/01a106ca-0764-7680-8946-86a05c241f0c.png","width":1440,"height":900,"altText":"EmailFlare homepage section comparing its two products, the transactional email API and the team email inbox","isPrimary":false,"sourceType":"upload"}],"licenseUrl":"https://github.com/0xdps/emailflare/blob/300d35bb97ba0d5515c624c5822287a7ae7eadc6/LICENSE","freeTierNote":"Cloudflare Email Sending to arbitrary recipients needs Workers Paid, which includes 3,000 emails a month and charges $0.35 per 1,000 after that. Sends to verified destination addresses are free on every plan and do not count toward the quota.","freeTierSourceUrl":"https://developers.cloudflare.com/email-service/platform/pricing/","freeTierCheckedAt":null,"setupComplexity":"medium","setupComplexityNote":"There is no Deploy to Cloudflare button: you install Node.js 18+, pnpm and just, fill a config file with secrets and a Cloudflare API token, run the setup recipe twice, and connect a domain for sending and for Email Routing.","verification":{"status":"untested","testedAt":null,"versionRef":null,"deploymentMethod":null,"coreUseCase":null,"publicNote":null,"resources":[],"steps":[],"screenshots":[],"staleReason":null},"alternatives":[{"slug":"amazon-ses","name":"Amazon SES"},{"slug":"brevo","name":"Brevo"},{"slug":"mailchimp-transactional","name":"Mailchimp Transactional Email"},{"slug":"mailersend","name":"MailerSend"},{"slug":"mailgun","name":"Mailgun"},{"slug":"mailjet","name":"Mailjet"},{"slug":"mailtrap","name":"Mailtrap"},{"slug":"postmark","name":"Postmark"},{"slug":"resend","name":"Resend"},{"slug":"sendgrid","name":"SendGrid"}],"sources":[{"sourceType":"repository","url":"https://github.com/0xdps/emailflare","lastSeenAt":"2026-10-07T12:17:16.007Z"},{"sourceType":"homepage","url":"https://emailflare.dev","lastSeenAt":"2026-10-07T03:45:49.657Z"},{"sourceType":"docs","url":"https://github.com/0xdps/emailflare/blob/trunk/docs/CLOUDFLARE.md","lastSeenAt":"2026-10-07T03:45:49.657Z"}],"lastSourceRefreshAt":"2026-10-07T03:55:56.273Z","lastReviewedAt":"2026-10-02T22:28:39.740Z","seoTitle":"EmailFlare: email API and team inbox on Cloudflare","seoDescription":"EmailFlare is a self-hosted transactional email API and shared team inbox on Cloudflare Workers; sending through Email Sending needs Workers Paid.","changeEvents":[{"id":"01a0febb-dd1c-774a-873a-21e1dc4925ba","kind":"listed","summary":"EmailFlare listed","createdAt":"2026-10-02T22:28:39.740Z","app":{"slug":"emailflare","name":"EmailFlare"}}]}