Source: Ira Bodnar Email Campaigns Claude 2026 05 08 (github.com/irinabuht12-oss/email-campaigns-claude)

A single-purpose Claude Code skill (one SKILL.md, no scripts) that codifies a complete pattern for building and sending HTML marketing emails via Resend. Author Ira Bodnar (Ryze AI, San Francisco) bundles asset hosting, a copy-paste design system (frost-glass cards, video blocks with blurred backgrounds, dark CTA pills), an ffmpeg GIF optimization pipeline, and the Resend send/batch/drip pipeline. MIT, 147★ in 24 days, ships with a real production example (the Ryze AI × Claude Connector launch email, 23KB of MSO-safe HTML). One-file install: cp SKILL.md ~/.claude/skills/email-campaigns/SKILL.md.

Key Takeaways

  • Single-file skill — no scripts, no MCP, no allowed-tools beyond Bash/Read/Write/Edit/Grep/Glob. The whole skill is the SKILL.md prose itself: 297 lines, 11.6KB. The author’s contribution is the pattern, not the code. This is the same shape as Corey Haines’ marketing-skills bundle but narrower (one workflow vs 36+) and deeper (worked example vs prompt-only). Compare against Charlie Hills’ social-media-skills which is also single-author but ships 16 separate SKILL.md files.

  • “Use your own site as a CDN” is the load-bearing decision. Instead of Cloudinary or S3, the skill tells Claude to drop image assets into the existing project’s public/email-assets/<campaign-name>/ folder — anything in public/ is served at https://yourdomain.com/email-assets/... on Vercel/Netlify deployment. Commit + push = instant CDN, zero ops, zero cost. Asset rules baked in: lowercase-dash naming, JPGs/PNGs ≤ 1MB at max 600px wide, GIFs ≤ 1.5MB at 720px / 12-15fps / ≤8s, never <video> tags (Gmail/Outlook block), version filenames instead of overwriting (clients cache aggressively).

  • The design tokens are tight and intentionally outdated-feeling avoidance. Card: 4px radius (not 8px+), layered soft shadows (0 2px 8px ..., 0 8px 24px ...), 560px max width, sky-blue gradient + 6% SVG noise texture, no border. Typography: 26 / 15 / 13 / 14 — exactly three sizes, no more. Black bullets &bull; not green check pills (the skill explicitly calls green checks “dated”). Black pill CTA #18181b, 4px radius, 14px 24px padding, repeated twice (mid-email + bottom). One opinionated visual signature, copy-paste from one campaign to the next.

  • Frost-glass video blocks via ffmpeg pre-blur. The visual hero of the skill is a “video card” with a blurred-background bed + frost-glass overlay. Apple Mail / iOS render real backdrop-filter: blur(12px); Gmail and Outlook fall back to the pre-blurred image underneath. The pre-blur step is a one-liner: ffmpeg -y -i header.png -vf "boxblur=luma_radius=30:luma_power=3" header_blur.png. The skill ships the full nested-table HTML with both rendering paths handled.

  • GIF optimization workflow is the most reusable section. One ffmpeg command does everything: setpts=0.5*PTS,fps=15,scale=720:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=256[p];[s1][p]paletteuse=dither=sierra2_4a — 2× speed, 15fps, 720px wide, palette-aware Lanczos resize with sierra2_4a dither. Targets ≤ 1.5MB; if too big, drop to 12fps / 600px / trim 5-6s / 128 colors with dither=bayer:bayer_scale=5. This is reusable across any AI video pipeline that needs email-safe GIFs (HeyGen, Higgsfield clips compressed to email-deliverable artifacts).

  • Resend is the entire send-side. No SES, no Mailgun, no Sendgrid abstraction layer. The skill assumes Resend specifically: npm install resend, RESEND_API_KEY=re_..., verify sending domain (DNS ~15min propagation), single-send via resend.emails.send(), batch up to 100 per call via resend.batch.send(), drip sequences via Resend webhooks (email.delivered, email.opened, email.clicked) triggering the next email instead of fixed timers. Rate limits: 10 req/sec free / 100 req/sec paid. Pseudocode included for cron + Postgres/Supabase sent-state table.

  • Pre-send checklist is the gate. Ten items the skill instructs Claude to verify before sending — absolute URLs swap, preheader hidden div set, subject sanity, alt text on every image, target="_blank" on every link, GIFs ≤ 2MB / total ≤ 5MB, tested in Gmail web/mobile + Apple Mail + Outlook, unsubscribe in footer (CAN-SPAM / GDPR), test sent to self with every link clicked, from on verified domain. Compliance-aware (CAN-SPAM/GDPR named explicitly), not just rendering.

  • Conversion advice is opinionated and concrete. ONE primary CTA repeated twice. Video first, text second. Specificity wins — “Connect in 1 click” beats “Get started”, “30-second setup” beats “Easy”. Claim + proof: every claim near a visual. Low-friction reply CTA (“Reply ‘Guide’ and I’ll send you X”). Send Tue-Thu 9-11am recipient-local — avoid Mon (full inboxes) and weekends. These match the Brandon Storey lead-magnet patterns for direct-response email.

  • Authorship is verifiable, not the suspicious-looking -oss username pattern. GitHub irinabuht12-oss resolves to Ira Bodnar, company Ryze AI, blog get-ryze.ai, Twitter @irabukht, San Francisco. Commits include Co-Authored-By: Claude Opus 4.6 (1M context) — the skill was built using the tool it targets. The -oss suffix is just an OSS-account naming convention for a real founder, not a supply-chain stub. Worth flagging because the Skills at Depth onboarding module specifically warns about single-username-with-no-history accounts; this one has surface-level signals matching the warning but resolves clean on inspection.

  • The example is a real production launch email. examples/claude-connector.html is 23KB of the actual Ryze AI × Claude Connector for Google/Meta Ads launch — full MSO conditionals, mobile media queries on .email-container/.fluid/.mobile-padding/.video-cell, hosted logo grid (Meta / Google Ads / Claude / Google Analytics) at 72×72 frost-glass cards from https://get-ryze.ai/icons/. Open it in a browser to see the rendered result. Provides the missing ingredient most “build emails with Claude” tutorials lack: a fully-worked example you can fork.

