Agent skill

Email Template Builder

by borghei in borghei/Claude-Skills

Build email template systems with React Email or MJML: responsive layouts, dark mode, multi-provider sending, and spam score optimization.

MITAuto-check passedFrontend & Design

Install Email Template Builder

skills CLI
$ npx skills add borghei/Claude-Skills --skill email-template-builder -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install borghei/Claude-Skills email-template-builder --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/borghei/Claude-Skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/marketing/email-template-builder .claude/skills/email-template-builder && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
email-template-builder
GitHub stars
874
Token cost
~5.7k tokens
SKILL.md length
962 words
Files
4 (incl. scripts)
Skills in repo
364
Repo updated
First seen
Licence
MIT

At a glance

Build email template systems with React Email or MJML: responsive layouts, dark mode, multi-provider sending, and spam score optimization.

  • Works in 3 steps: Spam Score Checker… → Template Validator… → Render Size Analyzer…
  • Setting up transactional email
  • SKILL.md covers Overview, Clarify First, Architecture Decision: React… and Project Structure, plus 14 more sections
  • Runs Python scripts from its folder; calls python and npx; reaches fonts.gstatic.com

What it does

Email Template Builder is an agent skill from borghei/Claude-Skills. Build email template systems with React Email or MJML: responsive layouts, dark mode, multi-provider sending, and spam score optimization. Use when setting up transactional email, building email design systems, or debugging deliverability.

Its SKILL.md is about 5.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including scripts (for example `scripts/render_size_analyzer.py`, `scripts/spam_score_checker.py` and `scripts/template_validator.py`).

It sits in Frontend & Design, covering Transactional email. It works with React and TypeScript. The repository describes itself as: 385 AI skills, 77 expert agents, and 900 stdlib Python tools for every team: engineering, PM, marketing, C-level, compliance, business ops, research, and a LinkedIn toolkit… The licence is MIT.

When your agent uses it

  • Setting up transactional email
  • Building email design systems
  • Debugging deliverability

Example prompts

  • “/email-template-builder”

Requirements

  • Python 3

Workflow steps

3 steps, taken from the step headings in SKILL.md.

  1. Spam Score Checker (scripts/spam_score_checker.py)
  2. Template Validator (scripts/template_validator.py)
  3. Render Size Analyzer (scripts/render_size_analyzer.py)

What it can do on your machine

Read from SKILL.md and the folder at commit c9a1487. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 3 files in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python
    • npx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • fonts.gstatic.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Email Template Builder loads about 5.7k tokens when it runs. Until then it costs about 66 tokens; SKILL.md has 962 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~66
When it runs · the whole SKILL.md, loaded when a task matches
~5.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from borghei/Claude-Skills at commit c9a1487, republished under its MIT licence (© borghei). 962 words, ~5,655 tokens.

Download SKILL.mdSave it as .claude/skills/email-template-builder/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
email-template-builder
description
Build email template systems with React Email or MJML: responsive layouts, dark mode, multi-provider sending, and spam score optimization. Use when setting up transactional email, building email design systems, or debugging deliverability.
license
MIT + Commons Clause
metadata.version
1.0.0
metadata.author
borghei
metadata.category
marketing
metadata.domain
email-engineering
metadata.tier
POWERFUL
metadata.updated
2026-03-09
metadata.frameworks
react-email, mjml, email-deliverability, responsive-email

Email Template Builder

Tier: POWERFUL Category: Engineering / Marketing Tags: email templates, React Email, MJML, responsive email, deliverability, transactional email, dark mode

Overview

Build complete transactional email systems: component-based templates with React Email or MJML, multi-provider sending abstraction, local preview with hot reload, i18n support, dark mode, spam optimization, and UTM tracking. Outputs production-ready code for any major email provider.

This skill builds the email rendering and sending infrastructure. For writing email copy and designing sequences, use email-sequence.


Clarify First

