Inky is a complete email framework that converts simple HTML into complex, responsive email-ready HTML. It includes a templating engine, built-in responsive CSS, CSS inlining, validation, and a CLI toolchain.
Written in Rust. Distributed as a CLI binary, WASM module, native shared library, and Rust crate — with official bindings for Node.js, PHP, Python, Ruby, and Go.
Inky was formerly known as "Foundation for Emails." Starting with v2, everything is unified under the Inky brand.
Give Inky simple HTML like this:
<container> <row> <column lg="6">Left</column> <column lg="6">Right</column> </row> </container>
And get email-ready HTML like this:
<table role="presentation" align="center" class="container"> <tbody><tr><td> <table role="presentation" class="row"> <tbody><tr> <th class="small-12 large-6 columns first"> <table role="presentation"><tbody><tr><th>Left</th></tr></tbody></table> </th> <th class="small-12 large-6 columns last"> <table role="presentation"><tbody><tr><th>Right</th></tr></tbody></table> </th> </tr></tbody> </table> </td></tr></tbody> </table>
Install
# Homebrew brew install foundation/inky/inky # Cargo cargo install inky-cli # npm (WASM) npm install inky-email
Quick Start
# Scaffold a new project inky init my-email cd my-email # Build inky build # Watch for changes inky watch
What's New in v2
- Rust rewrite — fast, single binary, cross-platform
- Modern syntax — attributes over classes (
size="small"instead ofclass="small") - 27 components — layout, buttons, cards, alerts, hero sections, social links, video, and more
- CSS inlining — built-in, enabled by default
- SCSS framework — responsive email styles with per-template variable overrides
- Layouts & includes —
<layout>,<include>, custom<ink-*>components, and template variables - Validation — catches missing alt text, Gmail clipping risks, Outlook issues
- Data merging — optional Jinja2-compatible data merge via MiniJinja (
--data data.json) - Hybrid output —
--hybridmode emits<div>layout with Outlook MSO ghost table fallbacks - Bulletproof buttons — VML
<v:roundrect>fallbacks for styled buttons in Outlook - Live preview —
inky servestarts a local dev server with auto-reload - Template friendly — auto-preserves ERB, Jinja2, Handlebars, and other merge tag syntax
- Plain text generation — auto-generate
.txtmultipart email version (--plain-text) - Spam checker —
inky spam-checkdetects common spam triggers - 22 validation rules — links, accessibility, rendering quirks, Gmail clipping, spam detection
- Per-template data —
--data-dirauto-pairs JSON data files with templates - Migration tool —
inky migrateconverts v1 syntax to v2 automatically - Language bindings — Node.js, PHP, Python, Ruby, Go
Documentation
- Getting Started — Installation, CLI usage, first template
- Component Reference — All 27 components with examples
- Style Reference — SCSS variables for colors, typography, layout, and more
- Email Development Guide — CSS support, Outlook quirks, images, testing, and best practices
- Email Client Compatibility — Support matrix across desktop, webmail, and mobile
- Data Merging — Merge JSON data into templates
- Hybrid Output —
<div>layout with Outlook fallbacks - Migration Guide — Upgrading from v1 to v2
- Language Bindings — Node.js, PHP, Python, Ruby, Go
- Troubleshooting — Common issues and how to fix them
Examples
| Language | Repository |
|---|---|
| Node.js | inky-example-node |
| PHP | inky-example-php |
| Python | inky-example-python |
| Ruby | inky-example-ruby |
| Go | inky-example-go |
Building from Source
git clone https://github.com/foundation/inky.git cd inky # Build the CLI cargo build -p inky-cli --release # Binary at: target/release/inky # Run tests cargo test --workspace
Architecture
| Crate | Purpose | Output |
|---|---|---|
inky-core |
Core transformation engine | Rust library |
inky-cli |
Command-line tool | inky binary |
inky-wasm |
Browser/Node.js bindings | .wasm module |
inky-ffi |
PHP/Python/Ruby/Go bindings | .so / .dylib / .dll |
License
MIT