Mike Zupper

Branch lines

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.

Free
4 courses, 46 lessons
$5 each
2 courses, 16 lessons

The map

Each tick is a lesson, and the commits are the curriculum.

From JPetStore, Aug 12, 2026

From Chess, Aug 13, 2026

From DuckDB, Aug 15, 2026

All 6 courses

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.

Ship the Port: Deploy Rust to a Server You Own

The sequel to the free JPetStore port: containerize the binary into a 7.7 MB scratch image, put it on a VPS behind automatic TLS, replicate the database off-box, and roll back by tag. Nine lessons, $5.

Build a Chess Game with Rust and WebAssembly

Build a complete chess game that runs entirely in the browser: a Rust engine compiled to WebAssembly, a Lit web component in front of it, and real tests at every layer. Free and text-first.

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.

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.

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.