Your AI chatexplains Rust.rustcoach makes you write it.

A coach that remembers what you got wrong, runs your code against real tests, reviews it like a pull request and won’t hand you the answer. Built for developers coming from Python, JavaScript or Java; complete beginners are welcome too. $49 once.

Why not just ask an AI chatbot?

You can, and it will explain Rust well. rustcoach is built on Claude too. What a chat window can’t do is everything around the explanation.

An AI chatrustcoach
Doesn’t track what you got wrong three lessons ago.Keeps notes on you and re-tests what you got wrong last time before teaching anything new.
Reads your code. Nothing holds it to a test suite.Compiles it, runs the tests and runs clippy in a sandbox.
Writes the fix the moment you ask for it.Points you at the API and traces your code line by line. The fix stays yours.
Waits for you to know what to ask.Every module's chapters in order, and nothing is signed off until it sticks.
Won’t bring a topic back just before you forget it.Brings review cards back at 1, 3, 7, 14, 30 and 60 days.

A real session, not a mockup

Recorded in a real lesson: the tests pass, and the review still finds a needless return and a skipped instruction. Every screen is the app as it runs.

Plays from YouTube (youtube-nocookie.com) only when you click. More: the five steps · the small tools.

From reading Rust to writing it.Five steps, all with a coach beside you.

01

A lesson written for you, not a template

There is no lesson 7 that everyone gets. The coach reads its notes on you, re-tests what you got wrong last time, then teaches one idea with examples you can run, checking every few explanations that it landed.

Coach

Length in bytes of the first word, or None if there is none. You reached for indexing last time; try a combinator.

rust
fn first_word_len(text: &str) -> Option<usize> {
    text.split_whitespace().next().map(str::len)
}
run_tests
  • first_word
  • empty_string
  • leading_spaces
Review: no unwrap, one combinator chain. Signed off.3 passed
02

Ask the moment you are lost

Stop the lesson mid-sentence: “wait, why &str and not String?” The coach answers in the context of the code on screen, then picks up where you left off. No question is too small, and any topic you have covered is one click away.

Coach

So first_word takes a string and hands back a slice of it, without copying a single byte…

Wait, why &str and not String? I thought strings were String.

Coach

String owns its bytes; &str only borrows them. Taking &str means the function accepts a String (as &s) and a literal like "hi" alike, and never takes your string away from you.

Back to where we were: the slice we return points into the caller's string, so…

03

You write every line

Every lesson ends with an assignment you write yourself in the browser editor, and the tests decide when it is done. Stuck? Hints point at the API to reach for, and the trace steps through your function line by line. Never the answer.

src/lib.rs·17 lines Trace onHints on
7pub fn initials(name: &str) -> Option<String> { 8 let mut words = name.split_whitespace(); 9 let first = words.next()?; first ="ada"words =SplitWhitespace { … }name ="ada lovelace" 10 let last = words.last()?; 11 let a = first.chars().next()?; 12 let b = last.chars().next()?;
initialstest initials_ok · step 3 of 10Next
04

Reviewed like a pull request

Passing tests is where review starts. The coach reads the code you actually wrote and holds it to how Rust is written professionally: no stray unwrap, combinators over nested match, clippy clean, cargo fmt applied. You fix it until it is signed off.

Review · parse_pair

All three tests pass. Two things before I sign it off:

  1. line 11.unwrap() on the first character panics on an empty word. The function already returns Option: use ?.
  2. lines 9–14Two nested match on Option read as one step: first.zip(last).
  3. clippyneedless_return on line 15. The last expression is the return value.
Fix, run the tests, resubmit.Changes requested
05

Nothing is marked done until it sticks

Mastery rises with right answers and falls with wrong ones. Shaky topics come back as a redo, and review cards return at 1, 3, 7, 14, 30 and 60 days. The coach keeps notes on what stuck, so the next lesson starts from there.

Ownership and move semantics

Taught the single-owner model and moves on assignment. Answered all three check questions; needed one correction on Copy vs Drop.

Copy vs Clone

Derives Copy on his own types now. clone_from still untaught.

References and borrowing rules

Passed all 9 tests first try. Re-test that he picks &mut [T] when the length is unchanged.

Slices (&str, &[T])

Built around the ways people actually get stuck.

Small tools, each one for a moment where you would otherwise be on your own.

Quick check

Which line moves s instead of borrowing it?

Alet t = &s; Blet t = s; Clet n = s.len();
Right.

Assigning a String to a new binding moves it; &s and a method call only borrow.

Quick checks

Every few explanations the coach asks one question. Click, see why, and the lesson picks up from your answer.

Build failed Explain with the coach
  • E0382borrow of moved value: wordsline 9

    WHATLine 8 handed words to next() by value, so by line 9 there is nothing left to borrow.

    TRYLook at what an iterator's next takes: &mut self. The binding needs to allow that.

Compiler error coach

A failed build lists each rustc error and tints the line. One click explains, in plain English, what went wrong and what to try next. The fix stays yours.

src/lib.rs·21 lines3 clippy notes
14 let unused = 1; 15 if out.len() == 0 { return None; } 16 return Some(out); 17}
clippy · len_zero

