Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 24 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,25 @@ All notable changes to this project will be documented in this file.

## Unreleased

## 0.1.5 - 2026-07-05

### Added

- Added a cross-library email benchmark suite comparing Solid Email with React
Email, JSX Email, and MJML React across render latency, throughput, heap
usage, output size, and pairwise HTML conformance.
- Added the `pnpm benchmark:cross-library` script for running the
cross-library benchmark suite from the workspace root.

### Changed

- Bumped `@solid-email/render` and `@akin01/solid-email` to `0.1.5` so both
publishable packages can be released together with the benchmark and Workerd
compatibility updates.
- Bumped the private monorepo metadata and Solid Email skill metadata to
`0.1.5`.
- Updated e2e fixture tarball references to `0.1.5` so published-package
integration tests install the current release artifacts.
- Browser-condition imports from `@akin01/solid-email` now resolve to the
DOM/CSR preview build, replacing the public `@akin01/solid-email/client`
subpath while keeping server, Workerd, and default imports on the SSR/email
Expand All @@ -20,6 +37,9 @@ All notable changes to this project will be documented in this file.

### Related commits

- Cross-library benchmark suite
- [`03d9a87069f3`](https://github.com/Akin01/solid-email/commit/03d9a87069f37a15870428525aec9cd18614b580) Merged PR #14 for `feat/add-cross-library-benchmark`.
- [`47352df6af85`](https://github.com/Akin01/solid-email/commit/47352df6af851df8920ee7f7a73ba4e8d6b52396) Addressed cross-library benchmark review feedback.
- Workerd-safe root exports and rendering
- [`691ed9560834`](https://github.com/Akin01/solid-email/commit/691ed95608341c664c8d80335e001faea667cf9a) Added Workerd-safe root export conditions, server/runtime fixes, and Cloudflare TanStack Start coverage.
- [`9c6bb421f37b`](https://github.com/Akin01/solid-email/commit/9c6bb421f37b427bc9f05305a3bac63a886d4857) Added the TypeScript shim for CSS Tree's dist ESM entry used by Workerd-safe Tailwind imports.
Expand All @@ -28,11 +48,12 @@ All notable changes to this project will be documented in this file.

### Verified

- `pnpm exec biome check package.json packages/solid-email/package.json packages/render/package.json skills/solid-email/SKILL.md README.md CHANGELOG.md benchmarks/cross-library/tsconfig.json e2e/vite/package.json e2e/tanstack-start/package.json e2e/cloudflare-tanstack-start/package.json e2e/vite/pnpm-workspace.yaml e2e/tanstack-start/pnpm-workspace.yaml e2e/cloudflare-tanstack-start/pnpm-workspace.yaml`
- `pnpm test`
- `pnpm test:e2e`
- `pnpm typecheck`
- `pnpm build`
- `pnpm lint`
- `pnpm --filter @benchmarks/cross-library run typecheck`
- `pnpm benchmark:cross-library`
- `node scripts/create-github-releases.mjs --dry-run --package-version @solid-email/render@0.1.5 --package-version @akin01/solid-email@0.1.5`

## 0.1.4 - 2026-06-26

Expand Down
25 changes: 20 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ Measured with `pnpm benchmark:rendering` on the repository marketing email fixtu
| Solid Email `render()` | Static JSX | 2.2919ms | 436.33 hz | 5.02x faster than React Email `render()` |
| Solid Email `renderSync()` | Static JSX | 1.8935ms | 528.13 hz | 6.08x faster than React Email `render()` |
| Solid Email `render()` | Tailwind JSX | 3.1230ms | 320.20 hz | 5.69x faster than React Email Tailwind |
| Solid Email `compileSync` render (cached) | Static JSX | 0.0438ms | 22,842 hz | 263x faster than React Email `render()` |
| Solid Email `compileSync` render (cached) | Static JSX | **0.0438ms** | **22,842 hz** | 263x faster than React Email `render()` |
| Solid Email `compile` render (cached) | Static JSX | 0.0858ms | 11,661 hz | 134x faster than React Email `render()` |
| Solid Email `compile` render (cached) | Tailwind JSX | 0.0452ms | 22,145 hz | 393x faster than React Email Tailwind |
| Solid Email `compile` render (cached) | Tailwind JSX | 0.0452ms | 22,145 hz | **393x faster than React Email Tailwind** |
| React Email `render()` | Static JSX | 11.5084ms | 86.89 hz | Baseline |
| React Email `render()` | Tailwind JSX | 17.7760ms | 56.26 hz | Tailwind baseline |

Expand All @@ -49,21 +49,36 @@ Plain-text benchmarks measured with `pnpm benchmark:html-to-text` on the reposit
| Operation | Fixture | Mean | Throughput | Comparison |
| --- | --- | ---: | ---: | --- |
| `@solid-email/render` `toPlainText` | HTML fixtures | 2.4369ms | 410.36 hz | 3.40x faster than React Email `toPlainText` |
| `@solid-email/render` compiled text template | Solid JSX | 1.4434ms | 692.83 hz | 8.61x faster than React Email plain-text render |
| `@solid-email/render` compiled text template | Solid JSX | **1.4434ms** | **692.83 hz** | **8.61x faster than React Email plain-text render** |
| `@solid-email/render` uncompiled `renderSync` plain text | Solid JSX | 2.8895ms | 346.09 hz | 4.30x faster than React Email plain-text render |
| `@solid-email/html-to-text` `convert` | HTML fixtures | 3.9657ms | 252.16 hz | Direct package converter |
| `html-to-text` `convert` | HTML fixtures | 3.8166ms | 262.01 hz | Direct converter baseline |
| React Email `toPlainText` | HTML fixtures | 8.2867ms | 120.67 hz | React text conversion baseline |
| React Email `render` plain text | React JSX | 12.4310ms | 80.44 hz | React plain-text render baseline |

Cross-library benchmarks measured with `pnpm benchmark:cross-library` on the
marketing email template, using 50 iterations × 10 runs after 3 warmup runs.
Lower average time is better.

| Library / mode | Avg | Min | Max | Ops/s | Output | Heap Δ | Conformance | vs React Email |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| Solid Email `renderSync` | 1.17ms | 764µs | 1.47ms | 853 | 22.6 KB | **<0.01 MB** | 100% | 1.5x faster |
| Solid Email `compileSync` render (cached) | **12µs** | **9µs** | **15µs** | **83,483** | 23.4 KB | **<0.01 MB** | 100% | **148.4x faster** |
| JSX Email `render` | 3.82ms | 3.25ms | 5.45ms | 262 | **18.2 KB** | 1.15 MB | 100% | 2.1x slower |
| React Email `render` | 1.78ms | 1.37ms | 4.00ms | 563 | 22.5 KB | 26.36 MB | 100% | Baseline |
| MJML React `render` | 11.01ms | 9.39ms | 14.74ms | 91 | 75.5 KB | 1.57 MB | 100% | 6.2x slower |

All cross-library outputs reached 100% pairwise conformance against the shared
email template checks.

Bundle size compares built ESM entry files after `pnpm build`; gzip uses Node's `zlib.gzipSync`.

| Package entry | Raw size | Gzip size | Comparison |
| --- | ---: | ---: | --- |
| `@akin01/solid-email/dist/index.mjs` | 199.0 KiB | 42.7 KiB | Server/root components and render utility re-exports |
| `@akin01/solid-email/dist/client/index.mjs` | 105.9 KiB | 19.5 KiB | Browser-condition DOM preview build |
| `@solid-email/render/dist/node/index.mjs` | 26.3 KiB | 6.2 KiB | Renderer entry |
| Solid Email server entries | 225.3 KiB | 48.9 KiB | 6.4x smaller raw / 7.1x smaller gzip than React Email |
| `@solid-email/render/dist/node/index.mjs` | **26.3 KiB** | **6.2 KiB** | Renderer entry |
| Solid Email server entries | 225.3 KiB | 48.9 KiB | **6.4x smaller raw / 7.1x smaller gzip than React Email** |
| Solid Email all ESM condition entries | 331.2 KiB | 68.4 KiB | 4.4x smaller raw / 5.1x smaller gzip than React Email |
| `react-email/dist/index.mjs` | 1,448.0 KiB | 348.6 KiB | React Email baseline |

Expand Down
3 changes: 2 additions & 1 deletion benchmarks/cross-library/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
"**/*.mts",
"**/*.tsx",
"**/*.d.ts",
"../../packages/render/src/shared/solid-js-web-server.d.ts"
"../../packages/render/src/shared/solid-js-web-server.d.ts",
"../../packages/solid-email/src/render-shim.d.ts"
],
"exclude": ["dist", "node_modules", "results"]
}
4 changes: 2 additions & 2 deletions e2e/cloudflare-tanstack-start/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
},
"dependencies": {
"@solid-email/html-to-text": "file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz",
"@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.4.tgz",
"@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.4.tgz",
"@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.5.tgz",
"@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.5.tgz",
"solid-js": "1.9.13"
},
"devDependencies": {
Expand Down
4 changes: 2 additions & 2 deletions e2e/cloudflare-tanstack-start/pnpm-workspace.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
overrides:
'@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.4.tgz
'@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.5.tgz
'@solid-email/html-to-text': file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz
'@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.4.tgz
'@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.5.tgz

allowBuilds:
esbuild: true
Expand Down
4 changes: 2 additions & 2 deletions e2e/tanstack-start/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
},
"dependencies": {
"@solid-email/html-to-text": "file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz",
"@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.4.tgz",
"@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.4.tgz",
"@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.5.tgz",
"@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.5.tgz",
"solid-js": "1.9.13"
},
"devDependencies": {
Expand Down
4 changes: 2 additions & 2 deletions e2e/tanstack-start/pnpm-workspace.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
overrides:
'@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.4.tgz
'@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.5.tgz
'@solid-email/html-to-text': file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz
'@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.4.tgz
'@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.5.tgz

allowBuilds:
esbuild: true
4 changes: 2 additions & 2 deletions e2e/vite/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
},
"dependencies": {
"@solid-email/html-to-text": "file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz",
"@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.4.tgz",
"@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.4.tgz",
"@solid-email/render": "file:../.tmp/packs/solid-email-render-0.1.5.tgz",
"@akin01/solid-email": "file:../.tmp/packs/akin01-solid-email-0.1.5.tgz",
"solid-js": "1.9.13"
},
"devDependencies": {
Expand Down
4 changes: 2 additions & 2 deletions e2e/vite/pnpm-workspace.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
overrides:
'@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.4.tgz
'@akin01/solid-email': file:../.tmp/packs/akin01-solid-email-0.1.5.tgz
'@solid-email/html-to-text': file:../.tmp/packs/solid-email-html-to-text-0.1.1.tgz
'@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.4.tgz
'@solid-email/render': file:../.tmp/packs/solid-email-render-0.1.5.tgz

allowBuilds:
esbuild: true
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "solid-email-monorepo",
"version": "0.1.4",
"version": "0.1.5",
"private": true,
"repository": {
"type": "git",
Expand Down
2 changes: 1 addition & 1 deletion packages/render/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@solid-email/render",
"version": "0.1.4",
"version": "0.1.5",
"description": "Transform Solid components into HTML email templates",
"repository": {
"type": "git",
Expand Down
2 changes: 1 addition & 1 deletion packages/solid-email/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@akin01/solid-email",
"version": "0.1.4",
"version": "0.1.5",
"description": "High-quality Solid components for creating emails",
"repository": {
"type": "git",
Expand Down
2 changes: 1 addition & 1 deletion skills/solid-email/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ description: Use when building, reviewing, testing, or documenting HTML email te
license: MIT
metadata:
author: Ainul Yaqin
version: "0.1.4"
version: "0.1.5"
homepage: https://github.com/akin01/solid-email
source: https://github.com/akin01/solid-email
---
Expand Down
Loading