cohort_07 · enrolling now · 23 of 32 seats remaining starts jan_13_2026 12 weeks · live + recorded · weekly office hours $1,200 single · $1,800 with 1:1 mentorship cohort_07 · enrolling now starts jan_13_2026 12 weeks · live + recorded
curriculum / cohort_07

Twelve weeks.
Three artifacts.
Forty-eight lessons.

Every lesson is below — no marketing summary, no roadmap-shaped voids. If a topic isn't covered here, it isn't covered. We do not skip syntax review on the readme; we skip it because we do not teach it.

48lessons across 12 weeks
3shippable artifact projects
~120 hrtotal est. work · 10 hr/week
~6,000lines of Rust you'll write
phase_01 · weeks 01–04

Lifetimes, unsafe, async runtimes & pinning

The core "you thought you understood it" reset. By the end of week 04 you have built a working single-thread async executor with a real I/O reactor and shipped it as artifact_01.

// shipsartifact_01: kov · single-thread async runtime
phase_02 · weeks 05–08

Atomics, lock-free DS, loom & profiling

Concurrency without locks, correctness without anxiety. Loom catches the bugs your tests cannot. We close the phase with criterion benchmarks against crossbeam.

// shipsartifact_02: flume-lock · MPSC lock-free queue
phase_03 · weeks 09–12

no_std, embedded, macros, FFI & release

The world without an allocator. We write a HAL driver for the ESP32-C3, ship it to crates.io, and learn the release engineering nobody teaches.

// shipsartifact_03: esp-blink · no_std embedded HAL
w01// week onejan 13 → 19

Lifetimes, from first principles.

Variance, sub-typing, HRTB, '_ elision, and why 'static is rarely what you actually want. We deconstruct three real lifetime errors from the standard library's history and then refactor a real production crate to remove half its 'a annotations.

l_01

What lifetimes are not

The four most common misconceptions, and the model the borrow checker actually uses.

l_02

Variance & sub-typing

Co-, contra-, and invariance. Why &mut T is invariant and what that costs you.

l_03

Higher-ranked trait bounds

Reading and writing for<'a> Fn(&'a T), when you need it, when you don't.

l_04

'static reconsidered

What 'static actually is, when it leaks, and three patterns that avoid it entirely.

w02// week twojan 20 → 26

The unsafe Rust contract.

When unsafe is justified, when it isn't. UnsafeCell, NonNull, miri, the soundness rules nobody told you about, and the "interior mutability" patterns that make unsafe usually unnecessary. The lab is a real bug we find with miri and fix without unsafe at all.

l_05

What "soundness" actually means

The Stacked Borrows model in plain English, and how miri uses it.

l_06

The unsafe-fn contract

Reading and writing safety docs. The "what could go wrong" exercise.

l_07

UnsafeCell & interior mutability

The one primitive that makes RefCell, Mutex, and Atomic* all possible.

l_08

Miri lab — find the soundness bug

A real bug from a real crate, found by miri. We fix it three different ways.

w03// week threejan 27 → feb 02

Async runtimes — wakers & tasks.

Building Future by hand, the Waker contract, why poll returns Poll<T>, and the design choices baked into tokio, async-std, smol, and embassy. By the end of the week you start writing kov.

l_09

Future from scratch

Implementing Future by hand for three small types — Ready, Sleep, Channel.

l_10

The Waker contract

Cloning, RawWaker, vtables, and the "do not block in poll" rule.

l_11

Building an executor

Task queue, run-to-completion vs. work-stealing, single-thread first principles.

l_12

Building a reactor

Wiring mio epoll/kqueue into your executor — first kov code drop.

w04// week fourfeb 03 → 09

Pin, structural pinning, and self-referential structs.

When you need Pin<Box<T>>, when you don't, the pin-project macro internals, and writing a self-referential type by hand without unsafe-pinning footguns. We finish kov this week.

l_13

Why Pin exists

The motivating example: self-referential generators in async-await.

l_14

Structural vs. non-structural pinning