Before building the templates, confirm these inputs. If any is unknown or vague, ASK — do not assume:

  • Framework — React Email or MJML, and whether the team uses React/TypeScript (decides the entire codebase; see the decision table below)
  • Templates needed — welcome, password reset, invoice, trial-expiring, digest, team-invite, etc. (determines which template files to scaffold)
  • Sending provider — Resend, SendGrid, Postmark, or SES (selects which provider adapter to build)
  • Locales & dark mode — required languages and dark-mode support (drives the i18n system and base-layout styles)

Stop rule: ask only the 2-3 that most change the output. If the user says "just draft it," proceed and list your assumptions at the top of the artifact.

Architecture Decision: React Email vs MJML

FactorReact EmailMJML
Component reuseFull React component modelPartial (mj-attributes)
TypeScriptNativeRequires build step
Preview serverBuilt-in (email dev)Requires separate setup
Email client compatibilityGood (renders to tables)Excellent (battle-tested)
Dark modeCSS media queriesCSS media queries
Learning curveLow (if you know React)Low (HTML-like syntax)
Best forTeams already using ReactMaximum email client compat

Recommendation: React Email for TypeScript teams shipping SaaS. MJML for marketing teams needing maximum compatibility across Outlook, Gmail, Apple Mail, and legacy clients.


Project Structure

emails/
├── components/
│   ├── layout/
│   │   ├── base-layout.tsx          # Shared wrapper: header, footer, styles
│   │   ├── button.tsx               # CTA button component
│   │   └── divider.tsx              # Styled horizontal rule
│   ├── blocks/
│   │   ├── hero.tsx                 # Hero section with heading + text
│   │   ├── feature-row.tsx          # Icon + text feature highlight
│   │   ├── testimonial.tsx          # Quote + attribution
│   │   └── pricing-table.tsx        # Plan comparison
├── templates/
│   ├── welcome.tsx                  # Welcome / confirm email
│   ├── password-reset.tsx           # Password reset link
│   ├── invoice.tsx                  # Payment receipt / invoice
│   ├── trial-expiring.tsx           # Trial expiration warning
│   ├── weekly-digest.tsx            # Activity summary
│   └── team-invite.tsx              # Team invitation
├── lib/
│   ├── send.ts                      # Unified send function
│   ├── providers/
│   │   ├── resend.ts                # Resend adapter
│   │   ├── sendgrid.ts              # SendGrid adapter
│   │   ├── postmark.ts              # Postmark adapter
│   │   └── ses.ts                   # AWS SES adapter
│   ├── tracking.ts                  # UTM parameter injection
│   └── render.ts                    # Template rendering
├── i18n/
│   ├── en.ts                        # English strings
│   ├── de.ts                        # German strings
│   └── types.ts                     # Typed translation keys
└── package.json

Base Layout Component

tsx
// emails/components/layout/base-layout.tsx
import {
  Body, Container, Head, Html, Img, Preview,
  Section, Text, Hr, Font
} from "@react-email/components";

interface BaseLayoutProps {
  preview: string;
  locale?: string;
  children: React.ReactNode;
}

