React and Mantine
The standard UI library, with a component kit for behavior and Bones tokens for the look.
Why React
React has the biggest ecosystem and the most people who already know it. Every tool here supports it first-class — Vite, Next.js, Storybook, React Email, and Tauri.
Why Mantine
Mantine supplies accessible behavior — menus, tabs, switches, focus handling — as versioned npm packages. Its look is overridden with Bones tokens in shared-ui/src/theme.ts, so components read as Bones rather than Mantine.
shadcn/ui and Radix were the other candidates. shadcn copies components into your repo instead of installing them; Radix is unstyled and needs a separate styling approach. Mantine installs like any dependency and themes cleanly.
Where Mantine's defaults don't fit — text inputs, tables — shared-ui has its own components built straight on the tokens.
React Router
React Router handles routing in the two single-page apps. The web app uses BrowserRouter, so every page has a real URL you can share or bookmark. The desktop app uses HashRouter: a bundled Tauri app serves its files without a server to send every path back to index.html, so a real URL would fail on reload.
The blog, docs, and marketing site are Next.js and use its file-based routing instead.
Icons, fonts, and lists
- Tabler Icons supplies every icon, as React components.
- Instrument Sans and JetBrains Mono load from Google Fonts. The social cards load them from Fontsource instead, because the card renderer can't read the web font format.
- react-virtuoso renders the chatbot's message list, so a long conversation only draws the messages on screen.
shared-ui
shared-ui is the design-system package. It ships raw TypeScript and CSS with no build step, so Vite and Next.js compile it directly. Components move in when a second app needs them.