The three rules. Reading the pin-project-lite source.

l_15

Writing a self-ref struct

By hand, without macros, with safety docs. Then again with pin-project.

l_16

kov ships

Polish, README, doc tests, crate metadata. First crate live on crates.io.

w05// week fivefeb 10 → 16

Atomics & memory ordering.

Acquire, Release, AcqRel, SeqCst — when each one buys you what. Reading the C++11 memory model, cache lines, false sharing, and how to actually pick orderings without copy-pasting from Stack Overflow. Guest: Niko Matsakis on rustc's atomics work.

l_17

Memory orderings, demystified

The four orderings and what they cost on x86, ARM, and RISC-V.

l_18

Reading the C++11 model

The "happens-before" relation in plain English. The exercise: a producer/consumer.

l_19

Cache lines & false sharing

Padding, alignment, repr(align), CachePadded from crossbeam.

l_20

Guest · Niko Matsakis

The atomics lowering work in rustc and the next ten years of memory ordering.

w06// week sixfeb 17 → 23

Lock-free data structures.

CAS loops, the ABA problem, hazard pointers, epoch-based reclamation. We design the MPSC queue we'll ship in week 8. Paper-club Friday: Michael & Scott '96.

l_21

The CAS loop pattern

Compare-and-swap, retry loops, when they live-lock.

l_22

The ABA problem

Why naïve lock-free stacks break, and the four standard solutions.

l_23

Designing flume-lock

Architecture session — we white-board the queue we'll ship.

l_24

Paper club

Read Michael & Scott 1996 together, line by line. Implement the pseudocode.

w07// week sevenfeb 24 → mar 02

Loom & concurrent testing.

How loom permutes thread interleavings, how to set it up in your crate, how to interpret a failed loom test, mocking std::sync. The lab is debugging a real loom failure live.

l_25

How loom works

Permutation strategies, model checking, the cost-model.

l_26

Setting up loom

Cargo features, conditional imports, cfg(loom), the loom::sync shim.

l_27

Interpreting a failure

Reading loom's interleaving trace and turning it into a fix.

l_28

Live debug session

We deliberately break flume-lock and find the bug live with loom.

w08// week eightmar 03 → 09

Performance & profiling.

criterion, perf, flamegraph, samply. Reading assembly. When inlining matters. Cache-line awareness in real code. We ship flume-lock and benchmark it head-to-head against crossbeam.

l_29

criterion benchmarking

Sample size, warm-up, throughput vs. latency, and the report HTML.

l_30

Reading flamegraphs

perf, samply, the cargo-flamegraph harness, interpreting the inverted icicle.

l_31

Reading assembly

cargo-show-asm, when #[inline] changes things, when it doesn't.

l_32

flume-lock ships

v0.1.0 to crates.io. Bench against crossbeam. Documentation review.

w09// week ninemar 10 → 16

no_std & embedded.

Building without an allocator, panic handlers, target triples, the embedded-hal traits. We pick the ESP32-C3, ship dev boards to every cohort member, and start writing a real HAL driver.

l_33

What no_std actually means

The crate graph implications, panic handlers, no-allocator patterns.

l_34

Target triples & build flags

--target, build-std, the cortex-m vs. riscv32 split.

l_35

The embedded-hal trait family

Reading embedded-hal 1.0, the GPIO + UART + I²C trait stories.

l_36

esp-blink starts

Probe-rs setup, register-poking the UART, getting "hello world" out the wire.

w10// week tenmar 17 → 23

Macros & proc-macros.

macro_rules! deeply, then proc-macros, syn, quote, span hygiene. We write a small derive macro for our HAL — #[derive(Register)] — and then read part of the serde implementation.

l_37

macro_rules! end-to-end

Capture types, repetition, the order-of-evaluation rules, common foot-guns.

l_38

Proc-macros — the scaffolding

The three flavors. syn + quote + proc-macro2. Span hygiene.

l_39

Writing a derive macro

We write #[derive(Register)] for the HAL by the end of session.