export function BaseLayout({ preview, locale = "en", children }: BaseLayoutProps) {
  return (
    <Html lang={locale}>
      <Head>
        <Font
          fontFamily="Inter"
          fallbackFontFamily="Arial"
          webFont={{
            url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZ9hiJ-Ek-_EeA.woff2",
            format: "woff2",
          }}
          fontWeight={400}
          fontStyle="normal"
        />
        <style>{`
          @media (prefers-color-scheme: dark) {
            .email-body { background-color: #111827 !important; }
            .email-container { background-color: #1f2937 !important; }
            .email-text { color: #e5e7eb !important; }
            .email-heading { color: #f9fafb !important; }
            .email-muted { color: #9ca3af !important; }
          }
          @media only screen and (max-width: 600px) {
            .email-container { width: 100% !important; padding: 16px !important; }
          }
        `}</style>
      </Head>
      <Preview>{preview}</Preview>
      <Body className="email-body" style={body}>
        <Container className="email-container" style={container}>
          <Section style={header}>
            <Img
              src={`${process.env.ASSET_URL}/logo.png`}
              width={120} height={36} alt="[Product]"
            />
          </Section>
          <Section style={content}>{children}</Section>
          <Hr className="email-muted" style={divider} />
          <Section style={footer}>
            <Text className="email-muted" style={footerText}>
              [Company] Inc. - [Address]
            </Text>
            <Text className="email-muted" style={footerText}>
              <a href="{{unsubscribe_url}}" style={link}>Unsubscribe</a>
              {" | "}
              <a href="{{preferences_url}}" style={link}>Email Preferences</a>
              {" | "}
              <a href="{{privacy_url}}" style={link}>Privacy Policy</a>
            </Text>
          </Section>
        </Container>
      </Body>
    </Html>
  );
}

// Styles (inline for email client compatibility)
const body = { backgroundColor: "#f3f4f6", fontFamily: "Inter, Arial, sans-serif", margin: 0, padding: "40px 0" };
const container = { maxWidth: "600px", margin: "0 auto", backgroundColor: "#ffffff", borderRadius: "8px", overflow: "hidden" };
const header = { padding: "24px 32px", borderBottom: "1px solid #e5e7eb" };
const content = { padding: "32px" };
const divider = { borderColor: "#e5e7eb", margin: "0 32px" };
const footer = { padding: "24px 32px" };
const footerText = { fontSize: "12px", color: "#6b7280", textAlign: "center" as const, margin: "4px 0", lineHeight: "1.6" };
const link = { color: "#6b7280", textDecoration: "underline" };

Template Examples

Welcome Email
tsx
// emails/templates/welcome.tsx
import { Button, Heading, Text } from "@react-email/components";
import { BaseLayout } from "../components/layout/base-layout";

interface WelcomeProps {
  name: string;
  confirmUrl: string;
  trialDays?: number;
}

export default function Welcome({ name, confirmUrl, trialDays = 14 }: WelcomeProps) {
  return (
    <BaseLayout preview={`Welcome, ${name}! Confirm your email to get started.`}>
      <Heading className="email-heading" style={h1}>
        Welcome to [Product], {name}
      </Heading>
      <Text className="email-text" style={text}>
        You have {trialDays} days to explore everything -- no credit card required.
        Confirm your email to activate your account:
      </Text>
      <Button href={confirmUrl} style={button}>
        Confirm Email Address
      </Button>
      <Text className="email-muted" style={muted}>
        Button not working? Paste this link in your browser:{" "}
        <a href={confirmUrl} style={linkStyle}>{confirmUrl}</a>
      </Text>
    </BaseLayout>
  );
}

const h1 = { fontSize: "24px", fontWeight: "700", color: "#111827", margin: "0 0 16px", lineHeight: "1.3" };
const text = { fontSize: "16px", lineHeight: "1.6", color: "#374151", margin: "0 0 24px" };
const button = { backgroundColor: "#4f46e5", color: "#ffffff", borderRadius: "6px", fontSize: "16px", fontWeight: "600", padding: "12px 24px", textDecoration: "none", display: "inline-block" };
const muted = { fontSize: "13px", color: "#6b7280", marginTop: "24px", lineHeight: "1.5" };
const linkStyle = { color: "#4f46e5", wordBreak: "break-all" as const };
Invoice Email
tsx
// emails/templates/invoice.tsx
import { Row, Column, Section, Heading, Text, Hr, Button } from "@react-email/components";
import { BaseLayout } from "../components/layout/base-layout";

interface LineItem { description: string; amount: number; }