Where this fits in the Karpathy wiki

Try It

# 1) Clone
git clone https://github.com/irinabuht12-oss/email-campaigns-claude.git
 
# 2) Install as a skill
mkdir -p ~/.claude/skills/email-campaigns
cp email-campaigns-claude/SKILL.md ~/.claude/skills/email-campaigns/SKILL.md
 
# 3) Set up Resend
npm install resend
export RESEND_API_KEY=re_...   # get from resend.com dashboard
# Verify your sending domain in resend.com → Domains (DNS records take ~15 min)
 
# 4) In any Claude Code session
/email-campaigns
# Then describe the campaign:
#   "Build a launch email for [feature] using the design system in this skill.
#    Brand colors: ... Hero image at: ... Two GIFs at: ... Resend from: ..."

For WEO Marketly: pair with the ElevenLabs voice-agents pattern for outbound + email follow-up sequences. The examples/claude-connector.html is a useful reference layout for any “we just launched X” announcement — the four-logo frost-glass row above the hero image is a strong visual signature for partnership / integration launches specifically.

Open Questions

  • Does the skill handle plain-text fallbacks beyond the trivial text: field on resend.emails.send()? The pre-send checklist mentions tested clients but not text-only deliverability scoring.
  • The drip sequence section is pseudo-code (// Pseudo). Would benefit from a worked example pairing it with a concrete cron runner (Vercel Cron, Cloudflare Workers Cron) — currently a leave-it-to-the-reader gap.
  • No mention of SOC 2 / HIPAA constraints on Resend usage. For dental-marketing-side WEO contexts where PHI might leak via email content, Resend’s compliance posture would matter — not addressed in the skill.