If you've ever migrated ESPs, you know the pain.
You have templates living in three different places — your ESP's
drag-and-drop editor, a folder of MJML files in your repo, and a
Figma doc your designer swears is the source of truth but hasn't
been updated in four months.
Then someone says "we're switching from Mailgun to Resend" and
suddenly you're rewriting every single template from scratch.
I've hit this wall too many times. So I built Maildeno.
What is Maildeno?
Maildeno is a headless email template builder for developers.
The idea is simple:
- Design templates once in a visual editor
- Define merge tags and visibility rules
- Export to HTML, MJML, or React Email
- Send with whatever ESP you already use
No lock-in. No migration cost. No scattered files.
The problem it solves
Most teams end up with one of these setups:
Setup A — Templates live in the ESP editor
Works fine until you want to switch ESPs. Then you're exporting
broken HTML and trying to reconstruct layouts you built two years ago.
Setup B — Templates live in your repo as MJML files
Better for version control, but now your designer can't touch them
without opening a PR. Every copy change becomes an engineering ticket.
Setup C — Templates live everywhere
The worst. Production uses the ESP version, staging uses the MJML
file, and nobody knows which one is correct.
How Maildeno works
1. Design in the visual editor
Drag and drop rows and columns into a layout. Typography controls,
spacing, gradients, custom borders. Output that doesn't look like
it was built in 2012.
2. Define merge tags
Insert dynamic placeholders directly into the design — customer name,
order total, CTA link. Three variants: text (HTML-escaped), url
(percent-encoded), attr (attribute-safe). The SDK applies correct
escaping automatically.
3. Set visibility rules
Attach show/hide conditions to any row or section visually. No code.
Just set conditions like plan === "pro" or daysLeft < 7 directly
in the editor.
4. Debug with the visual logic debugger
This is the feature I'm most proud of. Pass a context object directly
in the editor and see exactly what the template renders to for that
specific user. No deploys. No console logs. No guessing.
5. Export and send
Export to HTML, MJML, or React Email. Pass the output to AWS SES,
Postmark, Resend, Mailgun — whatever you already use.
The SDK
Install in seconds:
// JavaScript / TypeScript
npm install maildeno
// Python
pip install maildeno
Render in your app:
import { MaildenoClient } from "maildeno"
const client = new MaildenoClient({
apiKey: process.env.MAILDENO_API_KEY,
})
const html = await client.renderHtml("your-template-id")
// Pass to your ESP
await resend.emails.send({
to: user.email,
subject: "Welcome!",
html,
})
Customer data never leaves your server
Templates are rendered locally via an embedded WebAssembly engine.
Merge tags and context are applied in-process — your customer data
is never sent to Maildeno's servers.
Caching built in
The SDK resolves renders through a layered cache:
- Memory cache — zero config, sub-millisecond reads
- Disk cache — opt-in, survives Lambda cold starts
- Stale-on-error fallback — if Maildeno goes down and a cached copy exists, the SDK renders from cache and never throws
Your send pipeline never breaks.
Who it's for
- SaaS teams with templates scattered across ESPs and repos
- Developer-designer teams tired of handoff friction
- Anyone shipping transactional email at scale
Maildeno Builder
Try it
Free tier available. No credit card required. Works with every ESP.
👉 maildeno.com
👉 Docs: docs.maildeno.com
Would love feedback from anyone who's dealt with this problem —
especially around the ESP migration pain or the designer-developer
handoff. Drop a comment below.
Top comments (0)