finds.dev

productdevbook/unemail

One unified email API across 18 providers (SMTP, Resend, SES, Postmark, SendGrid, Mailgun, …). Zero deps, RFC 8058 + DKIM ready, edge-first, strict TypeScript.

View on GitHubHomepage ↗

★ 296TypeScriptMITupdated Sep 2026

// the take

unemail is a TypeScript email-sending abstraction that wraps 18 providers (Resend, SES, Postmark, SendGrid, Mailgun, SMTP, Cloudflare, etc.) behind one driver interface, with composable middleware for retry, rate limiting, circuit breaking and idempotency. It's aimed at people building transactional email into apps that might run on Node, Bun, Deno, Cloudflare Workers or the browser and don't want to hand-roll failover between providers.

The design is genuinely thought through, not just a thin wrapper: the unit of work is a list end to end, so retry/failover only resend the indices that actually failed instead of re-sending a whole batch and risking duplicate deliveries. Drivers declare capabilities (features.scheduling, cancel, retrieve) and the core returns a typed UNSUPPORTED error instead of silently dropping a field you asked for. Zero runtime dependencies is backed up by real work, not just marketing — SigV4 for SES is implemented over Web Crypto instead of pulling in @aws-sdk/*, and SMTP is its own protocol implementation with pooling and DKIM, which is why it actually runs on Cloudflare Workers and the browser.

ESM-only with no CommonJS build will immediately block any codebase still on require() or a toolchain that doesn't fully support ESM interop — a real adoption tax for a library this broad. The stateful middleware (rate limiting, circuit breaker, idempotency) keeps its state in process memory per the docs; on Cloudflare Workers or any serverless/edge runtime where each invocation can be a fresh isolate, that state doesn't persist across requests, which undercuts the rate-limit and circuit-breaker guarantees for exactly the 'edge-first' use case the project is pitched for. It's rolling its own SMTP client, DKIM signing and AWS SigV4 rather than relying on audited libraries for that protocol/crypto surface — reasonable for the zero-dependency goal, but it means security-sensitive code (auth headers, signature generation) is maintained by one project instead of battle-tested elsewhere. With 18 drivers each chasing a different provider's API, and a young-looking project (296 stars), keeping every driver correct as providers change their batch/webhook/error formats is a lot of ongoing surface for the maintainer(s) to cover.

We read the README, the directory tree and a key source file in October 2026. Nobody pays to be listed. How we judge →

// at a glance

Stars
296
Forks
14
Language
TypeScript
License
MIT
Last commit
2 Sep 2026

// nearby

If unemail isn't quite it.

All repos →