interface InvoiceProps {
  name: string;
  invoiceNumber: string;
  date: string;
  dueDate: string;
  items: LineItem[];
  total: number;
  currency?: string;
  downloadUrl: string;
}

export default function Invoice({
  name, invoiceNumber, date, dueDate, items,
  total, currency = "USD", downloadUrl,
}: InvoiceProps) {
  const fmt = new Intl.NumberFormat("en-US", { style: "currency", currency });

  return (
    <BaseLayout preview={`Invoice ${invoiceNumber} -- ${fmt.format(total / 100)}`}>
      <Heading className="email-heading" style={h1}>
        Invoice #{invoiceNumber}
      </Heading>
      <Text className="email-text" style={text}>Hi {name},</Text>
      <Text className="email-text" style={text}>
        Here is your invoice. Thank you for your business.
      </Text>

      {/* Meta row */}
      <Section style={metaBox}>
        <Row>
          <Column>
            <Text style={metaLabel}>Invoice Date</Text>
            <Text style={metaValue}>{date}</Text>
          </Column>
          <Column>
            <Text style={metaLabel}>Due Date</Text>
            <Text style={metaValue}>{dueDate}</Text>
          </Column>
          <Column>
            <Text style={metaLabel}>Amount Due</Text>
            <Text style={metaValueBold}>{fmt.format(total / 100)}</Text>
          </Column>
        </Row>
      </Section>

      {/* Line items */}
      {items.map((item, i) => (
        <Row key={i} style={i % 2 === 0 ? rowEven : rowOdd}>
          <Column><Text style={cell}>{item.description}</Text></Column>
          <Column><Text style={cellRight}>{fmt.format(item.amount / 100)}</Text></Column>
        </Row>
      ))}
      <Hr style={divider} />
      <Row>
        <Column><Text style={totalLabel}>Total</Text></Column>
        <Column><Text style={totalValue}>{fmt.format(total / 100)}</Text></Column>
      </Row>

      <Button href={downloadUrl} style={button}>
        Download PDF
      </Button>
    </BaseLayout>
  );
}

const h1 = { fontSize: "24px", fontWeight: "700", color: "#111827", margin: "0 0 16px" };
const text = { fontSize: "15px", lineHeight: "1.6", color: "#374151", margin: "0 0 12px" };
const metaBox = { backgroundColor: "#f9fafb", borderRadius: "8px", padding: "16px", margin: "16px 0" };
const metaLabel = { fontSize: "11px", color: "#6b7280", fontWeight: "600", textTransform: "uppercase" as const, margin: "0 0 4px", letterSpacing: "0.05em" };
const metaValue = { fontSize: "14px", color: "#111827", margin: "0" };
const metaValueBold = { fontSize: "18px", fontWeight: "700", color: "#4f46e5", margin: "0" };
const rowEven = { backgroundColor: "#ffffff" };
const rowOdd = { backgroundColor: "#f9fafb" };
const cell = { fontSize: "14px", color: "#374151", padding: "10px 12px" };
const cellRight = { ...cell, textAlign: "right" as const };
const divider = { borderColor: "#e5e7eb", margin: "8px 0" };
const totalLabel = { fontSize: "16px", fontWeight: "700", color: "#111827", padding: "8px 12px" };
const totalValue = { ...totalLabel, textAlign: "right" as const };
const button = { backgroundColor: "#4f46e5", color: "#ffffff", borderRadius: "6px", padding: "12px 24px", fontSize: "15px", fontWeight: "600", textDecoration: "none", display: "inline-block", marginTop: "16px" };

Multi-Provider Send Abstraction

typescript
// emails/lib/send.ts
import { render } from "@react-email/render";

interface EmailPayload {
  to: string;
  subject: string;
  template: React.ReactElement;
  tags?: Record<string, string>;
}

interface EmailProvider {
  send(payload: { to: string; subject: string; html: string; text: string; tags?: Record<string, string> }): Promise<{ id: string }>;
}

