Compile React-shaped TypeScript and TSX into static HTML and route-specific JavaScript — no React runtime, virtual DOM, or hydration.
16
stars
273
commits
JavaScript
primary language
Sep 4, 2026
updated
HTML-first TSX framework with synchronous state semantics and no virtual DOM.
Kudzu compiles ordinary React-shaped TypeScript and TSX into complete static HTML, CSS, and only the route-specific ESM capabilities actually used. Static pages ship zero JavaScript. React, hydration, a VDOM, and a retained browser component tree are not part of the output.
Watch: React-shaped TSX to static HTML and route-specific ESM in 22 seconds.
Experimental
0.16.x: the compiler API and supported TSX surface may change.
Latest release: 0.16.5 - Bounded navigation cache. Superseded navigations can no longer resurrect pruned prefetched documents, and the maintained endurance gate now covers cache races, route ownership, keyed state, dialogs, and external editors. Read the release notes, open the release page, or follow the architecture packet.
Kudzu requires Node.js 22 or newer.
npm create kudzu@latest my-app
cd my-app
npm install
npm run dev
The generated project includes reusable components, an interactive state example, a zero-JavaScript static route, metadata, and responsive CSS.
To add Kudzu to an existing project:
npm install @kudzujs/core typescript
Add the Kudzu commands to package.json:
{
"scripts": {
"dev": "kudzu dev",
"build": "kudzu build",
"check": "tsc --noEmit && kudzu build"
}
}
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Bundler",
"jsx": "react-jsx",
"jsxImportSource": "@kudzujs/core",
"strict": true
}
}
Put routes in src/pages; src/pages/index.tsx maps to /.
import { useState } from "@kudzujs/core"
export default function HomePage() {
const [count, setCount] = useState(0)
return <button onClick={() => setCount(count + 1)}>
Grown {count} times
</button>
}
npm run dev
npm run build
ordinary React-shaped TSX
-> Kudzu compiler specialization
-> complete HTML + CSS + capability-specific ESM
useState and reduced useReducer, including directly serializable lazy initialization, compile to synchronous logical state and batched direct DOM writes; top-level useId and direct intrinsic forwardRef authoring erase to static HTML without a component runtime.const setter callbacks and object refs may cross the same direct intrinsic boundary.getStaticPaths().Link with a static root-relative to erases to a base-aware native anchor; no router package or runtime is emitted.useParams() call on a runtimeParams bracket route reuses Kudzu's route-specific pathname reader.useMatch("/exact-path") route binding folds case-insensitively from the build-known application route without browser JavaScript.useSearchParams() supports direct static get("name") locals, the exact numeric pagination fallback Number(params.get("page")) || 1, a static imported-array string fallback, and inline setter updaters, lowering reads and history writes to one route-specific query capability.Row and Col with children, static classes, and numeric literal Col breakpoints erase to native Bootstrap grid markup; applications retain ownership of Bootstrap CSS.useNavigate() top-level binding lowers direct nested-callback calls with safe static root-relative destinations to native location.assign() or location.replace() navigation.Migration input may retain supported imports from react; Kudzu erases those references and never emits or executes React. New Kudzu source should import framework APIs from @kudzujs/core.
See the complete guide, interactive features, and current limits instead of relying on this README as an API reference.
Kudzu treats React-shaped TSX as compiler input rather than as a browser runtime programming model:
React-shaped TypeScript/TSX
-> ordered AST normalization passes
-> state/effect/handler/binding/list analysis
-> complete HTML + route-specific capability ESM
framework/compiler/normalization-pipeline.mjs owns pass order and repairs AST parent pointers after structurally changed transforms.Kudzu intentionally does not provide:
Browser code is a compiler-generated capability module, included only when a route uses that capability. Kudzu does not eliminate every runtime; it eliminates unused runtime.
@kudzujs/core: compiler, CLI, JSX runtime, and framework APIscreate-kudzu: project generator and working showcasenpm run check
npm test
Read AGENTS.md and the migration roadmap before extending migration syntax or browser capabilities.
MIT
271 commits
2 commits
JavaScript
74.3%
TypeScript
24.8%
Compile React-shaped TypeScript and TSX into static HTML and route-specific JavaScript — no React runtime, virtual DOM, or hydration.
16
stars
273
commits
JavaScript
primary language
Sep 4, 2026
updated
HTML-first TSX framework with synchronous state semantics and no virtual DOM.
Kudzu compiles ordinary React-shaped TypeScript and TSX into complete static HTML, CSS, and only the route-specific ESM capabilities actually used. Static pages ship zero JavaScript. React, hydration, a VDOM, and a retained browser component tree are not part of the output.
Watch: React-shaped TSX to static HTML and route-specific ESM in 22 seconds.
Experimental
0.16.x: the compiler API and supported TSX surface may change.
Latest release: 0.16.5 - Bounded navigation cache. Superseded navigations can no longer resurrect pruned prefetched documents, and the maintained endurance gate now covers cache races, route ownership, keyed state, dialogs, and external editors. Read the release notes, open the release page, or follow the architecture packet.
Kudzu requires Node.js 22 or newer.
npm create kudzu@latest my-app
cd my-app
npm install
npm run dev
The generated project includes reusable components, an interactive state example, a zero-JavaScript static route, metadata, and responsive CSS.
To add Kudzu to an existing project:
npm install @kudzujs/core typescript
Add the Kudzu commands to package.json:
{
"scripts": {
"dev": "kudzu dev",
"build": "kudzu build",
"check": "tsc --noEmit && kudzu build"
}
}
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Bundler",
"jsx": "react-jsx",
"jsxImportSource": "@kudzujs/core",
"strict": true
}
}
Put routes in src/pages; src/pages/index.tsx maps to /.
import { useState } from "@kudzujs/core"
export default function HomePage() {
const [count, setCount] = useState(0)
return <button onClick={() => setCount(count + 1)}>
Grown {count} times
</button>
}
npm run dev
npm run build
ordinary React-shaped TSX
-> Kudzu compiler specialization
-> complete HTML + CSS + capability-specific ESM
useState and reduced useReducer, including directly serializable lazy initialization, compile to synchronous logical state and batched direct DOM writes; top-level useId and direct intrinsic forwardRef authoring erase to static HTML without a component runtime.const setter callbacks and object refs may cross the same direct intrinsic boundary.getStaticPaths().Link with a static root-relative to erases to a base-aware native anchor; no router package or runtime is emitted.useParams() call on a runtimeParams bracket route reuses Kudzu's route-specific pathname reader.useMatch("/exact-path") route binding folds case-insensitively from the build-known application route without browser JavaScript.useSearchParams() supports direct static get("name") locals, the exact numeric pagination fallback Number(params.get("page")) || 1, a static imported-array string fallback, and inline setter updaters, lowering reads and history writes to one route-specific query capability.Row and Col with children, static classes, and numeric literal Col breakpoints erase to native Bootstrap grid markup; applications retain ownership of Bootstrap CSS.useNavigate() top-level binding lowers direct nested-callback calls with safe static root-relative destinations to native location.assign() or location.replace() navigation.Migration input may retain supported imports from react; Kudzu erases those references and never emits or executes React. New Kudzu source should import framework APIs from @kudzujs/core.
See the complete guide, interactive features, and current limits instead of relying on this README as an API reference.
Kudzu treats React-shaped TSX as compiler input rather than as a browser runtime programming model:
React-shaped TypeScript/TSX
-> ordered AST normalization passes
-> state/effect/handler/binding/list analysis
-> complete HTML + route-specific capability ESM
framework/compiler/normalization-pipeline.mjs owns pass order and repairs AST parent pointers after structurally changed transforms.Kudzu intentionally does not provide:
Browser code is a compiler-generated capability module, included only when a route uses that capability. Kudzu does not eliminate every runtime; it eliminates unused runtime.
@kudzujs/core: compiler, CLI, JSX runtime, and framework APIscreate-kudzu: project generator and working showcasenpm run check
npm test
Read AGENTS.md and the migration roadmap before extending migration syntax or browser capabilities.
MIT
271 commits
2 commits
JavaScript
74.3%
TypeScript
24.8%