Email Providers
Resend and Nodemailer — the only two transports in this kit
The kit has two providers: resend and nodemailer. There is no SendGrid or Mailgun package, and MailDev is not a third provider — it is SMTP on localhost:1025 that Nodemailer talks to.
Implementations: packages/email/providers/resend.ts, packages/email/providers/nodemailer.ts, factory in packages/email/providers/index.ts. Both send() catch failures and return { success: false, error } — they do not throw.
Switching
- Explicit
EMAIL_PROVIDER=resendorEMAIL_PROVIDER=nodemailerinapps/web/.env.local. - If unset: production +
RESEND_API_KEY→ Resend, otherwise Nodemailer.
See Setup for the env blocks.
Resend
Production API. Set RESEND_API_KEY and a verified EMAIL_FROM. This kit only calls emails.send — no Resend webhooks or analytics routes.
Nodemailer
SMTP. Local defaults are localhost:1025 (MailDev). docker compose up -d maildev, then http://localhost:1080.
Other SMTP hosts (Gmail, SES, …) work with the same SMTP_* vars. They are not separate providers.
Comparison
| Resend | Nodemailer | |
|---|---|---|
| Use | Production | Local / any SMTP |
| React Email | Native react field | Rendered to HTML/text first |
| Offline | No | Yes, with MailDev |