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># Homebrew
brew install foundation/inky/inky
# Cargo
cargo install inky-cli
# npm (WASM)
npm install inky-email# Scaffold a new project
inky init my-email
cd my-email
# Build
inky build
# Watch for changes
inky watch- 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
- 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
| Language | Repository |
|---|---|
| Node.js | inky-example-node |
| PHP | inky-example-php |
| Python | inky-example-python |
| Ruby | inky-example-ruby |
| Go | inky-example-go |
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| 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 |
MIT