// Provider factory
function getProvider(): EmailProvider {
  const provider = process.env.EMAIL_PROVIDER || "resend";
  switch (provider) {
    case "resend": return require("./providers/resend").default;
    case "sendgrid": return require("./providers/sendgrid").default;
    case "postmark": return require("./providers/postmark").default;
    case "ses": return require("./providers/ses").default;
    default: throw new Error(`Unknown email provider: ${provider}`);
  }
}

export async function sendEmail(payload: EmailPayload) {
  const html = addTracking(render(payload.template), { campaign: payload.tags?.type || "transactional" });
  const text = render(payload.template, { plainText: true });

  return getProvider().send({
    to: payload.to,
    subject: payload.subject,
    html,
    text,
    tags: payload.tags,
  });
}

UTM Tracking Injection

typescript
// emails/lib/tracking.ts
interface TrackingConfig {
  campaign: string;
  source?: string;
  medium?: string;
}

export function addTracking(html: string, config: TrackingConfig): string {
  const params = new URLSearchParams({
    utm_source: config.source || "email",
    utm_medium: config.medium || "transactional",
    utm_campaign: config.campaign,
  }).toString();

  // Add UTM to all internal links (skip unsubscribe and external)
  return html.replace(
    /href="(https?:\/\/(?:www\.)?yourdomain\.com[^"]*?)"/g,
    (match, url) => {
      const sep = url.includes("?") ? "&" : "?";
      return `href="${url}${sep}${params}"`;
    }
  );
}

i18n System

typescript
// emails/i18n/types.ts
export interface EmailStrings {
  welcome: {
    preview: (name: string) => string;
    heading: (name: string) => string;
    body: (days: number) => string;
    cta: string;
    fallbackLink: string;
  };
  invoice: {
    preview: (number: string, amount: string) => string;
    heading: (number: string) => string;
    greeting: (name: string) => string;
    downloadCta: string;
  };
  common: {
    unsubscribe: string;
    preferences: string;
    privacy: string;
  };
}

// emails/i18n/en.ts
import type { EmailStrings } from "./types";
export const en: EmailStrings = {
  welcome: {
    preview: (name) => `Welcome, ${name}! Confirm your email to get started.`,
    heading: (name) => `Welcome to [Product], ${name}`,
    body: (days) => `You have ${days} days to explore everything -- no credit card required.`,
    cta: "Confirm Email Address",
    fallbackLink: "Button not working? Paste this link in your browser:",
  },
  // ... other templates
};

// emails/i18n/de.ts
import type { EmailStrings } from "./types";
export const de: EmailStrings = {
  welcome: {
    preview: (name) => `Willkommen, ${name}! Bestaetigen Sie Ihre E-Mail.`,
    heading: (name) => `Willkommen bei [Product], ${name}`,
    body: (days) => `Sie haben ${days} Tage Zeit, alles zu erkunden -- keine Kreditkarte noetig.`,
    cta: "E-Mail-Adresse bestaetigen",
    fallbackLink: "Button funktioniert nicht? Fuegen Sie diesen Link in Ihren Browser ein:",
  },
  // ... other templates
};

Deliverability Checklist

DNS Records (Required)
  • SPF: v=spf1 include:_spf.provider.com ~all on sending domain
  • DKIM: Provider-specific CNAME records configured
  • DMARC: v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com
  • Return-Path: Matches sending domain (not provider default)
Content Rules
  • Sender uses own domain (not @gmail.com)
  • Subject under 50 characters, no ALL CAPS, no spam triggers
  • Text-to-image ratio: minimum 60% text
  • Plain text version included alongside HTML
  • Unsubscribe link in every email (CAN-SPAM, GDPR, one-click)
  • Physical mailing address in footer (CAN-SPAM requirement)
  • No URL shorteners (use full branded links)
  • Single primary CTA per email
  • All images have alt text
  • HTML validates (no broken/unclosed tags)
