How the Kaneo Frontend Is Built: Complete Tech Stack and Build Pipeline Explained
The Kaneo frontend is a modern React application built with Vite, bundled through apps/web/vite.config.ts, and powered by TanStack Router, Tailwind CSS, and a curated set of UI primitives from Radix UI and Base UI.
This article breaks down the complete architecture of the Kaneo frontend, a project management tool built as part of the usekaneo/kaneo monorepo. Whether you're exploring the codebase for contributions or researching modern React stack decisions, you'll find detailed coverage of the build pipeline, routing system, state management, and every major library in use.
Project Structure and Build Tooling
The Kaneo frontend lives in the apps/web workspace and uses Vite as its build tool and development server. This choice delivers fast cold starts, instant hot-module replacement, and optimized production bundles.
Vite Configuration
The build pipeline is defined in apps/web/vite.config.ts. This file configures plugins for routing, Tailwind CSS, React with the new React Compiler preset, Babel transformations, and optional Sentry error tracking.
// vite.config.ts - key plugins excerpt
plugins: [
tanstackRouter({ target: 'react', autoCodeSplitting: true }),
tailwindcss(),
react({ babel: { plugins: [['babel-plugin-react-compiler', {}]] } }),
sentryVitePlugin({ /* conditional on env vars */ }),
]
TypeScript compilation is controlled by tsconfig.app.json, targeting ES2022 with "moduleResolution": "bundler" for optimal Vite compatibility.
Development and Production Scripts
| Command | Script | Purpose |
|---|---|---|
pnpm dev |
vite |
Starts dev server on port 5173 with HMR |
pnpm build |
vite build |
Creates production bundle with hidden source maps in dist/ |
Hidden source maps allow Sentry to symbolicate stack traces without exposing mappings to end users.
Routing with TanStack Router
Kaneo uses TanStack Router for type-safe, file-based routing. The @tanstack/router-plugin/vite plugin in vite.config.ts enables automatic code splitting and route generation.
Routes are parsed from the filesystem and generated into routeTree.gen.ts at build time. The entry point in apps/web/src/main.tsx creates the router instance:
import { createRouter } from '@tanstack/react-router';
import { routeTree } from './routeTree.gen';
const router = createRouter({
routeTree,
defaultPreload: 'intent',
defaultPreloadStaleTime: 0,
context: { user: null, queryClient },
});
The router is rendered through <RouterProvider> nested within the application's provider tree.
State Management and Data Fetching
Kaneo employs a layered approach to state management:
@tanstack/react-query– Primary data fetching and server state caching, wrapped inQueryClientProviderzustand– Lightweight client state for global UI statenanostores– Micro-stores for atomic, cross-component state
The provider hierarchy in apps/web/src/main.tsx establishes this architecture:
root.render(
<StrictMode>
<ErrorBoundary fallback={RootCrashFallback}>
<QueryClientProvider client={queryClient}>
<ThemeProvider>
<AuthProvider>
<AppI18nProvider>
<KeyboardShortcutsProvider>
<App />
<KeyboardShortcutsHelp />
</KeyboardShortcutsProvider>
</AppI18nProvider>
</AuthProvider>
</ThemeProvider>
</QueryClientProvider>
</ErrorBoundary>
</StrictMode>,
);
Styling System: Tailwind CSS
All UI components use Tailwind CSS via the @tailwindcss/vite plugin. The styling pipeline includes:
- Tailwind utility classes – Base styling approach throughout components
tailwind-merge– Deduplication of conflicting class namesclsx– Conditional class compositionclass-variance-authority– Type-safe variant-based component styling
Global styles are imported in apps/web/src/index.css, which includes Tailwind directives and custom design tokens.
Component Library Architecture
Kaneo builds its interface on a foundation of unstyled, accessible primitives:
Core Primitives
- Radix UI (
@radix-ui/react-*) – Low-level, accessible components for dialogs, dropdowns, tooltips, and more - Base UI (
@base-ui/react) – Additional headless UI primitives
Visual Enhancements
lucide-react– Consistent iconographyframer-motion– Declarative animations and transitionstippy.js– Lightweight, customizable tooltips
Example usage of a Radix UI tooltip:
import { Tooltip, TooltipTrigger, TooltipContent } from '@radix-ui/react-tooltip';
<Tooltip>
<TooltipTrigger asChild>
<button>Hover me</button>
</TooltipTrigger>
<TooltipContent>Tooltip text</TooltipContent>
</Tooltip>
Rich Text Editing with TipTap
The Kaneo editor integrates TipTap (@tiptap/*) for extensible rich text editing. Supporting libraries include:
lowlight– Syntax highlighting for code blocksshiki– Modern, themeable code rendering
This combination provides a polished writing experience with code support for project documentation and task descriptions.
Internationalization
Multi-language support is implemented through i18next and react-i18next, with translation resources loaded via i18next-resources-to-backend. The AppI18nProvider wraps the application to ensure locale contexts are available throughout the component tree.
Form Handling and Validation
Forms use react-hook-form for state management and zod (via @hookform/resolvers/zod) for schema validation. This pairing provides type-safe forms with robust error handling and minimal boilerplate.
Error Monitoring
Production error tracking is handled by Sentry, conditionally enabled when SENTRY_DSN and related environment variables are present. The <ErrorBoundary> component in apps/web/src/main.tsx captures React errors and forwards them to Sentry for aggregation and alerting.
Additional Utility Libraries
| Library | Purpose |
|---|---|
date-fns |
Date manipulation and formatting |
zustand |
Lightweight global state |
nanostores |
Atomic, framework-agnostic stores |
Key Configuration Files
| File | Purpose |
|---|---|
apps/web/package.json |
Dependencies and npm scripts |
apps/web/vite.config.ts |
Vite plugins and build settings |
apps/web/tsconfig.app.json |
TypeScript compiler options |
apps/web/src/main.tsx |
Application bootstrap and provider tree |
apps/web/src/index.css |
Tailwind imports and global styles |
apps/web/src/routeTree.gen.ts |
Auto-generated TanStack Router tree |
Summary
- The Kaneo frontend uses Vite in
apps/web/vite.config.tsfor development and production builds, with the React Compiler preset enabled - TanStack Router provides file-based, type-safe routing with automatic code splitting
- Data fetching relies on TanStack Query, client state on Zustand and nanostores
- Tailwind CSS with
tailwind-mergeandclass-variance-authoritypowers all styling - Radix UI and Base UI form the accessible component foundation, enhanced by Framer Motion and Lucide
- TipTap, i18next, react-hook-form, and Sentry round out the feature stack
Frequently Asked Questions
What build tool does Kaneo use for its frontend?
Kaneo uses Vite as its build tool and development server. The configuration lives in apps/web/vite.config.ts and includes plugins for React, Tailwind CSS, TanStack Router, and optional Sentry integration.
How does Kaneo handle routing in its React application?
Kaneo uses TanStack Router with file-based routing. The @tanstack/router-plugin/vite plugin auto-generates routes into routeTree.gen.ts, which is consumed by createRouter() in apps/web/src/main.tsx.
What UI component libraries does Kaneo use?
Kaneo builds on Radix UI and Base UI for accessible, unstyled primitives. Visual elements come from Lucide React for icons, Framer Motion for animations, and Tippy.js for tooltips. All components are styled with Tailwind CSS.
How is state managed in the Kaneo frontend?
Server state uses TanStack Query (@tanstack/react-query). Client state splits between Zustand for global stores and nanostores for atomic state. Forms use react-hook-form with Zod validation.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →