react-email

React Email renderer for json-render that turns JSON specs into HTML or plain-text emails using @react-email/components and @react-email/render. Use when…

INSTALLATION
npx skills add https://github.com/vercel-labs/json-render --skill react-email
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

$27

const spec = {

root: "html-1",

elements: {

"html-1": { type: "Html", props: { lang: "en", dir: "ltr" }, children: ["head-1", "body-1"] },

"head-1": { type: "Head", props: {}, children: [] },

"body-1": {

type: "Body",

props: { style: { backgroundColor: "#f6f9fc" } },

children: ["container-1"],

},

"container-1": {

type: "Container",

props: { style: { maxWidth: "600px", margin: "0 auto", padding: "20px" } },

children: ["heading-1", "text-1"],

},

"heading-1": { type: "Heading", props: { text: "Welcome" }, children: [] },

"text-1": { type: "Text", props: { text: "Thanks for signing up." }, children: [] },

},

};

const html = await renderToHtml(spec);

## Spec Structure (Element Tree)

Same flat element tree as `@json-render/react`: `root` key plus `elements` map. Root must be `Html`; children of `Html` should be `Head` and `Body`. Use `Container` (e.g. max-width 600px) inside `Body` for client-safe layout.

## Creating a Catalog and Registry

import { defineCatalog } from "@json-render/core";

import { schema, defineRegistry, renderToHtml } from "@json-render/react-email";

import { standardComponentDefinitions } from "@json-render/react-email/catalog";

import { Container, Heading, Text } from "@react-email/components";

import { z } from "zod";

const catalog = defineCatalog(schema, {

components: {

...standardComponentDefinitions,

Alert: {

props: z.object({

message: z.string(),

variant: z.enum(["info", "success", "warning"]).nullable(),

}),

slots: [],

description: "A highlighted message block",

},

},

actions: {},

});

const { registry } = defineRegistry(catalog, {

components: {

Alert: ({ props }) => (

<Container style={{ padding: 16, backgroundColor: "#eff6ff", borderRadius: 8 }}>

<Text style={{ margin: 0 }}>{props.message}</Text>

</Container>

),

},

});

const html = await renderToHtml(spec, { registry });


## Server-Side Render APIs

Function
Purpose

`renderToHtml(spec, options?)`
Render spec to HTML email string

`renderToPlainText(spec, options?)`
Render spec to plain-text email string

`RenderOptions`: `registry`, `includeStandard` (default true), `state` (for `$state` / `$cond`).

## Visibility and State

Supports `visible` conditions, `$state`, `$cond`, repeat (`repeat.statePath`), and the same expression syntax as `@json-render/react`. Use `state` in `RenderOptions` when rendering server-side so expressions resolve.

## Server-Safe Import

Import schema and catalog without React or `@react-email/components`:

import { schema, standardComponentDefinitions } from "@json-render/react-email/server";

BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card