Infrastructure
  • Separate sending domains for transactional vs marketing
  • Warm up new sending domains gradually (start with 50/day, increase 2x weekly)
  • Monitor bounce rates (<2% hard bounces)
  • Process bounces and complaints automatically
  • Test with Mail-Tester.com before production sends (target: 9+/10)

Email Client Compatibility

Known Quirks
ClientQuirkWorkaround
Outlook (Windows)No CSS grid/flexbox, ignores margin on imagesUse <table> layout (React Email handles this)
GmailStrips <head> styles, limits CSSInline all styles (React Email handles this)
Apple MailBest support, renders dark mode wellStandard approach works
Yahoo MailLimited CSS supportAvoid advanced selectors
Outlook.comStrips background imagesUse background-color as fallback
Testing Matrix

Test every template on these clients before production:

PriorityClientMethod
CriticalGmail (web)Send test email
CriticalApple Mail (iOS)Send test email
CriticalOutlook (Windows, latest)Litmus or Email on Acid
HighOutlook.com (web)Send test email
HighGmail (Android)Send test email
MediumYahoo MailLitmus
MediumOutlook (Mac)Send test email

Dev Workflow

bash
# Start preview server with hot reload
npx email dev --dir emails/templates --port 3001

# Export to static HTML (for testing with Litmus/Email on Acid)
npx email export --dir emails/templates --outDir emails/dist

# Send test email
npx tsx emails/lib/send-test.ts --template welcome --to test@example.com

# Validate HTML
npx email lint --dir emails/templates

Show full SKILL.md (407 more words)Show less

Common Pitfalls

PitfallConsequencePrevention
Using CSS grid/flexboxLayout breaks in OutlookUse Row/Column from React Email (renders to tables)
Container wider than 600pxBreaks on Gmail mobileMax-width: 600px on container
Missing plain text versionLower deliverability scoreAlways generate plain text with render(template, { plainText: true })
Same domain for transactional + marketingMarketing complaints tank transactional deliverySeparate sending domains/subdomains
Skipping email warm-upEmails go to spamStart low, increase gradually over 2-4 weeks
Dark mode ignoringUnreadable emails for 30%+ of usersAdd prefers-color-scheme: dark media queries with !important

SkillUse When
email-sequenceWriting email copy and designing automation flows
analytics-trackingSetting up email engagement tracking and attribution
launch-strategyCoordinating email templates for product launches

Troubleshooting

SymptomLikely CauseFix
Email clipped in GmailHTML over 102KBRun render_size_analyzer.py. Remove comments, minify, replace base64 images.
Layout broken in OutlookCSS flexbox/grid usedUse table-based layout. Run template_validator.py for compatibility check.
Styles stripped in GmailStyles in <head> onlyInline all CSS. React Email handles this automatically.
Unreadable in dark modeNo dark mode CSSAdd prefers-color-scheme: dark media queries with !important.
Low deliverability scoreMissing unsubscribe, heavy imagesRun spam_score_checker.py. Add RFC 8058 one-click unsubscribe headers.
Images not loadingBlocked by email client defaultsAdd descriptive alt text. Maintain 60%+ text-to-image ratio.
Template renders differently across clientsUnsupported CSS propertiesTest on Gmail, Apple Mail, Outlook (Windows) before production sends.

