{"id":14537707,"url":"https://github.com/giuseppelt/EmailFlare","last_synced_at":"2025-09-02T19:33:21.714Z","repository":{"id":186128066,"uuid":"670703661","full_name":"giuseppelt/EmailFlare","owner":"giuseppelt","description":"Send emails from your domain through Cloudflare for free. Self host on your account.","archived":false,"fork":false,"pushed_at":"2023-09-11T01:35:26.000Z","size":150,"stargazers_count":309,"open_issues_count":4,"forks_count":24,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-05-20T04:03:33.756Z","etag":null,"topics":["bun","cloudflare","email","react","typescript","webapp","worker"],"latest_commit_sha":null,"homepage":"https://emailflare.breakp.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/giuseppelt.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-07-25T16:32:47.000Z","updated_at":"2025-05-06T21:39:50.000Z","dependencies_parsed_at":null,"dependency_job_id":"e73aae17-4598-4021-9826-d1c58ae884cc","html_url":"https://github.com/giuseppelt/EmailFlare","commit_stats":null,"previous_names":["giuseppelt/emailflare"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/giuseppelt/EmailFlare","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giuseppelt%2FEmailFlare","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giuseppelt%2FEmailFlare/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giuseppelt%2FEmailFlare/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giuseppelt%2FEmailFlare/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/giuseppelt","download_url":"https://codeload.github.com/giuseppelt/EmailFlare/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/giuseppelt%2FEmailFlare/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273340286,"owners_count":25088335,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-02T02:00:09.530Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bun","cloudflare","email","react","typescript","webapp","worker"],"created_at":"2024-09-05T10:01:27.927Z","updated_at":"2025-09-02T19:33:21.359Z","avatar_url":"https://github.com/giuseppelt.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# EmailFlare ✉️✨\n\n\u003e\n\u003e **Note**\n\u003e Follow me on [@giuseppelt](https://twitter.com/giuseppelt) where I publish updates and collect feature requests and issues\n\u003e\n\n\u003e\n\u003e **Note**\n\u003e A full tutorial on how to copy and setup your own EmailFlare for your domain is available at [blog post](https://www.breakp.dev/blog/email-flare-send-from-worker-for-free/)\n\u003e\n\n\n## What is EmailFlare?\n**EmailFlare** allows you to send emails from your own domain through Cloudflare for free.\n\nAs open-source MIT-licensed software, you can host your own EmailFlare on your domain and keep everything in control.\n\nIt provides:\n- a simple email composer\n- markdown support to enrich text with simple formatting, links ...\n- configurable sender list, ex: **hello**@domain.com, **contact**@domain.com, ...\n- auto deploy on your Cloudflare account\n- you can host it on https://**email**.domain.com (subdomain configurable)\n\n![EmailFlare Composer](./assets/emailflare-composer.png)\n\n## Builder\nEmailFlare provides a [simple builder](https://emailflare.breakp.dev/builder) to create your own EmailFlare and download the code.\n\nYou don't need to clone the repo, build, customize and run anything. Just use the UI configurator and click the _Download_ button to get the code.\n\n![EmailFlare Composer](./assets/emailflare-builder.png)\n\nYou'll get a single `worker.js` file. You can manually deploy it on your Cloudflare account. Follow the instruction on the [tutorial article](https://www.breakp.dev/blog/email-flare-send-from-worker-for-free/#manual-deploy).\n\n## Auto Deploy\nYou can directly deploy your own EmailFlare for your domain. Use the **Auto Deploy** feature, and deploy EmailFlare on your own Cloudflare worker, with a handy wizard.\n\n![EmailFlare Composer](./assets/emailflare-deploy.png).\n\nYou need to fill the _Authentication_ section only the first time. Or, if you want change your password, you can type a new one in the _Secret_ field.\n\nMore details available on the [tutorial article](https://www.breakp.dev/blog/email-flare-send-from-worker-for-free/#auto-deploy).\n\n\n## Sending emails is Free?\nCloudflare and MailChannels made a partnership to allow sending email from workers for free. [Announcement](https://support.mailchannels.com/hc/en-us/articles/4565898358413-Sending-Email-from-Cloudflare-Workers-using-MailChannels-Send-API).\n\nSo, inside a Cloudflare you can call the MailChannels API and send email for your domain.\n\n**EmailFlare** makes all this easy for you. It offers a web UI where you can compose emails and the _code_ that runs in a worker to actually send them. You only have to deploy you own EmailFlare to your Cloudflare account.\n\n## How it works?\n**EmailFlare** is full-stack app (SPA + API) bundled in a single-file worker. It's easy to deploy a single file, you can just drag-and-drop it on the Cloudflare dashboard, or use the **Auto-Deploy** feature provided by the EmailFlare builder page.\n\nAs a fullstack webapp, EmailFlare includes both the client side — the UI — and server side — the API. Both sides are packaged and bundled together in a single-file worker.\n\nA single worker acts for the two sides. It delivers the static assets — UI, scripts, images, fonts, … — to the browser. And, it responds to API calls.\n\n\u003e\n\u003e **Important**\n\u003e EmailFlare is just an experiment on how you can deploy and serve a full webapp with a single worker, on the edge, or on a FaaS solution. This is a first step in a more advanced scenario I will show in the future. Follow [@giuseppelt](https://twitter.com/giuseppelt).\n\u003e\n\n\n## Repository organization\nThis is a monorepo managed by pnpm. This _single worker_ experiment has a very defined _concern_ separation. A webapp and an API, clearly isolated.\n\nThere're 3 packages:\n- **app** - the client side\n- **api** - the server side\n- **worker** - build scripts, bundler and worker environment tester\n\n### App\nThe App is a very simple SPA app. It's built with preact, a lightweight alternative to React. The App itself is a single component [App.tsx](/packages/app/src/App.tsx).\n\nRemember when they say _\"organize your app and split it in small components\"_? Yeah, sometimes there's a need for transgression.\n\nThe App is full static. Just assets. The App talks to the API side with standard HTTP requests via fetch.\n\nTo run the App:\n```\n\u003e cd packages/app\n\u003e pnpm dev\n```\n\n### API\nThe EmailFlare server side is a _Json-API_. It's build with [httpc](https://github.com/giuseppelt/httpc), which allows to create APIs as function calls in an RPC-like fashion. With **httpc** you can use a typed client to ensure end-to-end type safety with typescript powered clients.\n\nFor now, the API expose a single call `sendEmail`. In the future, the API will be expanded to include personalization and state.\n\nTo run the API:\n```\n\u003e cd packages/api\n\u003e pnpm dev\n```\n\n### Worker\nThe worker package contains scripts file to actually build your own version of EmailFlare with your configuration.\n\nThe bundling is done with [bun](https://bun.sh), with some black magic. Bun features import macros. The script imports all assets as _inline_ resources at _bundle-time_ inside the worker code.\n```\n\u003e pnpm build:bun\n```\n\nIf you don't have bun on your system, an alternative is to build with [esbuild](https://github.com/evanw/esbuild).\n```\n\u003e pnpm build:esbuild\n```\n\nThe build script assumes both the App and API are already built. So before calling the _build_ script for the worker, just call the _build_ for both the App and API.\n\nThe build produces a single `index.bundle.js` inside the `dist` folder.\n\nOnce built, you can test if the worker works. You can simulate a local workers environment.\n```\n\u003e pnpm dev:bundle\n```\n\n## Contributing\nEmailFlare is open source and developed on [this repository](https://github.com/giuseppelt/emailflare). Every contribution is welcome, from error reporting to feature request.\n\nOr, if you just want to discuss about it, feel free to head to open a issue and write your thoughts.\n\n## License\nMIT (c) 2023 [Giuseppe La Torre](https://breakp.dev)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgiuseppelt%2FEmailFlare","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgiuseppelt%2FEmailFlare","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgiuseppelt%2FEmailFlare/lists"}