The JavaScript framework with zero dependencies.

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.

terminal
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:3000

Why Wizz

Less runtime. More platform.

Zero runtime dependencies

No npm graph, no Virtual DOM, no hydration framework. The browser receives compiled ES modules and a ~150-line router.

Compiled, not interpreted

Each .wizz file compiles ahead of time to createElement, textContent, and keyed list updates — only the nodes that depend on changed state are touched.

SSR + hydration by default

Pages render on the server and adopt their markup in place. A mismatch falls back to a clean client render — never duplicate DOM.

persist() cross-tab state

Swap a let initializer for persist(key, default) and the value survives reloads and converges across tabs over BroadcastChannel.

Scoped styles, extracted

<wizz:style> is scoped by a data-wizz-s attribute and extracted into app.css at build time — first paint arrives styled.

Built for agents too

Stable WIZZ-P/G diagnostic codes, a JSON build envelope, and an MCP server with compile-gated writes.

Under the hood

From .wizz to pixels in four stages

  1. 01

    Parse

    Tokenize the template, extract <script>, <wizz:head>, <wizz:style>, imports, props, persist markers.

  2. 02

    Analyze

    Map every template expression to the reactive names it reads and assign stable node IDs.

  3. 03

    Generate

    Emit a client module, a DOM-free server module, and a hydratable build with scoped CSS.

  4. 04

    Serve

    wizz dev server-renders each route; the router adopts the markup and wires listeners.

Documentation

Everything, in depth