cmd-email-md
Markdown to Email HTML
Convert markdown into a complete, self-contained HTML email with inline CSS, table-based layout, and cross-client compatibility (Gmail, Outlook, Apple Mail).
Workflow
1. Determine input
- If the user provided a file path, read the
.mdfile - If the user provided inline markdown, use that directly
- If neither, ask: "Which markdown file should I convert, or paste the content?"
2. Parse frontmatter
Extract YAML frontmatter from the top of the markdown. All fields are optional — use defaults for anything missing.
| Field | Default | Description |
|---|---|---|
preheader |
(none) | Hidden inbox preview text |
brand-color |
#2563eb |
Primary accent (links, buttons, highlights) |
heading-color |
#1a1a1a |
h1-h3 color |
body-color |
#333333 |
Body text color |
background-color |
#f4f4f4 |
Outer background |
content-background |
#ffffff |
Inner content area |
font-family |
Arial, Helvetica, sans-serif |
Safe font stack |
font-size |
16px |
Base body size |
line-height |
26px |
Body line height (must be px for Outlook) |
content-width |
600px |
Max content width |
header-logo |
(none) | URL to logo image |
footer-text |
(none) | Footer text (unsubscribe, address, etc.) |
3. Load references
Read the following files for technical rules and component templates:
references/email-html-compatibility.md— cross-client rules, document structure, quirksreferences/email-components.md— HTML snippets with{{variable}}placeholders
4. Convert markdown to email HTML
Walk through the markdown content and generate email-safe HTML:
- Use the Complete Wrapper template as the outer structure
- Map each markdown element to its corresponding component template
- Replace all
{{variable}}placeholders with frontmatter values (or defaults) - Apply all CSS inline — no
<style>blocks in<body> - Use tables for layout — never
<div>for structure - Include Outlook conditional comments for
max-widthfix - Include preheader
<div>ifpreheaderis set - Include header with logo if
header-logois set - Include footer if
footer-textis set
Markdown element mapping:
| Markdown | Email component |
|---|---|
# Heading |
Heading (h1-h4) with size per level |
| Paragraph | Paragraph with inline styles |
**bold**, *italic*, ~~strike~~ |
Inline <strong>, <em>, <del> |
[text](url) |
Styled <a> with brand-color |
- item / 1. item |
Unordered/Ordered list |
- [ ] task |
Task list with Unicode checkboxes |
`code` |
Inline code |
```code block``` |
Code block (dark theme) |
> quote |
Blockquote with left border |
 |
Image with explicit dimensions |
--- |
Horizontal rule |
==highlight== |
<mark> with background color |
Special directives (fenced with :::):
| Directive | Behavior |
|---|---|
:::hero |
Full-width section with brand-color background, white text |
:::callout[type] |
Highlighted box — type: info, tip, warning, danger |
:::button[text](url) |
CTA button with VML fallback |
:::button.secondary[text](url) |
Secondary button variant |
:::centered |
Center-aligned text block |
:::footer |
Footer section (overrides footer-text frontmatter) |
5. Write output
- If input was a file (e.g.,
newsletter.md), write tonewsletter.htmlin the same directory - If input was inline, ask the user for an output path
- The output must be a complete, self-contained HTML document — ready to paste into any email sending tool
6. Summary
Report:
- Output file path
- Theme values applied (brand color, font, content width)
- Any warnings (e.g., unsupported markdown features skipped, images without dimensions)
Constraints
- No
<style>in<body>— Gmail strips it. Only allowed in<head>for responsive media queries. - No flexbox, grid, or CSS variables — not supported in email clients
- No
<button>elements — use<a>tags styled as buttons - No JavaScript — always blocked
- No external CSS — everything inline
- Tables for layout —
<div>only for non-structural content (e.g., preheader hiding) - px units only — no
rem,em,vh,vw, orcalc() - Explicit dimensions on images — always set
widthandheight - Absolute URLs — all
srcandhrefmust be fully qualified
Example Input
---
preheader: "Your weekly update is here"
brand-color: "#6366f1"
header-logo: "https://example.com/logo.png"
footer-text: "Acme Inc. | 123 Main St | [Unsubscribe](https://example.com/unsub)"
---
:::hero
# Welcome to the Weekly Update
Everything you need to know, in one email.
:::
## What's New
We shipped **three major features** this week:
- Real-time collaboration
- Dark mode support
- Export to PDF
:::callout[tip]
Try dark mode by going to Settings > Appearance.
:::
:::button[Try it now](https://example.com/app)
## By the Numbers
| Metric | This Week | Last Week |
|---|---|---|
| Active Users | 12,450 | 11,200 |
| Signups | 890 | 720 |
> "This is the best update yet!" — A happy user
---
Thanks for reading. See you next week!
More from olshansk/agent-skills
session-commit
Capture learnings from the current coding session and update AGENTS.md. Use when the user asks to close the loop, run session-commit, record best practices, or update agent instructions based on recent work.
30skills-dashboard
Scrape skills.sh and generate an interactive HTML dashboard showing skill distribution by publisher, installs, and categories. Rerun anytime to get fresh data.
29cmd-clean-code
Improve code readability without altering functionality using idiomatic best practices
25cmd-idiot-proof-docs
Simplify documentation for clarity and scannability with approval-gated edits
18cmd-rss-feed-generator
Generate Python RSS feed scrapers from blog websites, integrated with hourly GitHub Actions
18cmd-proofread
Proofread posts before publishing for spelling, grammar, repetition, logic, weak arguments, broken links, and optionally reformat for skimmability or shape the writing vibe toward a known author's style
17