Success Criteria

  • Spam score of 9+/10 on mail-tester.com before production sends
  • Template renders correctly on Gmail, Apple Mail, and Outlook (Windows)
  • HTML under 80KB (well under Gmail's 102KB clip threshold)
  • Text-to-image ratio above 60%
  • Dark mode tested and readable for 30%+ of users
  • All images have alt text and explicit width/height dimensions
  • One-click unsubscribe (RFC 8058) implemented in all templates
  • Separate sending domains for transactional vs. marketing email

Scope & Limitations

In Scope: Email HTML/CSS template engineering, React Email and MJML components, multi-provider sending abstraction, i18n, dark mode, deliverability infrastructure, spam score optimization.

Out of Scope: Email copy/sequence writing (use email-sequence), marketing automation workflows, email list management, A/B test statistical analysis.


Python Automation Tools

1. Spam Score Checker (scripts/spam_score_checker.py)

Analyzes email HTML for spam risk: text-to-image ratio, link density, spam words, unsubscribe presence, HTML structure.

bash
python scripts/spam_score_checker.py template.html
python scripts/spam_score_checker.py template.html --json
2. Template Validator (scripts/template_validator.py)

Validates email templates for client compatibility (Outlook, Gmail), accessibility, responsive design, and inline styles.

bash
python scripts/template_validator.py template.html
python scripts/template_validator.py template.html --json
3. Render Size Analyzer (scripts/render_size_analyzer.py)

Analyzes template file size, estimates render weight, and checks against Gmail's 102KB clip threshold with detailed breakdown.

bash
python scripts/render_size_analyzer.py template.html
python scripts/render_size_analyzer.py --dir templates/ --json

© borghei, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files (scripts) in marketing/email-template-builder of borghei/Claude-Skills.

  • SKILL.md
  • scripts/render_size_analyzer.py
  • scripts/spam_score_checker.py
  • scripts/template_validator.py

Open the folder on GitHubat commit c9a1487

Compare with similar skills

Email Template Builder next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Email Template Builder compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Email Template Builder this skillborghei/Claude-Skills874—~5.7kAutomated safety check: PassMIT
React Emailviclafouch/meme-studio1102 repos~3.6kAutomated safety check: PassMIT
Pinmeglitternetwork/pinme3.7k—~3.8kAutomated safety check: NotesMIT
South Admin CRUD Generatorsouthliu/south-admin-react580—~1.7kAutomated safety check: PassMIT
Implementing Search Filterancoleman/ai-design-components526—~1.6kAutomated safety check: PassMIT
Email Template Builderalirezarezvani/claude-skills28k1 repos~3.8kAutomated safety check: PassMIT

Similar skills

  • React Email

    viclafouch/meme-studio

    A skill your agent uses when creating HTML email templates with React components - welcome emails, password resets, notifications, order confirmations, newsletters, or transactional emails.

    110 GitHub starsUsed in 2 repos~3.6k tokens
    Backend & APIsAuto-check passed
  • Pinme

    glitternetwork/pinme

    A skill your agent uses when the user mentions "pinme", or needs to upload files, store to IPFS, create/publish/deploy websites or full-stack services (including frontend pages, backend APIs…

    3.7k GitHub stars~3.8k tokensUpdated 25 days ago
    Frontend & DesignAuto-check: notes
  • South Admin CRUD Generator

    southliu/south-admin-react

    Generates a full CRUD page - page component, data model and API client - from the south-admin-react project's own VS Code snippet templates.

    580 GitHub stars~1.7k tokensUpdated 17 days ago
    Frontend & DesignAuto-check passed
  • Implementing Search Filter

    ancoleman/ai-design-components

    Implements search and filter interfaces for both frontend (React/TypeScript) and backend (Python) with debouncing, query management, and database integration.

    526 GitHub stars~1.6k tokensUpdated 10 mo ago
    Frontend & DesignAuto-check passed
  • Email Template Builder

    alirezarezvani/claude-skills

    Build complete transactional email systems: React Email templates, provider integration (Resend, Postmark, SendGrid, AWS SES), preview server, i18n support, dark mode, spam optimization, analytics…

    28k GitHub starsUsed in 1 repo~3.8k tokens
    Frontend & DesignAuto-check passed
  • React Email

    aiskillstore/marketplace

    A skill your agent uses when building HTML email templates with React components, adding a visual email editor to an application using the React Email visual editor, rendering emails to HTML, or…

    430 GitHub starsUsed in 1 repo~3.6k tokens
    Frontend & DesignAuto-check passed

More from borghei/Claude-Skills

All 364 skills in this repo
  • Agents In The Team

    borghei/Claude-Skills

    Run delivery when AI coding and ops agents take tickets. An agent skill from borghei/Claude-Skills.

    874 GitHub stars~4.2k tokensUpdated yesterday
    Auto-check passed
  • AI Content Disclosure

    borghei/Claude-Skills

    Check AI-generated marketing content and reviews for required disclosures under the EU AI Act, FTC rules and platform AI-label policies.

    874 GitHub stars~3.4k tokensUpdated yesterday
    Auto-check passed
  • AI Prototyping

    borghei/Claude-Skills

    Idea to AI-generated prototype to customer validation to engineering handoff.

    874 GitHub stars~3.6k tokensUpdated yesterday
    Auto-check passed
  • Analytics Engineer

    borghei/Claude-Skills

    Analytics engineering across data modeling, dbt, transformation, and semantic layers.

    874 GitHub stars~3.4k tokensUpdated yesterday
    Auto-check passed
  • Ansoff Matrix

    borghei/Claude-Skills

    Ansoff Matrix — 4-quadrant framework for growth options: market penetration, market/product development, and diversification.

    874 GitHub stars~2.2k tokensUpdated yesterday
    Auto-check passed
  • Brainstorm Okrs

    borghei/Claude-Skills

    OKR brainstorming and validation using the Radical Focus framework — outcome objectives, measurable key results, counter-metrics.

    874 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about Email Template Builder

What does Email Template Builder do?

Build email template systems with React Email or MJML: responsive layouts, dark mode, multi-provider sending, and spam score optimization. Email Template Builder is an agent skill from borghei/Claude-Skills. Build email template systems with React Email or MJML: responsive layouts, dark mode, multi-provider sending, and spam score optimization.

When should I use Email Template Builder?

Email Template Builder fits situations like: setting up transactional email; building email design systems; debugging deliverability.

How do I install Email Template Builder in Claude Code?

Run `npx skills add borghei/Claude-Skills --skill email-template-builder -a claude-code`. Or copy the skill folder (marketing/email-template-builder in borghei/Claude-Skills) into .claude/skills/email-template-builder in your project. Claude Code loads it when a task matches its description.

How do I install Email Template Builder in Codex?

Run `npx skills add borghei/Claude-Skills --skill email-template-builder -a codex`. Or copy the skill folder (marketing/email-template-builder in borghei/Claude-Skills) into .agents/skills/email-template-builder in your project. Codex loads it when a task matches its description.

Can I use Email Template Builder in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add borghei/Claude-Skills --skill email-template-builder -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/email-template-builder, .gemini/skills/email-template-builder, .github/skills/email-template-builder and .opencode/skills/email-template-builder in your project.

What does Email Template Builder need to run?

Going by SKILL.md and its folder, Email Template Builder needs Python for the scripts in its folder and the command-line tools its instructions call (python and npx). Our summary lists: Python 3.

Does Email Template Builder access the network?

SKILL.md names 1 domain. In commands or code: fonts.gstatic.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Email Template Builder safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Email Template Builder use?

Email Template Builder is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Email Template Builder use?

About 5.7k tokens (SKILL.md is roughly 23k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Email Template Builder?

Skills that share tags, products or a category with Email Template Builder: React Email (viclafouch/meme-studio, 110 stars), Pinme (glitternetwork/pinme, 3.7k stars), South Admin CRUD Generator (southliu/south-admin-react, 580 stars) and Implementing Search Filter (ancoleman/ai-design-components, 526 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Email Template Builder?

borghei (a GitHub user) maintains it in borghei/Claude-Skills, which has 874 GitHub stars. The repository holds 364 skills in this directory. The repository was last updated on October 7, 2026.

Source: borghei/Claude-Skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.