{
  "schemaVersion": 1,
  "name": "Rust Course",
  "url": "https://rust.robertdevore.com/course/",
  "license": "MIT",
  "technicalBaseline": {
    "rust": "1.98.1",
    "edition": "2024",
    "verified": "2026-09-06"
  },
  "lessons": [
    {
      "id": "01-start",
      "title": "Set up Rust",
      "description": "Install Rust, find your way around a Cargo project, and run your first example.",
      "url": "https://rust.robertdevore.com/course/01-start/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/01-start.md",
      "sha256": "5f58f22862a172c2c8b3fcaacf2d7520f9158b0b09d36fa4b34866e6178998de",
      "stage": 1,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/01_setup.rs"
    },
    {
      "id": "02-values",
      "title": "Values, functions, and control flow",
      "description": "Write functions, choose between cases, and handle numbers that reach their limits.",
      "url": "https://rust.robertdevore.com/course/02-values/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/02-values.md",
      "sha256": "ec8dbabe687aa7111a8e159385d7157c2396dbf1f6b95123c64f97b5decbd367",
      "stage": 1,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/02_values.rs"
    },
    {
      "id": "03-ownership",
      "title": "Ownership, places, and moves",
      "description": "Learn what moves, what gets copied, and when a borrow is enough.",
      "url": "https://rust.robertdevore.com/course/03-ownership/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/03-ownership.md",
      "sha256": "0028c857d1343bc4dc028abd3f7348d8398e48fd244a3bf10a108383cdb279c2",
      "stage": 1,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/03_ownership.rs"
    },
    {
      "id": "04-borrowing",
      "title": "Borrowing and reborrowing",
      "description": "Use shared and exclusive references, and see when a borrow ends.",
      "url": "https://rust.robertdevore.com/course/04-borrowing/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/04-borrowing.md",
      "sha256": "bcecb1b037cb04d5c74db83ce10e182a75d02cec46904192b71ad0f5bef560ee",
      "stage": 1,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/04_borrowing.rs"
    },
    {
      "id": "05-text",
      "title": "Strings, slices, and collections",
      "description": "Work with UTF-8 text and choose when collections should own or borrow data.",
      "url": "https://rust.robertdevore.com/course/05-text/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/05-text.md",
      "sha256": "ca220396714969c38b078c73ca8a307cc916149de99dd46587ae054cc5799903",
      "stage": 1,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/05_text.rs"
    },
    {
      "id": "06-model",
      "title": "Structs, enums, and program states",
      "description": "Represent your data with structs and enums, and reject invalid states.",
      "url": "https://rust.robertdevore.com/course/06-model/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/06-model.md",
      "sha256": "47e37b53c7c61290187313abdc6b213d6c15bf1a8a5886d0c7bdcbaba3f9fd23",
      "stage": 1,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/06_model.rs"
    },
    {
      "id": "07-errors",
      "title": "Errors as part of the interface",
      "description": "Use Option, Result, and useful error messages to handle different kinds of failure.",
      "url": "https://rust.robertdevore.com/course/07-errors/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/07-errors.md",
      "sha256": "3cb25f8397dba7bab41bcd768200f7d66304ad73d81143c6afb1051df55460db",
      "stage": 1,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/07_errors.rs"
    },
    {
      "id": "08-first-build",
      "title": "Stage build: the first event counter",
      "description": "Build a working event counter with loops, matching, and borrowed text.",
      "url": "https://rust.robertdevore.com/course/08-first-build/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/08-first-build.md",
      "sha256": "e877d657d745e7b6877ad032a22d114791a4fdca2dca418e6f752392e29ff34c",
      "stage": 1,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/08_stage_one.rs"
    },
    {
      "id": "09-lifetimes",
      "title": "Lifetimes describe relationships",
      "description": "Connect borrowed results to their inputs without trying to extend the life of data.",
      "url": "https://rust.robertdevore.com/course/09-lifetimes/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/09-lifetimes.md",
      "sha256": "215c07598677205e2aa0b02d923a39f93d68804cb8efc347db1132982506a38e",
      "stage": 2,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/09_lifetimes.rs"
    },
    {
      "id": "10-traits",
      "title": "Traits and reusable interfaces",
      "description": "Use standard traits, associated types, and static or dynamic dispatch.",
      "url": "https://rust.robertdevore.com/course/10-traits/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/10-traits.md",
      "sha256": "b31de87f96edebf02657b02d902333388de9190c2d3611c39253cdb96b1b8b1a",
      "stage": 2,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/10_traits.rs"
    },
    {
      "id": "11-iterators",
      "title": "Iterators and closures",
      "description": "Follow iterator items, closure captures, and errors through your code.",
      "url": "https://rust.robertdevore.com/course/11-iterators/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/11-iterators.md",
      "sha256": "6f750956ac3fd590e5fe4c91c042515e73eab2e60aecfb65cae6b856c02f956b",
      "stage": 2,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/11_iterators.rs"
    },
    {
      "id": "12-reader",
      "title": "Stage build: a bounded streaming library",
      "description": "Build a library that parses records as it reads them and limits buffer growth.",
      "url": "https://rust.robertdevore.com/course/12-reader/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/12-reader.md",
      "sha256": "3e65ceb89ac8f161080ebb318a07e25bec19180f3c5c0a04504ae9682a4b5d20",
      "stage": 2,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/12_stage_two.rs"
    },
    {
      "id": "13-cargo",
      "title": "Cargo, modules, and dependency boundaries",
      "description": "Understand packages, modules, features, and the dependencies your program builds.",
      "url": "https://rust.robertdevore.com/course/13-cargo/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/13-cargo.md",
      "sha256": "899016f21a3940f8031c9b249f7750bfd4afe209a1d31c8febe79ae92fbafbf1",
      "stage": 2,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/13_cargo.rs"
    },
    {
      "id": "14-testing",
      "title": "Tests, compiler errors, and verification tools",
      "description": "Test expected behavior and failures, then use compiler checks and Clippy to catch more mistakes.",
      "url": "https://rust.robertdevore.com/course/14-testing/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/14-testing.md",
      "sha256": "397e81cedf5861e12345422077153b823063e5350a3be18d716fdb29eddb97e4",
      "stage": 2,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/14_testing.rs"
    },
    {
      "id": "15-interior",
      "title": "Interior mutability and shared ownership",
      "description": "Choose between reference counting, runtime borrow checks, and locks.",
      "url": "https://rust.robertdevore.com/course/15-interior/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/15-interior.md",
      "sha256": "0b2760980e7482534d3d671acbfb87b796978e6db77ef411e7dcdb0191e5dc44",
      "stage": 3,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/15_interior.rs"
    },
    {
      "id": "16-threads",
      "title": "Threads, Send, and Sync",
      "description": "Move or borrow data across threads, then handle completion and failure.",
      "url": "https://rust.robertdevore.com/course/16-threads/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/16-threads.md",
      "sha256": "0bad1a7255e0c4373baee8a8f199aec73dc7809709eeab486f17c253bc01694c",
      "stage": 3,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/16_threads.rs"
    },
    {
      "id": "17-synchronization",
      "title": "Channels, locks, and shutdown",
      "description": "Pass work through channels, protect shared data, and shut down without deadlocks.",
      "url": "https://rust.robertdevore.com/course/17-synchronization/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/17-synchronization.md",
      "sha256": "81e14bce5d58eea0d4a1def533196ddf32cbea9f95deed058a987f2f901e1e90",
      "stage": 3,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/17_sync.rs"
    },
    {
      "id": "18-atomics",
      "title": "Atomics and memory ordering",
      "description": "Use atomic counters and understand why sharing other data needs more than a flag.",
      "url": "https://rust.robertdevore.com/course/18-atomics/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/18-atomics.md",
      "sha256": "5754507ef05b8d4087bd03d478a466213b0290d2c71541e33911d0e8923341b3",
      "stage": 3,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/18_atomics.rs"
    },
    {
      "id": "19-futures",
      "title": "Futures before runtimes",
      "description": "Learn how polling and wakeups work before adding an async runtime.",
      "url": "https://rust.robertdevore.com/course/19-futures/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/19-futures.md",
      "sha256": "b7bcbc4f45238582eab195af99b28b867d42a230effd75758490e3789ac61c8f",
      "stage": 3,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/19_futures.rs"
    },
    {
      "id": "20-async",
      "title": "Tokio tasks, blocking, and cancellation",
      "description": "Run Tokio tasks, limit queued work, and handle blocking calls and cancellation.",
      "url": "https://rust.robertdevore.com/course/20-async/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/20-async.md",
      "sha256": "3b35ce15e170a0779bebd54684b73d5ecd971c45a12b4520e4bf9c55739002f0",
      "stage": 3,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/20_async.rs"
    },
    {
      "id": "21-pin",
      "title": "Pin and async traits",
      "description": "Learn what pinning protects and how to return futures through a trait object.",
      "url": "https://rust.robertdevore.com/course/21-pin/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/21-pin.md",
      "sha256": "25236d85788695a9c289cf151f6ae11bee5a311b92ea6012c60f340dd593f0cb",
      "stage": 4,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/21_pin.rs"
    },
    {
      "id": "22-async-build",
      "title": "Stage build: process records with async tasks",
      "description": "Send records through a bounded queue and keep one task in charge of the counts.",
      "url": "https://rust.robertdevore.com/course/22-async-build/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/22-async-build.md",
      "sha256": "f5b545967d02081551804f67dd3c94d243f2f8bb1179352d8a9ddbfcdb1489dc",
      "stage": 4,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/22_stage_three.rs"
    },
    {
      "id": "23-unsafe",
      "title": "Unsafe boundaries and soundness",
      "description": "Review a small unsafe function, explain its safety rules, and check it with Miri.",
      "url": "https://rust.robertdevore.com/course/23-unsafe/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/23-unsafe.md",
      "sha256": "660b24ee2e00aa540b0a29be534c99e9c5f54c3a633ef2a866cffbb83b023e67",
      "stage": 4,
      "example": null
    },
    {
      "id": "24-performance",
      "title": "Measure performance and resource use",
      "description": "Measure speed and memory use before changing how the program works.",
      "url": "https://rust.robertdevore.com/course/24-performance/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/24-performance.md",
      "sha256": "b76dc45d054e3f70c74fa47361c56f548f0f223d46b8d40d9048f99aa30c2047",
      "stage": 4,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/23_performance.rs"
    },
    {
      "id": "25-horizon",
      "title": "Stable Rust and work in progress",
      "description": "Tell stable features apart from nightly experiments and plans that may change.",
      "url": "https://rust.robertdevore.com/course/25-horizon/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/25-horizon.md",
      "sha256": "011be46d4ccab85715806d16487231c2d32b8be44c85502ea7f347f32cfdbc11",
      "stage": 4,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/24_const.rs"
    },
    {
      "id": "26-interop",
      "title": "FFI, serialization, and public contracts",
      "description": "Define ownership, data formats, and errors when calling code outside Rust.",
      "url": "https://rust.robertdevore.com/course/26-interop/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/26-interop.md",
      "sha256": "c16a84af662672c67342de80c7d8da54f6e4b5820e8ef5f9fe524ba3487ab070",
      "stage": 4,
      "example": null
    },
    {
      "id": "27-capstone",
      "title": "Capstone: ship Fieldnotes",
      "description": "Combine the parser and reader into a command-line tool you can install and use.",
      "url": "https://rust.robertdevore.com/course/27-capstone/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/27-capstone.md",
      "sha256": "2ab6256efc391b4085b622b208fb4d24da814123ec8417a0bc7dca8267276c90",
      "stage": 5,
      "example": null
    },
    {
      "id": "28-release",
      "title": "Release, maintain, and keep learning",
      "description": "Check compatibility, release a reproducible build, and keep the course up to date.",
      "url": "https://rust.robertdevore.com/course/28-release/",
      "markdownUrl": "https://rust.robertdevore.com/lessons/28-release.md",
      "sha256": "7a0f41103cebae68e3e4b28aa5e36f603d591416468381799b36cb1e28e960e6",
      "stage": 5,
      "example": "https://github.com/robertdevore/rust.robertdevore.com/blob/main/examples/13_cargo.rs"
    }
  ]
}
