A lightweight TypeScript SDK for transactional email. Use one client in your app, pick the adapters you actually send through, and keep provider-specific field support visible in the docs.
packages/email-sdk- core SDK, adapters, CLI, testsapps/fumadocs- documentation siteskills/email-sdk- repo-local agent skill for Email SDK integrations
bun add @opencoredev/email-sdkimport { createEmailClient } from "@opencoredev/email-sdk";
import { resend } from "@opencoredev/email-sdk/resend";
const email = createEmailClient({
adapters: [resend({ apiKey: process.env.RESEND_API_KEY! })],
});
await email.send({
from: "Acme <hello@acme.com>",
to: "user@example.com",
subject: "Welcome",
html: "<p>It works.</p>",
});SMTP is built in and does not require Nodemailer.
Adapters are stable by contract: they map supported EmailMessage fields and reject unsupported fields instead of silently dropping them.
Install the Email SDK agent skill from skills.sh when you want an AI agent to add, review, or document an integration:
npx skills add opencoredev/email-sdk --skill email-sdkThe skill is stored in skills/email-sdk/SKILL.md. It tells agents to refresh the current README, Fumadocs pages, package exports, and TypeScript declarations before implementing, so the guidance stays useful as the SDK evolves without needing every new adapter or option copied into the skill.
bun install
bun run check-types
bun test
bun run buildReleases use Changesets, Depot-backed GitHub Actions runners, npm, and the repo-local Homebrew formula. See AGENTS.md.
Do not run the docs dev server unless you actually want a local preview:
bun run devbun run build: build all packages and appsbun run check-types: check TypeScript types across the workspacebun test: run package testsbun run check: Run Oxlint and Oxfmtbun run dev: start the docs dev server through Turbo