length comparison to zero

  • using is_empty is clearer and more explicit

About len_zero

Clippy as an additional teacher

Every test run also runs clippy. Each lint is a broom in the gutter with the message, the help and a link, and the review teaches the idiom behind one.

Review3 of 8·Chapter 2 · Copy vs Clone

What does this print?

let a = String::from("hi");
let b = a.clone();
println!("{a} {b}");
Acompile error: a moved Bhi hi Chi then a panic
Right.

clone makes a second String, so both bindings are still usable.

Back in 7 days.Next

Review cards

When a lesson ends, the coach writes two cards per topic it signed off. They come back at 1, 3, 7, 14, 30 and 60 days. A miss brings one back tomorrow.

Stretch challenge

Accepted. Now make initials work without to_ascii_uppercase allocating twice: one String, built once.

StretchOptional.Skip it

Stretch challenges

Solution accepted? One optional refactor. Extra credit, never part of the sign-off.

src/lib.rsscratch.rs
1fn main() {2 let v = vec![3, 1, 2];3 println!("{:?}", v.iter().max());4}
RunRan
Some(3)

A scratch file

scratch.rs next to the assignment. cargo run in the same sandbox, nothing graded, saved between visits.

3let first = words.next()?;4let last = words.last()?;
Explain⌘⇧E
Coach

? on an Option returns None from the whole function, so these two lines are also the "fewer than two words" guard.

Explain this selection

Select code, press one shortcut, and the coach explains it in the lesson.

7days in a row
Chapter 2

Ownership and borrowing

Mastery 85%
Chapter 2 complete.

Streaks and mastery

A day counts when you chat, run tests or answer a card. Mastery rises with sign-offs and right answers, and falls with wrong ones.

Five modules. Start with any of them.

