Files
zeekay 74b81c2bd0 fix(type): the OG cards, the emails and the embed stop naming other people's faces
Three surfaces the earlier pass missed, and the embed is the one that matters
most: packages/embeds/embed-core runs inside a CUSTOMER's page and its
stylesheet carried @font-face src url("https://cal.com/cal.ttf") — so every
page anyone put our embed on made a request to our upstream's domain and told
that host about the visit. An embed has no business fetching a face at all; the
headings inherit the host page's stack.

The OG route fetched Inter-Regular.ttf and Inter-Medium.ttf and registered them
as "inter", so every share card was set in a face the product stopped using —
satori reads ttf, which is why the variable file could not serve it. Zen's
static cuts, carried beside them.

shared-globals declared Cal Sans and Inter var; one Zen variable file covers
both roles. The transactional emails linked and @imported fonts.googleapis.com
for Roboto and Inter.
2026-08-25 12:31:32 -07:00
..
2026-04-15 09:52:36 -03:00

JSX email templates

  • components Holds reusable patterns
  • templates A template equals a type of email sent

Usage

import renderEmail from "@calcom/emails/renderEmail";

await renderEmail("TeamInviteEmail", {
  language: t,
  from: "[email protected]",
  to: "[email protected]",
  teamName: "Team Pro",
  joinLink: "https://cal.com",
});

The first argument is the template name as defined inside templates/index.ts. The second argument are the template props.

Development

You can use an API endpoint to preview the email HTML, there's already one on /apps/web/pages/api/email.ts feel free to change the template to the one you're currently working on.