Our mission
Modern applications often need to run in two worlds: the browser for accessibility and reach, and the desktop for performance and native OS integration. Maintaining two separate codebases for the same product is expensive, error-prone, and slow.
Syne UI exists to eliminate that split. Every component ships with two entry points — a index for React DOM (web) and a synegui for NodeGui (desktop) — so your team writes the logic once and deploys to both targets.
The stack
React 18
Component model
The declarative UI engine for web targets. Concurrent features, hooks, and the full React ecosystem.
Tailwind CSS
Styling (web)
Utility-first CSS with a scoped tw- prefix. No stylesheet conflicts, no global side effects.
NodeGui
Desktop runtime
A Qt-based native desktop runtime for Node.js. Real OS widgets, real performance, no Chromium overhead.
TypeScript
Type safety
Every prop, variant, and event is typed. Catch mismatches at compile time across both targets.
Vite
Build tooling
Sub-second HMR for development, tree-shaken ESM bundles for production.
Bun
Runtime and package management
A workspace monorepo where every component is an independent package — import only what ships.
Design philosophy
Platform-aware, not platform-agnostic
Syne UI doesn't pretend both targets are the same. The web entry uses React DOM semantics; the desktop entry uses NodeGui's imperative widget API. We meet each platform on its own terms.
Per-package isolation
Each component lives in its own Bun workspace package with its own version, build, and test cycle. You can adopt a single component without pulling in the whole library.
Zero surprise defaults
Styles are scoped, props are explicit, and nothing reaches into global state. Syne UI should be easy to drop into an existing project without breaking anything.
Developer experience first
Live previews, generated code snippets, a props explorer, and a component search are built into the docs so you spend less time reading and more time building.
Want to explore the components?