Core Rust takes you through the whole language. The four deep dives each go far further into one subject, and each starts with the foundations it needs, so you can begin with the one you care about. Progress, lessons and review cards are kept separately for every module.

    1. Where Rust starts to feel different: almost everything is an expression, and the compiler holds you to it. Bindings, mutability and shadowing, the primitive types, and every control-flow form, match included, before ownership enters the picture.

      1. 01Variables, mutability and shadowing
      2. 02Primitive types and literals
      3. 03Functions and expressions vs statements
      4. 04Control flow: if, loop, while, for, match basics
    2. The chapter that makes Rust Rust. Moves, Copy versus Clone, the borrowing rules the compiler enforces, and slices. The coach re-tests these until the borrow checker stops feeling like an opponent.

      1. 01Ownership and move semantics
      2. 02Copy vs Clone
      3. 03References and borrowing rules
      4. 04Slices (&str, &[T])
    3. How Rust wants you to model data: structs with methods, enums that make invalid states unrepresentable, and pattern matching the compiler checks for exhaustiveness. Option and Result appear here as ordinary enums, not magic.

      1. 01Structs and methods
      2. 02Enums and exhaustive pattern matching
      3. 03Option and Result basics
      4. 04Pattern syntax: destructuring, guards, bindings
    4. The three workhorse collections, Vec, String and HashMap, and the ownership questions each one raises. The String versus &str distinction in depth, and the entry API for maps.

      1. 01Vec and growable storage
      2. 02String vs &str in depth
      3. 03HashMap and entry API
    5. When to panic and when to return an error. You propagate failures with the ? operator, design custom error types, and use From so conversions happen for free. Zero unwraps, and the review checks.

      1. 01panic! vs recoverable errors
      2. 02The ? operator and error propagation
      3. 03Custom error types and From
    6. Code that is generic without being abstract for its own sake: trait bounds, where clauses, impl Trait, and what monomorphization means for the code the compiler actually emits. Ends with operator overloading through std::ops.

      1. 01Generics and monomorphization
      2. 02Traits, trait bounds, where clauses
      3. 03impl Trait and default methods
      4. 04Operator overloading via std::ops
    7. Lifetimes are Rust's most feared feature and mostly a notation problem. You learn what the annotations actually claim, when elision writes them for you, and what it takes for a struct to hold references.

      1. 01Lifetime annotations and elision
      2. 02Structs holding references
      3. 03'static and lifetime bounds
    8. Closures and the three capture modes behind Fn, FnMut and FnOnce, then the Iterator trait and its adapters. Why iterators are lazy, what collect really does, and when a for loop is still the right call.

      1. 01Closures and capture modes
      2. 02Fn / FnMut / FnOnce
      3. 03Iterator trait and adapters
      4. 04Laziness and collect
    9. What to reach for when plain ownership is not enough: Box, Rc and Arc for shared ownership, RefCell and Cell for interior mutability, plus Deref, Drop and Weak, and the runtime cost each one trades for flexibility.

      1. 01Box, Rc, Arc
      2. 02RefCell, Cell and interior mutability
      3. 03Deref, Drop, Weak
    10. How Rust code is organized in the large: modules and visibility, use paths, and crates, including workspaces and feature flags. The parts that only start to matter once projects grow.

      1. 01Modules, visibility and use
      2. 02Crates, workspaces and features
    11. Rust's three kinds of tests, unit, integration and doc tests, and where each belongs. A short chapter. The habit matters more than the API.

      1. 01Unit, integration and doc tests
    12. Fearless concurrency, backed by the type system: spawning threads, sharing state with Mutex, RwLock and atomics, passing messages over channels, and what Send and Sync actually promise.

      1. 01Threads and JoinHandle
      2. 02Mutex, RwLock, atomics
      3. 03Channels (mpsc)
      4. 04Send and Sync
    13. The trait system at full depth: trait objects and dynamic dispatch versus generics, associated types, higher-ranked trait bounds, and the newtype and typestate patterns that push invariants into types.

      1. 01Trait objects and dynamic dispatch
      2. 02Associated types and generic traits
      3. 03Higher-ranked trait bounds
      4. 04Newtype and typestate patterns
    14. What macro_rules! can do, how to read matcher syntax without fear, and a tour of procedural macros. Enough to understand what derive is doing on your behalf.

      1. 01Declarative macros (macro_rules!)
      2. 02Procedural macros overview
    15. The escape hatch and its rules: raw pointers, the invariants unsafe blocks promise to uphold, and calling C over FFI. Small, careful, and honest about what the compiler can no longer check.

      1. 01unsafe: raw pointers and invariants
      2. 02FFI and extern "C"
    16. Async from the ground up: what a Future is, what async/await desugars to, why Pin exists, and how Tokio schedules tasks. Spawn, select and the patterns real services use.

      1. 01async/await and Futures
      2. 02Pin and why it exists
      3. 03Tokio: tasks, spawn, select
    1. The Rust that async leans on: ownership, traits and generics, closures, smart pointers, and what Send and Sync promise. Fast if you know it, thorough if you don't.

      1. 01Ownership and move semantics
      2. 02References and borrowing rules
      3. 03Option and Result basics
      4. 04The ? operator and error propagation
      5. 05Generics and monomorphization
      6. 06Traits, trait bounds, where clauses
      7. 07impl Trait and default methods
      8. 08'static and lifetime bounds
      9. 09Closures and capture modes
      10. 10Fn / FnMut / FnOnce
      11. 11Box, Rc, Arc
      12. 12Mutex, RwLock, atomics
      13. 13Send and Sync
      14. 14Trait objects and dynamic dispatch
    2. What a Future is, how poll and wakers drive it, and what async fn compiles to. You write a future by hand and a tiny executor that runs it.

      1. 01The Future trait and Poll
      2. 02Waker and Context
      3. 03Writing a future by hand
      4. 04async fn as a state machine
      5. 05Building a minimal executor
    3. Why self-referential futures need Pin, what Unpin opts out of, and how to project pins safely when you write your own futures.

      1. 01Pin, Unpin and self-referential futures
      2. 02Pin projection
      3. 03Box::pin and dyn Future
    4. Runtime flavors, spawning tasks and the 'static + Send bounds they impose, blocking work, and running !Send futures on a LocalSet.

      1. 01current_thread vs multi_thread runtimes
      2. 02spawn, JoinHandle and the 'static + Send bounds
      3. 03spawn_blocking and blocking the runtime
      4. 04LocalSet and !Send futures
    5. join!, select! and JoinSet: running work concurrently, racing it, and what cancellation safety means when a branch loses.

      1. 01join! and try_join!
      2. 02select! and cancellation safety
      3. 03JoinSet and structured concurrency
      4. 04Timeouts and paused time
    6. When an async Mutex is right and when std's is, every Tokio channel and what it is for, and backpressure with semaphores.

      1. 01tokio Mutex vs std Mutex across .await
      2. 02mpsc and oneshot channels
      3. 03broadcast and watch channels
      4. 04Semaphore, Notify and backpressure
    7. Futures are cancelled by being dropped. Cancellation tokens, cleanup that still runs, and shutting a service down gracefully.

      1. 01Drop-based cancellation and CancellationToken
      2. 02Graceful shutdown
    8. Streams and their combinators, AsyncRead and AsyncWrite, framing a protocol with codecs, all tested over in-memory pipes.

      1. 01Stream and StreamExt
      2. 02AsyncRead, AsyncWrite and buffering
      3. 03Framing with tokio-util codecs
      4. 04In-memory duplex streams
    9. async fn in traits, where dyn stops working and why, and async closures.

      1. 01async fn in traits and dyn compatibility
      2. 02Async closures and AsyncFn
    10. Actors, bounded parallelism, retries with backoff and rate limiting: the shapes production async code keeps reaching for.

      1. 01The actor pattern
      2. 02Bounded parallelism with buffer_unordered
      3. 03Retry with backoff
      4. 04Rate limiting
    11. Deterministic tests with paused time, tracing spans that follow a request across tasks, and the classic async bugs.

      1. 01#[tokio::test] with deterministic time
      2. 02tracing in async code
      3. 03Async pitfalls: locks across await and Send errors
    12. An in-memory key-value server: protocol, framing, concurrent connections and graceful shutdown, built and tested over several lessons.

      1. 01Key-value server: protocol and framing
      2. 02Key-value server: connections, shutdown and tests
    1. The Rust macros generate and parse: enums and patterns, traits and generics, error types, iterators, modules and crates. Fast if you know it, thorough if you don't.

      1. 01Functions and expressions vs statements
      2. 02Enums and exhaustive pattern matching
      3. 03Pattern syntax: destructuring, guards, bindings
      4. 04Option and Result basics
      5. 05Custom error types and From
      6. 06Generics and monomorphization
      7. 07Traits, trait bounds, where clauses
      8. 08Associated types and generic traits
      9. 09Iterator trait and adapters
      10. 10Modules, visibility and use
      11. 11Crates, workspaces and features
      12. 12Unit, integration and doc tests
    2. How the compiler hands a macro its input as token trees, the fragment specifiers, repetitions, arm order and what hygiene does and does not protect.

      1. 01Token trees and macro parsing
      2. 02Fragment specifiers
      3. 03Repetitions and separators
      4. 04Multiple arms and matching order
      5. 05Hygiene and its limits
    3. Where a macro is visible, exporting it from a library, $crate, and reading the errors a macro produces.

      1. 01Textual vs path scope and #[macro_export]
      2. 02$crate and macros in libraries
      3. 03Debugging macros and compile_error!
    4. Internal rules, TT munchers, push-down accumulation and counting: the techniques behind serious macro_rules! DSLs.

      1. 01Internal rules
      2. 02TT munchers
      3. 03Push-down accumulation
      4. 04Counting and callbacks
      5. 05Building a DSL with macro_rules!
    5. TokenStream and proc_macro2, a proc-macro crate with a testable core, parsing with syn and generating code with quote.

      1. 01proc_macro vs proc_macro2
      2. 02Proc-macro crate setup with a testable core
      3. 03Parsing with syn: DeriveInput, Data, Fields
      4. 04Generating code with quote!
    6. Writing derives that handle generics, helper attributes, enums and structs, and point their errors at the right span.

      1. 01A first derive macro
      2. 02Generics and split_for_impl
      3. 03Helper attributes
      4. 04Deriving for enums vs structs
      5. 05Errors with spans
    7. Wrapping functions, rewriting impls and modules, and parsing attribute arguments.

      1. 01Attribute macros that wrap functions
      2. 02Attribute macros on impls and modules
      3. 03Parsing attribute arguments
    8. Custom syntax with syn's Parse trait: punctuated lists, lookahead, custom keywords, and a small DSL.

      1. 01Custom syntax with the Parse trait
      2. 02Punctuated, lookahead and custom keywords
      3. 03A function-like DSL
    9. Spans and hygiene, syn's visitors for rewriting code, generating code users can live with, and what macros cost at compile time.

      1. 01Spans and hygiene: call_site and mixed_site
      2. 02syn Visit and VisitMut
      3. 03Ergonomics of generated code
      4. 04Compile-time cost of macros
    10. Testing expansions as data, snapshot tests, and compile-fail tests for the errors your macro promises.

      1. 01Unit-testing expansions with proc_macro2
      2. 02Snapshot tests of expansions
      3. 03Compile-fail tests
    11. Reading a real derive's design, then building a derive Builder and an instrumenting attribute macro over several lessons.

      1. 01Reading a serde_derive-style design
      2. 02Capstone: derive Builder
      3. 03Capstone: an instrumenting attribute macro
    1. The Rust concurrency rests on: ownership and borrowing, closures, smart pointers and interior mutability, threads, and Send and Sync. Fast if you know it, thorough if you don't.

      1. 01Ownership and move semantics
      2. 02References and borrowing rules
      3. 03Closures and capture modes
      4. 04Fn / FnMut / FnOnce
      5. 05Box, Rc, Arc
      6. 06RefCell, Cell and interior mutability
      7. 07Traits, trait bounds, where clauses
      8. 08Generics and monomorphization
      9. 09Lifetime annotations and elision
      10. 10Threads and JoinHandle
      11. 11Send and Sync
      12. 12Iterator trait and adapters
    2. Scoped threads that borrow, thread builders and panics, thread-local storage, and parking.

      1. 01Scoped threads
      2. 02Thread builder and panics across threads
      3. 03Thread-local storage
      4. 04Parking and unpark
    3. Mutex and poisoning, RwLock and starvation, condition variables, one-time initialisation, and avoiding deadlock by design.

      1. 01Mutex and poisoning
      2. 02RwLock and writer starvation
      3. 03Condvar
      4. 04Barrier, OnceLock and LazyLock
      5. 05Deadlocks and lock ordering
    4. Bounded channels and backpressure, crossbeam's channels and select, and pipelines that fan out and back in.

      1. 01sync_channel and backpressure
      2. 02crossbeam channels and select
      3. 03Pipelines with fan-out and fan-in
    5. The atomic types, compare-and-swap loops, fetch_update, and counters that stay correct under contention.

      1. 01Atomic types and operations
      2. 02compare_exchange and CAS loops
      3. 03fetch_update
      4. 04Atomic counters and statistics
    6. Happens-before, Relaxed, Release and Acquire, SeqCst and fences: what each ordering guarantees and what it costs.

      1. 01Happens-before
      2. 02Relaxed ordering
      3. 03Release and Acquire
      4. 04SeqCst
      5. 05Fences
    7. A spin lock, a one-shot channel, Arc, Mutex, Condvar and RwLock, written from atomics up.

      1. 01A spin lock
      2. 02A one-shot channel
      3. 03Arc from scratch
      4. 04Mutex and Condvar on futex-style waiting
      5. 05RwLock from scratch
    8. A Treiber stack, the ABA problem, safe memory reclamation, and a single-producer ring buffer.

      1. 01Treiber stack
      2. 02The ABA problem
      3. 03Memory reclamation: epochs and hazard pointers
      4. 04SPSC ring buffer
    9. Exhaustively model-checking concurrent code with loom, and what stress tests can and cannot prove.

      1. 01Model checking with loom
      2. 02Stress testing concurrent code
    10. rayon's parallel iterators, join and scope, and how work stealing keeps every core busy.

      1. 01rayon par_iter
      2. 02rayon join and scope
      3. 03Work stealing
    11. False sharing, sharding to cut contention, and choosing the right primitive for the job.

      1. 01False sharing and cache padding
      2. 02Sharding to reduce contention
      3. 03Choosing a primitive
    12. A concurrent cache with eviction and a thread pool with graceful shutdown, built and verified over several lessons.

      1. 01Concurrent cache with eviction
      2. 02Thread pool with graceful shutdown
    1. The Rust this module builds on: structs and enums, generics and traits, lifetimes, closures, iterators and smart pointers. Fast if you know it, thorough if you don't.

      1. 01Structs and methods
      2. 02Enums and exhaustive pattern matching
      3. 03Generics and monomorphization
      4. 04Traits, trait bounds, where clauses
      5. 05impl Trait and default methods
      6. 06Lifetime annotations and elision
      7. 07Structs holding references
      8. 08'static and lifetime bounds
      9. 09Closures and capture modes
      10. 10Iterator trait and adapters
      11. 11Box, Rc, Arc
      12. 12Deref, Drop, Weak
    2. Coherence and the orphan rule, blanket impls, how method calls are resolved, supertraits and upcasting, and the auto traits.

      1. 01Coherence and the orphan rule
      2. 02Blanket impls
      3. 03Method resolution: autoref and autoderef
      4. 04Supertraits and trait upcasting
      5. 05Auto traits: Send, Sync, Unpin, Sized
    3. Which traits can be dyn and why, vtables and fat pointers, dynamically sized types, and downcasting with Any.

      1. 01dyn compatibility rules
      2. 02vtables and fat pointers
      3. 03DSTs and ?Sized
      4. 04Any and downcasting
    4. Associated types versus generic parameters, associated consts, generic associated types, and impl Trait in traits.

      1. 01Associated types vs generic parameters
      2. 02Associated consts
      3. 03Generic associated types
      4. 04impl Trait in traits
    5. Variance and subtyping, PhantomData and drop check, higher-ranked bounds, reborrowing, and where the borrow checker still says no.

      1. 01Variance and subtyping
      2. 02PhantomData and drop check
      3. 03HRTBs with closures
      4. 04Reborrowing and two-phase borrows
      5. 05Limits of NLL
    6. Const generics, const fn, zero-sized types, and typestate APIs that make invalid states fail to compile.

      1. 01Const generics
      2. 02const fn
      3. 03Zero-sized types
      4. 04Typestate APIs
    7. From and TryFrom, AsRef and Borrow, Cow, and when each one is the right signature.

      1. 01From, Into and TryFrom
      2. 02AsRef and Borrow
      3. 03Cow and ToOwned
    8. The full iterator family, indexing, consistent Eq, Ord and Hash, and Display, Debug and Error done properly.

      1. 01The iterator trait family
      2. 02Index and IndexMut
      3. 03Eq, Ord and Hash consistency
      4. 04Display, Debug and Error design
    9. Builders, sealed and extension traits, newtypes, visitors and library error types: the patterns behind crates people enjoy using.

      1. 01Builders
      2. 02Sealed traits
      3. 03Extension traits
      4. 04Newtype and the Deref anti-pattern
      5. 05Visitor and double dispatch
      6. 06Library error types
    10. Which changes to traits and types break your users, and how to evolve an API without a major version.

      1. 01Semver hazards in traits and types
    11. A typed state-machine API and a generic container with the full iterator suite, designed and built over several lessons.

      1. 01Typed state-machine API
      2. 02Generic container with the full iterator suite

