diff --git a/package.json b/package.json
index 223b821524..7fb0e6b9ea 100644
--- a/package.json
+++ b/package.json
@@ -4,15 +4,14 @@
"private": true,
"scripts": {
"build": "turbo run build",
- "dev": "turbo run dev --parallel --concurrency 25",
- "release": "turbo run build --filter=./packages/* && pnpm changeset publish",
"canary:enter": "changeset pre enter canary",
"canary:exit": "changeset pre exit",
- "version": "changeset version && pnpm install --no-frozen-lockfile && pnpm lint:fix",
"lint": "biome check",
"lint:fix": "biome check --write .",
+ "release": "turbo run build --filter=./packages/* && pnpm changeset publish",
"test": "turbo run test",
- "test:watch": "turbo run test:watch"
+ "test:watch": "turbo run test:watch",
+ "version": "changeset version && pnpm install --no-frozen-lockfile && pnpm lint:fix"
},
"devDependencies": {
"@biomejs/biome": "2.0.5",
diff --git a/packages/body/package.json b/packages/body/package.json
index 2ce0d152ac..9a2ecf26b8 100644
--- a/packages/body/package.json
+++ b/packages/body/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"peerDependencies": {
"react": "^18.0 || ^19.0 || ^19.0.0-rc"
diff --git a/packages/button/package.json b/packages/button/package.json
index 4c14589414..543d876aef 100644
--- a/packages/button/package.json
+++ b/packages/button/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/code-block/package.json b/packages/code-block/package.json
index fdf3afd4c1..ce43e6d253 100644
--- a/packages/code-block/package.json
+++ b/packages/code-block/package.json
@@ -24,8 +24,8 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
- "clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch"
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
+ "clean": "rm -rf dist"
},
"repository": {
"type": "git",
diff --git a/packages/code-inline/package.json b/packages/code-inline/package.json
index a00609f610..2b769d80fe 100644
--- a/packages/code-inline/package.json
+++ b/packages/code-inline/package.json
@@ -23,9 +23,9 @@
},
"license": "MIT",
"scripts": {
- "dev": "pnpm build --watch",
- "clean": "rm -rf dist",
- "build": "tsup src/index.ts --format esm,cjs --dts --external react"
+ "build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
+ "clean": "rm -rf dist"
},
"engines": {
"node": ">=18.0.0"
diff --git a/packages/column/package.json b/packages/column/package.json
index b862606041..e1933e4408 100644
--- a/packages/column/package.json
+++ b/packages/column/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/components/package.json b/packages/components/package.json
index 0e6fd92a0c..9345558666 100644
--- a/packages/components/package.json
+++ b/packages/components/package.json
@@ -24,8 +24,8 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
- "clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch"
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
+ "clean": "rm -rf dist"
},
"repository": {
"type": "git",
diff --git a/packages/container/package.json b/packages/container/package.json
index 52c6e2c5ff..5bc9bbf609 100644
--- a/packages/container/package.json
+++ b/packages/container/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/font/package.json b/packages/font/package.json
index 6db5099246..6c2f8ed4e2 100644
--- a/packages/font/package.json
+++ b/packages/font/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"peerDependencies": {
"react": "^18.0 || ^19.0 || ^19.0.0-rc"
diff --git a/packages/head/package.json b/packages/head/package.json
index e4b347bfb4..f3425a8a20 100644
--- a/packages/head/package.json
+++ b/packages/head/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/heading/package.json b/packages/heading/package.json
index 6eec032cb3..aa52b268b2 100644
--- a/packages/heading/package.json
+++ b/packages/heading/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/hr/package.json b/packages/hr/package.json
index 8383dc7212..f74be53ee4 100644
--- a/packages/hr/package.json
+++ b/packages/hr/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/html/package.json b/packages/html/package.json
index 9f20d221ea..f2b294c051 100644
--- a/packages/html/package.json
+++ b/packages/html/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/img/package.json b/packages/img/package.json
index 22bb964ac4..4af8f2b460 100644
--- a/packages/img/package.json
+++ b/packages/img/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/link/package.json b/packages/link/package.json
index 5dcc3bed5f..f147b9bb7e 100644
--- a/packages/link/package.json
+++ b/packages/link/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/markdown/package.json b/packages/markdown/package.json
index ce1edc8e8f..db01ebda78 100644
--- a/packages/markdown/package.json
+++ b/packages/markdown/package.json
@@ -23,10 +23,10 @@
},
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"keywords": [
"react",
diff --git a/packages/preview/package.json b/packages/preview/package.json
index 057d3dc005..950e842179 100644
--- a/packages/preview/package.json
+++ b/packages/preview/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/react-email/package.json b/packages/react-email/package.json
index 4bff5c0287..35c703d41f 100644
--- a/packages/react-email/package.json
+++ b/packages/react-email/package.json
@@ -8,8 +8,8 @@
"type": "module",
"scripts": {
"build": "tsup-node",
+ "build:watch": "tsup-node --watch src",
"clean": "rm -rf dist",
- "dev": "tsup-node --watch src",
"test": "vitest run",
"test:watch": "vitest"
},
diff --git a/packages/render/package.json b/packages/render/package.json
index 0aaa440d60..0da8592afb 100644
--- a/packages/render/package.json
+++ b/packages/render/package.json
@@ -66,8 +66,8 @@
"license": "MIT",
"scripts": {
"build": "tsup-node",
+ "build:watch": "tsup-node --watch",
"clean": "rm -rf dist",
- "dev": "tsup-node --watch",
"test": "vitest run",
"test:watch": "vitest"
},
diff --git a/packages/row/package.json b/packages/row/package.json
index 1383b01493..06a24cd890 100644
--- a/packages/row/package.json
+++ b/packages/row/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/section/package.json b/packages/section/package.json
index 9c5a6b0084..ccfe701d03 100644
--- a/packages/section/package.json
+++ b/packages/section/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/tailwind/package.json b/packages/tailwind/package.json
index f210dceb8f..de20d1ab61 100644
--- a/packages/tailwind/package.json
+++ b/packages/tailwind/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsc && NODE_ENV=production vite build --mode production && node ./copy-tailwind-types.mjs",
- "dev": "vite build --watch",
+ "build:watch": "vite build --watch",
"clean": "rm -rf dist",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/packages/text/package.json b/packages/text/package.json
index e921f99010..138e781165 100644
--- a/packages/text/package.json
+++ b/packages/text/package.json
@@ -24,10 +24,10 @@
"license": "MIT",
"scripts": {
"build": "tsup src/index.ts --format esm,cjs --dts --external react",
+ "build:watch": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
"clean": "rm -rf dist",
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
- "test:watch": "vitest",
- "test": "vitest run"
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"repository": {
"type": "git",
diff --git a/playground/README.md b/playground/README.md
new file mode 100644
index 0000000000..6a09c01c0f
--- /dev/null
+++ b/playground/README.md
@@ -0,0 +1,40 @@
+# React Email Playground
+
+This is a playground for React Email made to experiment with components in realtime.
+
+It includes all components directly from source with a path alias import of `@react-email/components` and hot reloading in the `dev` script.
+
+## Development workflow
+
+### 1. Create an email template
+
+Create a new file at `playground/emails/testing.tsx`
+
+```tsx emails/testing.tsx
+import { Html, Head, Body, Tailwind, Text } from '@react-email/components';
+
+export default function Testing() {
+ return