“One attribute. That’s it. The runtime handles serialization, hydration, and cleanup.”
The big wins: [PersistentState] replaces 25+ lines of manual serialization boilerplate with a single decorator. Blazor Server can pause and resume circuits, preserving form data across WebSocket drops. The blazor.web.js payload dropped 76% (183KB to 43KB). WebAssembly hot reload is now on by default. Form validation uses compile-time source generation instead of runtime reflection, making it AOT-compatible. These are the quality-of-life improvements that make Blazor feel production-ready.