Buy it like a book. Use it like a coach.

No subscription. You buy credits once and they never expire. A typical lesson uses about one credit; a long conversation or a redo uses a bit more, a quick one less. Nothing is ever cut short.

Free start
The Course
Top-up
Price
$0
$49once
$10or $25
Credits
1, no card needed
50, covers a typical learner through one full module
10 or 30 more, once you own the Course
Every module, every feature
Coach hints and line-by-line trace
Code review on every submit
Quick checks, review cards, streaks
Expires
never
never
never
Top up

What if I run out mid-lesson? A reply that starts with credit left always finishes. At zero, the coach pauses until you top up; nothing you did is lost. The Account page shows what is left.

$49 once — covers a typical learner through one full module. Add more modules with top-ups. Card payments via Stripe, plus VAT where it applies. Credits are non-refundable except where the law requires otherwise.

Terms and conditions apply.

Questions

Isn’t this just Claude?

The coach’s replies come from Claude, by Anthropic. Everything around them is rustcoach: a sandbox that compiles your code and runs real cargo test and clippy, five modules with a syllabus each with mastery per topic, notes on you that carry from lesson to lesson, spaced review cards, and a coach that won’t write your solution, even when you ask.

I’ve never programmed. Is this for me?

Yes. The coach teaches from what you already know, so with no background it starts further back and goes slower. The Course’s 50 credits are sized for people who already program a bit in another language, so a complete beginner may need a top-up along the way.

