Why Idealyst over React / React Native?React's reactive component model is genuinely a great idea, and Idealyst owes a lot of its authoring shape to it. Where this project goes a different direction is on what's running underneath that model on each platform.
No JavaScript runtime on mobileA React Native app ships a JavaScript engine alongside your code. Every render and every state update crosses the bridge between JS and the native UI thread. The shape works, but the cost shows up on cold-start time, on memory, and on touch-to-paint latency once your tree grows.An Idealyst mobile app is a native binary that drives UIKit / Android Views directly. There's no embedded interpreter to warm up, no bridge to marshal across, and the framework's reactive system mutates the platform's view nodes in-place rather than reconciling a virtual tree.
Real multithreadingJavaScript's concurrency model is single-threaded by design. The new architecture in React Native gives you better scheduling around that constraint, but background work that can't be punted to a native module still competes with the UI for the JS thread.Rust gives you Send + Sync as part of the type system. Heavy work — image decoding, parsing, ML inference, anything CPU-bound — moves onto a real thread with a compiler-checked guarantee that you didn't race the UI.
Comparable web performanceOn the web, Idealyst's fine-grained reactive updates land in the same performance neighborhood as React's optimized paths, and ahead of it on tight reactive workloads where a virtual-DOM diff is the bottleneck. Bundle sizes are higher than a hand-tuned JS app today; see the comparison with JS-only frameworks and the "when not to use" page for the honest trade-off.
One tree for web AND nativeReact Native and React (DOM) share a vocabulary but not a codebase — most teams maintain two parallel apps with shared logic. Idealyst's `app()` function is the same on web, iOS, Android, and macOS. The branching that normally happens at the component layer gets absorbed below the primitive layer instead.