CCM
/Skills
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Claude Code Marketplaces

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Skill index
  • MCP index
  • Marketplace index
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by mertbuilds.com

Independent project, not affiliated with Anthropic
framix-team avatar

Email Html Mjml

framix-team/skill-email-html-mjml
708 installs62 stars
Summary

This is a solid MJML starter for anyone who needs to ship responsive HTML emails that actually render correctly in Outlook, Gmail, and mobile clients. It enforces strict validation, includes dark mode patterns, and walks you through the full workflow from gathering requirements to compiling minified HTML. The nine engineering rules are opinionated but practical, especially around Outlook's VML quirks and Gmail's 102KB clip limit. Framix built this with accessibility baked in (proper heading roles via mj-html-attributes, contrast requirements) and includes gotcha warnings for vertical-align bugs and whitespace stacking. You get both the editable MJML source and production-ready HTML every time. Good for transactional templates, newsletters, or any email work where cross-client compatibility isn't optional.

Install to Claude Code

npx -y skills add framix-team/skill-email-html-mjml --skill email-html-mjml --agent claude-code

Installs into .claude/skills of the current project.

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
Files
SKILL.mdView on GitHub

email-html-mjml — Responsive Email Developer

Generate valid, cross-client MJML 5.x templates and compile them to production-ready HTML. The primary goal is compatibility: Outlook (2013–365), Gmail (web/app), Apple Mail, and major mobile clients. Every output must be compilable with --config.validationLevel=strict and survive Gmail's 102KB clip limit.


Workflow

  1. Gather requirements — Infer email type, brand colors, and content from the user's message and conversation context. Ask only for what is genuinely missing and blocking progress (e.g., no colors provided and the layout has branded sections). Never front-load a questionnaire.
  2. Plan layout — Decide and announce the structure before writing code (single-column, 2-col grid, hero + content, etc.)
  3. Load component references — Read the relevant file(s) from the Component Index below before writing any MJML
  4. Generate MJML — Write complete, valid MJML starting from <mjml> with a full <mj-head>
  5. Compile — Follow compilation.md. Run npx mjml with --config.minify=true
  6. Deliver both files — Always output .mjml source AND compiled .html

