⏱️ Slide Timing: 1 min - Welcome and frame the session: one tool to replace the whole Python packaging toolchain we've been using - Promise: by the end, everyone will have created a project, added a dependency, and run code with uv - Bridge: start with the pain of juggling separate tools, since that's exactly what uv removes
⏱️ Slide Timing: 3 min - Ask: how many separate commands did the venv session need just to get a project running? - `python -m venv`, `activate`, `pip install`, `pip freeze` — and that's before even touching Python versions - Frame it as accumulated tooling debt — each tool solves one problem but they don't talk to each other well - Bridge: show what replacing all of it with one tool looks like ❓ Ask: "How many different commands did we need last time just to set up one project?"
⏱️ Slide Timing: 5 min - Left panel: four separate tools, each with its own install method, config file, and quirks - A version mismatch between any two of them is a common source of "works on my machine" - Right panel: `uv` is a single Rust binary that does all four jobs - Same author (Astral) also makes `ruff`, the fast linter — same design philosophy: replace slow Python tooling with Rust - The 10-100x speed claim is real and reproducible — worth demonstrating live if time allows
⏱️ Slide Timing: 3 min - Key framing: uv isn't a new concept, it's a faster, unified implementation of tools students already know - `uv.lock` replaces `pip freeze > requirements.txt` — but it's generated and updated automatically, not by hand - Bridge: show the day-to-day command flow before the demo
⏱️ Slide Timing: 3 min - Walk left to right: `uv init` scaffolds a new project with `pyproject.toml` and `uv.lock` already in place - `uv add <package>` updates both files in one step — no separate `pip install` + manual `requirements.txt` edit - `uv run` is the key habit change: it syncs the environment to match the lock file, then runs your code — no manual activate step
⏱️ Slide Timing: 2 min - Have students run the install command for their OS now, then confirm with `uv --version` - Mention `uv` can also install and manage Python itself — `uv python install 3.12` — no separate pyenv needed
⏱️ Slide Timing: 4 min - Live-type this in the terminal rather than just showing the slide - Point out: no `python -m venv`, no `source .venv/bin/activate` — `uv run` handles environment sync automatically - Open `pyproject.toml` and `uv.lock` after step 2 to show what changed
⏱️ Slide Timing: 4 min - `uv sync` is the equivalent of `pip install -r requirements.txt`, but reads the exact locked versions from `uv.lock` - Emphasize `uv run` as the default way to execute anything in the project — replaces manual activation entirely - `--dev` dependencies (like test tools) are excluded from a production install by default
⏱️ Slide Timing: 3 min - This is the slide students will screenshot — it maps every old habit onto its uv equivalent directly - Emphasize the two "not needed" rows — those are entire steps that simply disappear from the workflow
⏱️ Slide Timing: 3 min - The "forgetting uv run" pitfall is the most common one in practice — reinforce it as the new default reflex - Tie back to the venv session: `.gitignore` should exclude `.venv/`, same as before — `uv.lock` is what gets committed instead of `requirements.txt`
⏱️ Slide Timing: 2 min - Suggest students screenshot this slide — it's the reference they'll reach for in every future project
⏱️ Slide Timing: 1 min - Highest priority to bookmark: the official docs — command reference and migration guides live there
⏱️ Slide Timing: 2 min - Close the loop back to the opening problem: one tool instead of four, with automatic lock-file management - Practice prompt: have students convert their current venv-based project to uv right now, before leaving class