Lit Pigeon
Design responsive emails by dragging blocks around, then export MJML and HTML you actually own. Open source, ~69 kB gzipped at load, no SaaS in the middle.
Lit PigeonDesign responsive emails by dragging blocks around, then export MJML and HTML you actually own. Open source, ~69 kB gzipped at load, no SaaS in the middle.
How it compares to other email editing solutions
| Solution | Open Source | Framework Agnostic | Bundle Size | MJML Export | Visual Editor |
|---|---|---|---|---|---|
| Unlayer | ✗ Proprietary | ✓ | ~300 kB+ | ✗ | ✓ |
| GrapesJS | ✓ | ✓ | ~250 kB+ | ✗ Plugin | ✓ |
| MJML / React Email | ✓ | ✗ Code-first (React Email is React-only) | Varies | ✓ | ✗ Code-only |
| Mosaico | ✓ | ✗ Knockout.js | ~200 kB+ | ✗ | ✓ |
| Lit Pigeon | ✓ MIT | ✓ Web Components | ~69 kB gzipped* | ✓ Built-in | ✓ Drag & Drop |
* Initial JS of this site's playground (editor + core + Lit, gzipped). The TipTap rich-text engine (~140 kB gz) lazy-loads on first text edit. Other tools' sizes are their published editor bundles and vary by configuration.
Everything you need to build email templates
Visual editor with block placement, reordering, and multi-column layouts.
Render to MJML and responsive HTML built for Gmail, Outlook, and Apple Mail.
Import existing MJML templates into the editor for further editing.
Web components with Lit. Wrappers for React, Vue, Svelte, and Angular — or use vanilla JS.
~7 kB document core + ~48 kB editor UI (gzipped). The rich-text engine lazy-loads on first text edit — this demo boots on ~69 kB of JS.
Extend the editor with custom blocks, toolbars, and behaviors — inspired by ProseMirror.
Modular architecture — use only what you need
Get up and running in seconds
import '@lit-pigeon/editor';
import { createDefaultDocument } from '@lit-pigeon/core';
const editor = document.querySelector('pigeon-editor');
editor.document = createDefaultDocument('My Email');
import { PigeonEditor } from '@lit-pigeon/react';
import { createDefaultDocument } from '@lit-pigeon/core';
const doc = createDefaultDocument('My Email');
export default function App() {
return <PigeonEditor document={doc} />;
}
import { PigeonEditorModule } from '@lit-pigeon/angular';
// In your module
@NgModule({ imports: [PigeonEditorModule] })
// In your template
<pigeon-editor [document]="doc"></pigeon-editor>