9 Engineering Rules

  1. Structural Integrity — All visual content MUST be in <mj-column> inside <mj-section>. Sections cannot be nested.
  2. Responsive Defaults — Assume 600px width. Use <mj-group> to prevent mobile stacking for side-by-side elements (social bars, logo rows). Use <mj-section gutter="..."> for equal spacing between columns instead of padding tricks.
  3. Outlook Compatibility — Use <mj-font> for web fonts (prevents Times New Roman fallback). Always provide a fallback stack (Arial, sans-serif). For <mj-section> background images, always set both background-size and a fallback background-color.
  4. Gmail Optimization — Use inline="inline" on <mj-style> for custom CSS. Prefer component attributes (color, font-size) over CSS classes for critical styles.
  5. Dark Mode — Include dark mode support when explicitly requested or when the email has a light background that would cause harsh forced-inversion. See the Dark Mode Pattern below.
  6. Accessibility — Every <mj-image> MUST have alt. Always set <mj-title> (populates aria-label). Maintain WCAG 2.1 AA 4.5:1 contrast. For heading roles, use mj-html-attributes — direct role/aria-level attributes on mj-text are illegal under strict validation (see Accessibility Checklist below).
  7. Styling Efficiency — Use <mj-attributes> with <mj-all>, component defaults, and <mj-class> to eliminate repetitive inline styles.
  8. Hero Sections — Use <mj-hero> for full-bleed hero banners; it falls back to a regular section in unsupported clients. Avoid <mj-accordion> and <mj-carousel> — client support is too poor to be useful.
  9. Templating Support — Plain interpolations ({{firstName}}) need no wrapping — they pass through text, attributes, mj-title and mj-preview untouched. Only block tags containing < or > ({% if x < 5 %}, {{#if a<b}}) need <!-- htmlmin:ignore --> protection, or minify silently corrupts them. An <mj-raw> between content components inside a column emits its content between </tr> and <tr> — invalid markup; put mj-raw between sections, and keep templating tags out of <mj-style> (see compilation.md).

Critical Gotchas

MJML 5 mj-include is disabled by default:

  • <mj-include> tags are silently ignored unless includes are explicitly enabled — a deliberate security change from MJML 4
  • CLI: add --config.allowIncludes true. Node API: pass ignoreIncludes: false
  • Scope allowed directories with --config.includePath (CLI) or includePath (Node) — only MJML, HTML, and CSS includes are supported
  • A partial outside the template's own directory is denied unless its directory is allowlisted
  • --config.validationLevel=strict does not catch this — a dropped include still exits 0 and still writes the .html. A clean compile is NOT proof the include landed; grep the output for known partial content before delivering
  • If a compiled template is missing content you expected from an include, check for this first

Outlook:

  • Background images: VML only generated for <mj-section> and <mj-hero> — nowhere else
  • Background positioning: keyword values only (top, center, bottom) — pixel values ignored
  • Always pair background-repeat="no-repeat" with explicit background-size
  • Font fallback: <mj-font> hides @font-face from Outlook via MSO conditional comments

Gmail:

  • Use component attributes for critical layout — CSS classes may be stripped
  • 102KB clip: always compile with --config.minify=true

iOS / Android stacking:

  • MJML 5's minify no longer strips whitespace between tags — htmlnano collapses runs to a single space where html-minifier removed them (verified: v4 emits <![endif]--><div class="mj-column-per-50", v5 emits <![endif]--> <div ...). The anti-stacking defence that still works is the font-size:0px MJML puts on the parent <td>, which is emitted in both versions
  • To restore v4 whitespace stripping: --config.minifyOptions '{"collapseWhitespace":"all"}' (JSON string form required)
  • Whitespace between tags causes stacking even inside <mj-group>

Vertical-align bug:

  • If any column in a section sets vertical-align, ALL columns in that section must explicitly set it

JavaScript:

  • JS is completely blocked in all email clients (Gmail, Outlook, Apple Mail, iOS Mail). No onclick, no clipboard API, no interactivity of any kind. Interactive-looking elements (copy buttons, toggles) are purely decorative.

Dark Mode Pattern

<mj-head>
  <mj-raw>
    <meta name="color-scheme" content="light dark">
    <meta name="supported-color-schemes" content="light dark">
  </mj-raw>

  <!-- Light logo visible by default; dark logo hidden -->
  <mj-style inline="inline">
    .dark-logo { display: none !important; }
  </mj-style>

  <!-- Dark mode overrides -->
  <mj-style>
    @media (prefers-color-scheme: dark) {
      .light-logo { display: none !important; }
      .dark-logo  { display: block !important; }
    }
  </mj-style>
</mj-head>

Safe neutrals: #121212 (not #000000) and #F1F1F1 (not #FFFFFF) — prevents jarring forced inversions.


Accessibility Checklist

  • <mj-title> is set (screen reader email label + aria-label)
  • lang attribute on root <mjml> tag
  • alt on every <mj-image> and <mj-social-element>
  • Heading role set via mj-html-attributes (NOT as a direct attribute on mj-text):
    <!-- In mj-head -->
    <mj-html-attributes>
      <mj-selector path=".email-heading div">
        <mj-html-attribute name="role">heading</mj-html-attribute>
        <mj-html-attribute name="aria-level">1</mj-html-attribute>
      </mj-selector>
    </mj-html-attributes>
    <!-- On the component -->
    <mj-text css-class="email-heading" ...>Heading text</mj-text>
    
  • 4.5:1 contrast ratio on all text/background pairs
  • No text baked into images — always use live <mj-text> blocks

Component Index

Before writing any MJML, read the component file(s) for the components you'll use.

GroupComponentsLoad whenFile
Headmj-attributes, mj-font, mj-style, mj-preview, mj-breakpoint, mj-html-attributesSetting up head, global stylescomponents/head.md
Layoutmj-body, mj-section, mj-column, mj-group, mj-wrapperBuilding structure / gridcomponents/layout.md
Contentmj-text, mj-image, mj-button, mj-divider, mj-spacer, mj-tableAdding content blockscomponents/content.md
Interactivemj-accordion, mj-carousel, mj-social, mj-navbarInteractive or social elementscomponents/interactive.md
Advancedmj-hero, mj-raw, mj-includeHero banners, template tags, partialscomponents/advanced.md

General reference (hierarchy, ending tags, validation, width math, Gmail clip): mjml-reference.md


Compilation

Read compilation.md for the full workflow. Key command:

npx mjml template.mjml -o dist/template.html --config.minify=true --config.validationLevel=strict

Hard rules:

  • Never npm install -g mjml
  • Always use npx or ./node_modules/.bin/mjml
  • If mjml not in package.json, suggest npm install -D mjml

Examples

All four compile clean under --config.validationLevel=strict --config.minify=true on MJML 5.4.0.

FileUse as a reference for
assets/examples/basic-layout.mjmlStructure only. MJML docs example: 6-section layout (header, image hero + button, intro, 2-col image+text, 3-col icons, social row). Intentionally bare-bones — no mj-head, no dark mode, placeholder copy. Not a production template.
assets/examples/order-confirmation.mjmlTransactional. Full mj-head (mj-attributes + mj-class + mj-font + mj-html-attributes), receipt mj-table with scope="col" headers, Handlebars in mj-raw with htmlmin:ignore, conditional block, and mj-include of partials/footer.mjml. Requires --config.allowIncludes true.
assets/examples/promo-sale.mjmlPromotional. mj-hero and mj-section background images (VML generated), mj-navbar, mj-group non-stacking row, mj-social, mj-breakpoint, plus the MJML 5 gutter / border / inner-padding attributes.
assets/examples/newsletter.mjmlEditorial + dark mode. The full dark-mode pattern from above, mj-wrapper, mj-html-attributes for aria-level 1 and 2, and vertical-align set on every column in each section.

All copy, image URLs, and brands in these files are placeholders — replace them; do not ship them as-is.


Output

Always deliver:

  1. <name>.mjml — complete MJML source (editable, version-controllable)
  2. <name>.html — compiled output (production-ready, send via ESP)

Name files after the email type: welcome.mjml, promo-sale.mjml, order-confirmation.mjml

Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
Categories
Frontend DevelopmentDevOps & CI/CDDebuggingDesign & UI/UX
First SeenJun 3, 2026
View on GitHub

Recommended

More Frontend Development →
hairyf avatar
hairy-react-lib

hairyf/skills

Comprehensive skills for working with @hairy/react-lib React hooks and components
707
24
pproenca avatar
react-refactor

pproenca/dot-skills

Architectural refactoring guide for React applications covering component architecture, state architecture, hook patterns, component decomposition, coupling and cohesion, data flow, and refactoring safety. Use when refactoring React codebases, reviewing PRs for architectural issues, decomposing oversized components, or improving module boundaries. Does NOT cover React 19 API usage (see react skill) or performance optimization (see react-optimise skill).
698
192
patternsdev avatar
react-selective-hydration

patternsdev/skills

Teaches selective hydration combined with streaming SSR in React 18+. Use when you need to prioritize hydrating interactive components while streaming the rest of the page.
691
235
uni-helper avatar
vue-best-practices

uni-helper/skills

MUST be used for Vue.js tasks. Strongly recommends Composition API with `<script setup>` and TypeScript as the standard approach. Covers Vue 3, SSR, Volar, vue-tsc. Load for any Vue, .vue files, Vue Router, Pinia, or Vite with Vue work. ALWAYS use Composition API unless the project explicitly requires Options API.
690
94
ovachiever avatar
react-hook-form-zod

ovachiever/droid-tings

Build type-safe validated forms in React using React Hook Form and Zod schema validation. Single schema works on both client and server for DRY validation with full TypeScript type inference via z.infer. Use when: building forms with validation, integrating shadcn/ui Form components, implementing multi-step wizards, handling dynamic field arrays with useFieldArray, or fixing uncontrolled to controlled warnings, resolver errors, async validation issues.
676
52
wot-ui avatar
create-wot-ui-theme

wot-ui/open-wot

为 wot-ui 生成单文件主题 SCSS,并在用户明确要求接入时追加 App.vue 的 `@use`。当用户要做品牌主题、语义变量落地、单文件主题接入时使用。
666
26