How long does the course take?

As long as it takes you: a chapter ends when the coach signs it off, not after a set number of hours. A typical lesson uses about one credit, and the Course’s 50 credits cover a typical learner through one full module if you already program a bit in another language.

Do I need Core Rust before a deep-dive module?

If you are new to Rust, start with Core Rust: it takes you through the whole language, in the order it is easiest to learn. If you already know some Rust and want to go deeper into one subject, go straight to that module. Each deep-dive module opens with a short Foundations chapter where the coach checks the Rust it builds on and fills any gaps, and topics you have already covered in Core Rust start ticked off.

Do I pay per module?

No. Credits are shared by every module on your account. The Course’s 50 credits cover a typical learner through one full module; top-ups pay for the next.

Can I use it from my IDE?

Not yet. Everything happens in the browser: an editor with hints, a line-by-line trace, clippy notes in the gutter and a scratch.rs for trying things out. Nothing to install.

What happens if I run out of credits mid-lesson?

A reply that starts with credit left always finishes. At zero, the coach pauses until you top up. Your lesson, code and progress stay exactly where they were.

Can I check my level before signing up?

Yes. The free Rust test takes about ten minutes, needs no account, and ends with your level, a shareable report, and the module that fits you best.

Krzysztof Grajek

Who builds rustcoach

