Zero runtime dependencies
No npm graph, no Virtual DOM, no hydration framework. The browser receives compiled ES modules and a ~150-line router.
Wizz.js is a full-stack framework for building web apps. Write components in single .wizz files and the compiler turns them into plain JavaScript that updates the DOM directly. Server rendering, scoped styles, and API routes are built in — no Virtual DOM, no npm packages to ship. This site runs on it.
curl -fsSL https://raw.githubusercontent.com/duncantidd/wizz.js/main/scripts/install-cli.sh | bash
wizz init my-app
cd my-app && wizz dev # http://127.0.0.1:3000Why Wizz
No npm graph, no Virtual DOM, no hydration framework. The browser receives compiled ES modules and a ~150-line router.
Each .wizz file compiles ahead of time to createElement, textContent, and keyed list updates — only the nodes that depend on changed state are touched.
Pages render on the server and adopt their markup in place. A mismatch falls back to a clean client render — never duplicate DOM.
Swap a let initializer for persist(key, default) and the value survives reloads and converges across tabs over BroadcastChannel.
<wizz:style> is scoped by a data-wizz-s attribute and extracted into app.css at build time — first paint arrives styled.
Stable WIZZ-P/G diagnostic codes, a JSON build envelope, and an MCP server with compile-gated writes.
Under the hood
.wizz to pixels in four stagesTokenize the template, extract <script>, <wizz:head>, <wizz:style>, imports, props, persist markers.
Map every template expression to the reactive names it reads and assign stable node IDs.
Emit a client module, a DOM-free server module, and a hydratable build with scoped CSS.
wizz dev server-renders each route; the router adopts the markup and wires listeners.
Documentation