Courses

Text-first courses that end with something you built. Free courses are open to everyone and read right here; paid ones go deeper on learn.mikezupper.com.

Freeintermediate

A Reactive Dashboard with Lit and Signals

Build a real analytics interface on web components: a TC39 signals store, a debounced query runner that cannot render a stale result, twelve Lit components with their own shadow styles, D3 charts, and a design system that recolors from one slider. Free and text-first.

Freeintermediate

SQL in the Browser: DuckDB WASM from Scratch

Put a real SQL engine in a browser tab. Build the data layer of an analytics app on DuckDB compiled to WebAssembly — a worker, a database file that survives reloads, prepared statements, window functions, and a SQL console you write yourself. Free and text-first.

intermediate

Testing the Untestable: Workers, WASM, and Shadow DOM

The sequel to the free DuckDB series: a test suite for code jsdom cannot run. Real browsers, real WebAssembly, real workers, deterministic fixtures, fake-timer proofs for a debounced query runner, and end-to-end checks that a database file survives a reload. Seven lessons, $5.

Freeintermediate

Port a Classic Java App to Rust

Rebuild MyBatis JPetStore 6 in Rust, layer by layer: Axum for Stripes, SQLx for MyBatis, Askama for JSP, and one static binary where the app server used to be. Free and text-first.