{"id":13705313,"url":"https://github.com/foundation/inky","last_synced_at":"2026-04-02T18:46:23.222Z","repository":{"id":27510088,"uuid":"30990737","full_name":"foundation/inky","owner":"foundation","description":"An email framework that converts simple HTML into responsive email-ready HTML.","archived":false,"fork":false,"pushed_at":"2026-03-30T01:37:58.000Z","size":1666,"stargazers_count":694,"open_issues_count":0,"forks_count":107,"subscribers_count":42,"default_branch":"develop","last_synced_at":"2026-03-30T01:39:09.891Z","etag":null,"topics":["email","email-marketing","html"],"latest_commit_sha":null,"homepage":"https://foundationcss.com/inky/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/foundation.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"contributing.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2015-02-18T22:34:14.000Z","updated_at":"2026-03-30T01:28:40.000Z","dependencies_parsed_at":"2024-06-18T12:30:44.947Z","dependency_job_id":"ec0a591f-7202-49c6-bc4c-676891f79f82","html_url":"https://github.com/foundation/inky","commit_stats":{"total_commits":243,"total_committers":35,"mean_commits":6.942857142857143,"dds":0.5555555555555556,"last_synced_commit":"8e471ed4b20714a06299e19b9368f3dbb29a2f7b"},"previous_names":["zurb/inky"],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/foundation/inky","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foundation%2Finky","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foundation%2Finky/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foundation%2Finky/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foundation%2Finky/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/foundation","download_url":"https://codeload.github.com/foundation/inky/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foundation%2Finky/sbom","scorecard":{"id":407858,"data":{"date":"2025-08-11","repo":{"name":"github.com/foundation/inky","commit":"8e471ed4b20714a06299e19b9368f3dbb29a2f7b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/16 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'develop'","Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 14 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"36 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-wg6g-ppvx-927h","Warn: Project is vulnerable to: GHSA-897m-rjf5-jp39","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-2j2x-2gpw-g8fm","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-hxcc-f52p-wc94","Warn: Project is vulnerable to: GHSA-g4rg-993r-mgx7","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T21:50:54.591Z","repository_id":27510088,"created_at":"2025-08-18T21:50:54.591Z","updated_at":"2025-08-18T21:50:54.591Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31172561,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-29T21:28:10.185Z","status":"online","status_checked_at":"2026-03-30T02:00:06.831Z","response_time":138,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["email","email-marketing","html"],"created_at":"2024-08-02T22:00:37.069Z","updated_at":"2026-04-02T18:46:23.213Z","avatar_url":"https://github.com/foundation.png","language":"Rust","funding_links":[],"categories":["Code","JavaScript","Github Repositories"],"sub_categories":["Templating","Cool projects to take a look"],"readme":"# Inky\n\nInky 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.\n\nWritten 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.\n\n\u003e Inky was formerly known as \"Foundation for Emails.\" Starting with v2, everything is unified under the Inky brand.\n\nGive Inky simple HTML like this:\n\n```html\n\u003ccontainer\u003e\n  \u003crow\u003e\n    \u003ccolumn lg=\"6\"\u003eLeft\u003c/column\u003e\n    \u003ccolumn lg=\"6\"\u003eRight\u003c/column\u003e\n  \u003c/row\u003e\n\u003c/container\u003e\n```\n\nAnd get email-ready HTML like this:\n\n```html\n\u003ctable role=\"presentation\" align=\"center\" class=\"container\"\u003e\n  \u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\n    \u003ctable role=\"presentation\" class=\"row\"\u003e\n      \u003ctbody\u003e\u003ctr\u003e\n        \u003cth class=\"small-12 large-6 columns first\"\u003e\n          \u003ctable role=\"presentation\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003cth\u003eLeft\u003c/th\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n        \u003c/th\u003e\n        \u003cth class=\"small-12 large-6 columns last\"\u003e\n          \u003ctable role=\"presentation\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003cth\u003eRight\u003c/th\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n        \u003c/th\u003e\n      \u003c/tr\u003e\u003c/tbody\u003e\n    \u003c/table\u003e\n  \u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\n\u003c/table\u003e\n```\n\n## Install\n\n```bash\n# Homebrew\nbrew install foundation/inky/inky\n\n# Cargo\ncargo install inky-cli\n\n# npm (WASM)\nnpm install inky-email\n```\n\n## Quick Start\n\n```bash\n# Scaffold a new project\ninky init my-email\ncd my-email\n\n# Build\ninky build\n\n# Watch for changes\ninky watch\n```\n\n## What's New in v2\n\n- **Rust rewrite** — fast, single binary, cross-platform\n- **Modern syntax** — attributes over classes (`size=\"small\"` instead of `class=\"small\"`)\n- **27 components** — layout, buttons, cards, alerts, hero sections, social links, video, and more\n- **CSS inlining** — built-in, enabled by default\n- **SCSS framework** — responsive email styles with per-template variable overrides\n- **Layouts \u0026 includes** — `\u003clayout\u003e`, `\u003cinclude\u003e`, custom `\u003cink-*\u003e` components, and template variables\n- **Validation** — catches missing alt text, Gmail clipping risks, Outlook issues\n- **Data merging** — optional Jinja2-compatible data merge via MiniJinja (`--data data.json`)\n- **Hybrid output** — `--hybrid` mode emits `\u003cdiv\u003e` layout with Outlook MSO ghost table fallbacks\n- **Bulletproof buttons** — VML `\u003cv:roundrect\u003e` fallbacks for styled buttons in Outlook\n- **Live preview** — `inky serve` starts a local dev server with auto-reload\n- **Template friendly** — auto-preserves ERB, Jinja2, Handlebars, and other merge tag syntax\n- **Plain text generation** — auto-generate `.txt` multipart email version (`--plain-text`)\n- **Spam checker** — `inky spam-check` detects common spam triggers\n- **22 validation rules** — links, accessibility, rendering quirks, Gmail clipping, spam detection\n- **Per-template data** — `--data-dir` auto-pairs JSON data files with templates\n- **Migration tool** — `inky migrate` converts v1 syntax to v2 automatically\n- **Language bindings** — Node.js, PHP, Python, Ruby, Go\n\n## Documentation\n\n- **[Getting Started](docs/getting-started.md)** — Installation, CLI usage, first template\n- **[Component Reference](docs/components.md)** — All 27 components with examples\n- **[Style Reference](docs/styles.md)** — SCSS variables for colors, typography, layout, and more\n- **[Email Development Guide](docs/email-guide.md)** — CSS support, Outlook quirks, images, testing, and best practices\n- **[Email Client Compatibility](docs/compatibility.md)** — Support matrix across desktop, webmail, and mobile\n- **[Data Merging](docs/data-merging.md)** — Merge JSON data into templates\n- **[Hybrid Output](docs/hybrid-output.md)** — `\u003cdiv\u003e` layout with Outlook fallbacks\n- **[Migration Guide](docs/migration.md)** — Upgrading from v1 to v2\n- **[Language Bindings](docs/bindings.md)** — Node.js, PHP, Python, Ruby, Go\n- **[Troubleshooting](docs/troubleshooting.md)** — Common issues and how to fix them\n\n## Examples\n\n| Language | Repository |\n|----------|------------|\n| Node.js | [inky-example-node](https://github.com/foundation/inky-example-node) |\n| PHP | [inky-example-php](https://github.com/foundation/inky-example-php) |\n| Python | [inky-example-python](https://github.com/foundation/inky-example-python) |\n| Ruby | [inky-example-ruby](https://github.com/foundation/inky-example-ruby) |\n| Go | [inky-example-go](https://github.com/foundation/inky-example-go) |\n\n## Building from Source\n\n```bash\ngit clone https://github.com/foundation/inky.git\ncd inky\n\n# Build the CLI\ncargo build -p inky-cli --release\n# Binary at: target/release/inky\n\n# Run tests\ncargo test --workspace\n```\n\n## Architecture\n\n| Crate | Purpose | Output |\n|-------|---------|--------|\n| `inky-core` | Core transformation engine | Rust library |\n| `inky-cli` | Command-line tool | `inky` binary |\n| `inky-wasm` | Browser/Node.js bindings (`inky` on npm) | `.wasm` module |\n| `inky-ffi` | PHP/Python/Ruby/Go bindings | `.so` / `.dylib` / `.dll` |\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoundation%2Finky","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffoundation%2Finky","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoundation%2Finky/lists"}