Why Bones

Email

Transactional email written in React, rendered to HTML real email clients understand, and sent through SES.

The problem

Email clients are their own world: Outlook wants tables, most clients strip stylesheets, and dark mode rewrites colors. Templates built from strings drift away from the product's design.

What Bones does

  • Templates are React. They live in their own email-templates workspace, rendered to HTML with React Email's render.
  • Built for real clients. Layout uses tables and inline styles, and templates always render light.
  • Tokens stay in sync. The template tokens are generated from shared-ui/src/tokens.css, and CI fails if they go stale.
  • One send function. sendEmail(to, subject, html) works the same everywhere. In development it goes to Mailpit, so you can read every email at localhost:8025. In production it goes through Amazon SES.
  • Live preview. yarn email-templates:dev serves every template at localhost:3010.

How it compares

Resend and Postmark have better developer experience out of the box. SES was chosen to keep billing in AWS with everything else, and it's cheaper per email at volume.

Go deeper