# Entry points

How @kitr/* packages wrap upstream libraries, and the rules behind them.

Apps import each package by its own name: `@kitr/query`, `@kitr/router/routes`, `@kitr/theme/styles.css`. The `@kitr/kitr` package is the CLI plus the `kitrrc.ts` config (`@kitr/kitr/app`, `@kitr/kitr/env`, both from `@kitr/core`).

## The rules

1. **Re-export, never re-implement.** `@kitr/router` does `export * from '@tanstack/react-router'`. Every upstream name is available unchanged. If a TanStack doc page says `import { Link } from '@tanstack/react-router'`, `import { Link } from '@kitr/router'` is the same thing.
2. **Add beside, never change.** kitr's additions are new names (`createKitrRouter`, `queryFrom`, `useUrlTableState`). The one exception is `@kitr/forms`, which exports its own `Form` and re-exports React Hook Form's as `RhfForm`.
3. **Providers are subpaths.** `@kitr/query/provider`, `@kitr/http/provider`, `@kitr/theme/provider`, `@kitr/auth/provider` export a provider as `default`, so `kitrrc.ts` can lazy-import them.
4. **Server entries never import React.** `@kitr/server`, `@kitr/api`, `@kitr/logger`, `@kitr/realtime/server`, `@kitr/realtime/socket.io/server`, `@kitr/realtime/sse/server`, `@kitr/auth/server`, `@kitr/db` and `@kitr/testing` are safe in a Node-only project. `@kitr/testing/react` is where `renderWithKitr` lives.
5. **Platforms are packages.** `@kitr/web`, `@kitr/server`, `@kitr/desktop`, `@kitr/tauri` and `@kitr/mobile` each export a factory built with `definePlatform` from `@kitr/core`.
6. **You import what you installed.** `kitr add <name>` puts `@kitr/<name>` in `package.json`, and code imports it under that same name. A package that is not installed is a plain `Cannot find module '@kitr/<name>'` in the editor, in `tsc` and in the build.

## Route-table extensions are subpaths

`@kitr/router/routes`, `@kitr/api/routes` and `@kitr/realtime/routes` each export one extension as `default`, for the list in `defineRoutes([...])`. Import `@kitr/api/routes` in `server/routes.ts` and `@kitr/router/routes` in `app/routes.ts`. A package that adds route methods ships them this way and names the module in its `routes` field, so `kitr add` can keep the list current.

## Reading the map

| Entry | React |
| --- | --- |
| `kitr`, `@kitr/kitr/app` (from `@kitr/core`) | no |
| `@kitr/kitr/env` (from `@kitr/core`) | no |
| `@kitr/react` | yes |
| `@kitr/router`, `@kitr/router/stack` | yes |
| `@kitr/query`, `@kitr/query/provider` | yes |
| `@kitr/http`, `@kitr/http/provider` | no (provider is framework-neutral) |
| `@kitr/forms` | yes |
| `@kitr/table` | yes |
| `@kitr/animation`, `@kitr/animation/provider`, `@kitr/animation/page-transitions.css` | yes |
| `@kitr/3d`, `@kitr/3d/drei` | yes |
| `@kitr/state` | yes |
| `@kitr/tailwind`, `@kitr/tailwind/vite`, `@kitr/tailwind/preset.css` | no |
| `@kitr/theme`, `@kitr/theme/provider`, `@kitr/theme/styles.css` | yes |
| `@kitr/theme/server` | no |
| `@kitr/logger` | no |
| `@kitr/server`, `@kitr/server/platform` | no |
| `@kitr/api`, `@kitr/api/client` | no |
| `@kitr/actions` | yes (TanStack Start) |
| `@kitr/seo` | no |
| `@kitr/realtime`, `@kitr/realtime/client`, `@kitr/realtime/socket.io`, `@kitr/realtime/sse` | no |
| `@kitr/realtime/server`, `@kitr/realtime/socket.io/server`, `@kitr/realtime/sse/server` | no |
| `@kitr/realtime/react` | yes |
| `@kitr/auth`, `@kitr/auth/provider` | hooks need React; `createAuth` does not |
| `@kitr/auth/server` | no |
| `@kitr/db` | no |
| `@kitr/testing` | no |
| `@kitr/testing/react` | yes |
| `@kitr/mocks` | no |
| `@kitr/i18n`, `@kitr/i18n/provider` | yes |
| `@kitr/analytics`, `@kitr/analytics/provider` | no |
| `@kitr/analytics/react` | yes |
| `@kitr/monitoring`, `@kitr/monitoring/provider`, `@kitr/monitoring/server` | no |
| `@kitr/platform`, `@kitr/platform/provider` | no |
| `@kitr/platform/react`, `@kitr/platform/devtools` | yes |
| `@kitr/offline`, `@kitr/offline/provider` | no |
| `@kitr/offline/react` | yes |
| `@kitr/flags`, `@kitr/flags/provider`, `@kitr/flags/server` | no |
| `@kitr/flags/react` | yes |
| `@kitr/consent`, `@kitr/consent/provider` | no |
| `@kitr/consent/react` | yes |
| `@kitr/secure-storage`, `@kitr/secure-storage/provider` | no |
| `@kitr/secure-storage/react` | yes |
| `@kitr/files`, `@kitr/files/provider` | no |
| `@kitr/files/react` | yes |
| `@kitr/notifications`, `@kitr/notifications/provider` | no |
| `@kitr/notifications/react` | yes |
| `@kitr/native`, `@kitr/native/provider` | no |
| `@kitr/native/react` | yes |
| `@kitr/updater`, `@kitr/updater/provider` | no |
| `@kitr/updater/react` | yes |
| `@kitr/cache`, `@kitr/cache/provider` | no |
| `@kitr/shield`, `@kitr/shield/provider` | no |
| `@kitr/mail`, `@kitr/mail/provider` | templates are React elements; sending needs react-dom/server |
| `@kitr/jobs`, `@kitr/jobs/provider` | no |
| `@kitr/uploads`, `@kitr/uploads/server`, `@kitr/uploads/provider` | no |
| `@kitr/uploads/react` | yes |
| `@kitr/storage`, `@kitr/storage/provider`, `@kitr/storage/server` | no |
| `@kitr/storage/react` | yes |
| `@kitr/devtools`, `@kitr/devtools/provider` | no (`@kitr/devtools/ui` is React) |
| `@kitr/web`, `@kitr/web/vite` | no (CLI and build time) |
| `@kitr/web/client`, `@kitr/web/provider` | hooks need React |
| `@kitr/desktop`, `@kitr/desktop/main`, `@kitr/desktop/preload` | no |
| `@kitr/desktop/client`, `@kitr/desktop/provider` | no |
| `@kitr/tauri` | no (CLI) |
| `@kitr/tauri/client`, `@kitr/tauri/provider` | `useTauriEvent` needs React |
| `@kitr/mobile` | no (CLI) |
| `@kitr/mobile/client`, `@kitr/mobile/provider` | no |
| `@kitr/vite` | no (build time) |
