Skip to content

NativeDesktop

Write React, ship real native widgets. GTK4 and libadwaita on Linux, AppKit on macOS. No DOM, no Electron.

Your app runs as two processes. A Bun/TypeScript child renders a React tree over a local protocol into a Zig host that owns real native widgets. No embedded browser, no DOM. The widgets your JSX describes are GtkBox, AdwHeaderBar, NSButton, NSSplitView, so one tree renders in Liquid Glass on macOS and Adwaita on GNOME without a lookalike layer in between.

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.

Built for coding agents

Every widget is inspectable and drivable over a JSON-RPC socket from the moment it mounts. getTree returns an accessibility tree with roles and live values; agents click, type, and wait on real widgets.

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.