Audit what you already have.
Paste in an existing email and Claude runs the linter over it first — no rewriting, no guessing. You get the findings by severity and an offer to fix, not a silent replacement of work you spent a day on.
A free Claude skill that builds HTML marketing email, then runs its own linter on the output before you ever see it. Portable to any ESP, dark-mode safe, and honest about the four things it deliberately won’t do.
Paste in an existing email and Claude runs the linter over it first — no rewriting, no guessing. You get the findings by severity and an offer to fix, not a silent replacement of work you spent a day on.
Five email types are defined as records rather than advice — hero shape, zone sequence, module floors, CTA strategy, and the facts the type needs you to supply. Anything you did not supply becomes a bracketed placeholder instead of an invented discount.
The skill runs its own linter on the output and fixes what it reports. A well-built email lints clean, so a non-empty report means real work remains. This is the pass a plain prompt cannot do.
Each of these came out of one prompt and went straight through the linter. The brands are made up. The HTML is not — open any of them and read the source.
Every fact the skill was not given stays a bracket — [DISCOUNT],
[PRICE], [OFFER_END_DATE]. That is the point: a placeholder you
have to fill beats an invented number that looks correct.
Run it on any email HTML you have, with or without Claude, and it reports what a real inbox would do to it.
It’s calibrated both directions. Run it against a well-built email and it comes back clean. Run it against our intentionally broken fixture and it reports 10 errors, 12 warnings — proof the tool isn’t rubber-stamping everything that comes through it.
$ python3 scripts/lint_email.py evals/fixtures/good-welcome.html
✓ good-welcome.html — clean (4KB)
$ python3 scripts/lint_email.py evals/fixtures/broken-blackfriday.html
broken-blackfriday.html — 10 error(s), 12 warning(s)
ERROR
✗ [clean-html] Flexbox or CSS grid detected.
→ Use nested tables. Outlook renders with Word’s engine.
✗ [deliverability] No unsubscribe link or placeholder found.
→ Legally required for marketing email, and ESPs reject imports
without it. Add [UNSUBSCRIBE_URL]. Got an email already? Test an email first — no install, no email address.
It builds one email at a time, in portable HTML. Four things are out of scope on purpose, and it says so rather than pretend.
If you need eight on-brand emails in Mailchimp’s own merge-tag syntax, with hosted images, exported into your account in one click, that is a studio rather than a skill. Same method, four more layers, and it remembers your brand.
Four prompts, each run twice — once with the skill, once without — then both outputs linted identically. Plain Claude writes good-looking email HTML. What it does not do is stay portable, stay compliant, or check itself.
| Measure | With the skill | Plain Claude |
|---|---|---|
| ESP-native tags leaked into portable HTML | 0, 0, 0 | 2, 22, 5 |
| Verification pass | 0 errors, 0 warnings, first run | never checked its own output |
| Physical postal address (CAN-SPAM) | present | missing |
| Zone backgrounds painted twice | every zone | 1 of 11 |
→ Scroll the table for the plain-Claude column
The portability number is the one that matters most. Every unaided build mixed merge-tag dialects into an otherwise portable template — paste that into Mailchimp and it renders literally to the subscriber. You can check your own output for the same problem with one grep.
No dark patterns. The repo is public and MIT licensed — the email gate exists so we can send you the zip, not to hold the code hostage.
git clone https://github.com/marcusaureliusdigital/claude-email-marketing-skill.git \
~/.claude/skills/claude-email-marketing-skill
Unzip into ~/.claude/skills/ and Claude picks it up on its own. The only
requirement is Python 3.9 or later for the linter, which uses the standard library —
there is nothing to install.
A skill is a folder of instructions and scripts that Claude loads when it recognises a matching task. It is not a plugin or an API — it is a method Claude follows, plus any code that method needs. Get this one by email below and Claude uses it whenever you ask for a marketing email.
Enter your email above and we send the zip straight away — unzip it into ~/.claude/skills/ and Claude picks it up automatically. The repository is also public on GitHub if you would rather clone it yourself. Either way the only requirement is Python 3.9 or later for the linter, which uses the standard library — there is nothing to pip install.
It is built for Claude Code, because the linter is a script that runs on your machine. The method and the reference files are readable anywhere, but the verification pass needs a local Python runtime.
Outlook on Windows renders with Microsoft Word’s layout engine, which supports no flexbox, no grid and no CSS columns. Gmail strips style blocks in several contexts, and dark mode rewrites colours in clients that support it. A prompt can ask a model to respect all of that. It cannot enforce it, which is why this skill checks the output rather than trusting it.
It writes portable HTML with bracket placeholders like [FIRST_NAME] and [UNSUBSCRIBE_URL], which import into any ESP once you map them. It deliberately does not emit platform-native merge tags, because getting those wrong breaks the import and mapping brackets by hand takes a minute. If you want native Mailchimp, ActiveCampaign or MailerLite syntax generated for you, that is what the studio does.
Yes, MIT licensed and free to use, fork or ship client work with. The zip requires an email address so we can send it — the code itself has no cost and no catch, and the repo is public if you would rather skip the form entirely.
That’s the point where the skill starts saying no — on purpose. Grab the zip now so it’s ready the next time an email needs to survive Outlook, dark mode and CAN-SPAM at once.
I build email for a living, and the thing that kept catching me out was never the writing. It was the hour after — the table that collapsed in Outlook, the logo that vanished in dark mode, the merge tag that rendered literally to an entire list because it was the wrong dialect.
A prompt can ask a model to avoid all of that. It cannot enforce it. So the skill does what our own pipeline does: it treats anything that must be true of every email as something to check in code afterwards, rather than something to request politely up front.
It is free and MIT licensed because the method is knowable and the work is in maintaining it. If it saves you the hour, that is the whole point. If you get to the edge of what one email at a time can do, you know where we are.
Marc-Aurèle Legoux, founder
EmailTemple generates whole sequences in your brand, in your ESP's own syntax, and exports them ready to send. Three free generations a month, no card.