Krzysztof Grajek

I’ve discovered Rust and have become an enthusiastic advocate for its ecosystem. I’m actively working to attract more developers and projects to Rust, sharing insights on its memory safety, concurrency model, and growing adoption in production environments.

Let’s connect if you’re passionate about functional programming, Rust, or building enterprise-grade solutions that make a difference!

Connect on LinkedIn
Free Rust skills test

How good is your Rust?Find out in ten minutes.

Check what you know across the whole language, or go deep on one part of it: async, macros, concurrency or the type system. You get your level, a breakdown by area, and the module to learn next.

Test one area
  • 30 questions
  • About 10 minutes
  • All 5 areas
  • No account needed
Sample report
76%Advanced
  • Rust basics90%
  • Async & Tokio80%
  • Macros80%
  • Concurrency40%
  • Types & traits60%
Recommended next: Concurrency & Atomics

Three steps. No sign-up in the way.

01

Answer one at a time

Real Rust: what a snippet prints, whether it compiles, why the borrow checker objects. Multiple choice, four options.

02

See why after each answer

Right or wrong, you get a short explanation before the next question, so the test teaches while it measures.

03

Get your report

Your level, a bar for every area, your strongest and weakest topics, the module to take next, and a link to share.

Or test one area. 20 questions each, about 7 minutes.