l_40

Reading serde

The serde derive — the most-cited proc-macro in the ecosystem. We read it.

w11// week elevenmar 24 → 30

FFI, bindgen, and unsafe-at-the-boundary.

Calling C, being called by C, callbacks, lifetime stories at the FFI boundary, ABI compatibility, and the soundness debt that accumulates at the edge of your crate. Guest: Stjepan Glavina on async-std + FFI.

l_41

The C ABI in Rust

repr(C), repr(transparent), how struct layout actually works.

l_42

bindgen + cbindgen

Generating bindings both directions. The "what's safe to expose?" rules.

l_43

Callbacks & closures over FFI

Trampolines, leaking Box, the user-data idiom.

l_44

Guest · Stjepan Glavina

FFI lessons from async-std and smol.

w12// week twelvemar 31 → apr 03

Shipping a crate to crates.io.

Cargo metadata, semver, docs.rs config, CI matrices, MSRV, release engineering. We publish all 32 cohort artifacts. There is a real release party.

l_45

Cargo metadata, deeply

Every field in Cargo.toml that matters at publish time.

l_46

Semver in practice

The patch / minor / major rules, the cargo-semver-checks tool.

l_47

CI & MSRV

The matrix, MSRV pinning, GitHub Actions for Rust crates.

l_48

esp-blink ships · party

Live cohort-wide ship party. All 32 artifacts publish to crates.io. We celebrate.

prerequisites · who is this for

You should already have
shipped Rust.

This is not an introductory program. Six months of production Rust is the minimum, and most graduates have one to four years of Rust on the job. If you are new to Rust, finish the Book first, ship one project, then come back.

The application is one short form on the enroll page. There is no interview, but we will reject applicants who appear to be at the wrong level — a $1,200 refund six weeks in helps no one.

  • You are comfortable with Result, ?, and the question-mark operator.
  • You have written and shipped at least one non-trivial Rust project (open-source counts).
  • You can read impl Trait in argument and return positions without consulting the Rustonomicon.
  • You don't already understand the Pin safety contract — most graduates didn't either.
  • You haven't yet written your own proc-macro, async runtime, or no_std crate — that's why you're here.
format · how it runs

Live, recorded,
+ asynchronous friendly.

Two live sessions per week (Tuesday + Thursday, 5pm Pacific, ~75 minutes each), a Friday office-hours block, and full-cohort Slack. Every live session is recorded, captioned, and available within 12 hours.

Roughly half the cohort attends synchronously, half asynchronously. The artifacts are paced for synchronous, but the deadlines are soft — what matters is shipping by week 12.

  • ~10 hours/week total — 2.5 hr live + 2 hr office hours + 5 hr code & reading.
  • Cohort Slack stays open after graduation — alumni from cohort_01 still chat there.
  • Captioned recordings within 12 hours of every live session, hosted on the cohort site.
  • Hardware ships free — every enrollee gets an ESP32-C3 dev board mailed by week 08.
  • Sliding-scale tuition for students, open-source maintainers, and underrepresented groups.
stack · what you'll use

Tools we install day one.

cargo// 1.74+The build system, the test harness, the package manager. Always nightly-aware.
miri// nightlySoundness model checker. We run it in CI from week 02 onwards.
loom// 0.7+Concurrency permutation tester. We use it on artifact_02.
cargo-flamegraph// 0.6+Profiler harness. Linux + macOS supported.
criterion// 0.5+Statistical benchmark harness. The HTML reports are gorgeous.
cargo-show-asm// 0.2+For when you need to see what rustc actually emitted.
probe-rs// 0.24+Embedded debugger + flasher. Replaces openocd. Phase 03.
espflash// 3.xEspressif-specific flasher. Phase 03 only.
enrollment · cohort_07

Read the curriculum.
Now read it again.

If after two passes you still want in, the application is one short form and there is no interview. We promise a yes-or-no within 48 hours.

enroll cohort_07 — $1,200 try free lesson_01 →