Real native widgets
GTK4 with libadwaita on Linux, AppKit on macOS. The same widget classes a native app would use, not a styled approximation of them.
A Bun/TypeScript child process renders a React tree over a local protocol (NDP) into a Zig host that
owns real native widgets. There is no embedded browser and no DOM. The widgets your app renders
are GtkBox, AdwHeaderBar, NSButton, NSSplitView. One React tree adopts both platforms’
current design languages, Liquid Glass on macOS and Adwaita on GNOME, because nothing stands between
your JSX and the platform’s own toolkit. react is a peerDependency of the renderer, so a
NativeDesktop app can live in a monorepo beside a web or React Native app and share a hooks and
logic package with them. See Monorepo & Code Sharing.
Real native widgets
GTK4 with libadwaita on Linux, AppKit on macOS. The same widget classes a native app would use, not a styled approximation of them.
Automation-first
Every widget is inspectable and drivable over a JSON-RPC socket from the moment it mounts. Coding agents are a first-class consumer here, not an afterthought.
Theme-neutral styling
style is geometry (padding, layout), cssClasses reaches named design-language classes.
Dark mode follows the system automatically on both platforms.
React 19, for real
Hooks, Suspense, transitions, and hot reload, driving native widget trees instead of a DOM.
Share code, not UI
react is a peer dependency, so a shared hooks/logic package resolves to one instance across
a NativeDesktop app, a web app, and React Native in the same monorepo.