Each test draws from one rustcoach module. The deep dives start with a few questions on the foundations they build on, then go straight to the hard parts.

    Why the result means something.

    Checked by the compilerEvery code question was run through the real Rust compiler. The marked answer is what rustc actually does.
    Shuffled every timeAnswer options are shuffled for every test, so positions can’t be learned.
    Explained, not just markedEvery question comes with a short explanation of the right answer.
    Free, no accountTake it as often as you like. Save a result to an account later if you want to keep it.

    Questions

    Which test should I take?

    The general test if you’re not sure: it samples every area and recommends where to go next. Rust basics if you’re new to Rust. A deep-dive test if you already know which area you want to check.

    How is my level worked out?

    From your percentage: under 40% Beginner, 40–64% Intermediate, 65–84% Advanced, 85% and up Expert.

    Can I retake it?

    Yes. Each attempt draws a new random set of questions.

    What happens to my result?

    You get a report with its own link that you can share; it shows no name or email. If you sign up, you can save it to your account and, if you choose, let the coach use it to pick where your first lessons start.

    Ready? Thirty questions, about ten minutes.

    Sign in

    Continue with Google No account? Register · Forgot password?

    Create your account

    Continue with Google Already registered? Sign in

    Reset your password

    Back to sign in

    Choose a new password

    Back to sign in
    Assignment
    Tests (read-only)
    ·0 lines

    Run tests to see results here.

        Raw output

        Choose your module

        Each module is its own course with its own lessons and progress. Your credits work in all of them, and you can add or switch modules any time.

        History

        Keyboard shortcuts

        Do a topic again

        A new lesson on it, written from where you are now. The coach re-tests you first. The old lesson stays in your history.