Skip to content

NativeDesktop

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

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.