What's gotten dramatically better
Two years ago we started a small experiment: take a project that would normally have shipped in C++ and write it in Rust. Today we've shipped three products on the ESP32 family in Rust and the tooling has gone from "exciting" to "stable."
What's still rough
Toolchain installation is mostly fine, but you'll hit edge cases on Windows. Some IDF features still trail the C/C++ APIs. And the async runtime story is converging but not boring yet.
Patterns that held up
- Static allocation everywhere. We don't dynamically allocate on the device after init.
- Type-state for hardware peripherals. Catches whole categories of "you forgot to init" bugs at compile time.
- A common HAL crate across products. Move device-specific code to the bottom of the stack.
We won't be going back.

