# Registry (/docs/registry)

> The roadmap of first-party modules Stanza ships — what's available today and what's planned.

Every module fills exactly one **category**. This page is the canonical roadmap of the first-party modules Stanza ships: what's available today, and what's on the way.

Inspired by [shadcn/ui](https://ui.shadcn.com), third parties can publish their own modules under any `@scope` and have users pull them in alongside these. See [Third-party registries](/docs/registry#third-party-registries) below, or the [Authoring manual](/docs/authoring) for the full implementation details.

## Categories [#categories]

A category has two independent properties: its **cardinality** — `one` (single-choice, like `framework` or `auth`) or `many` (coexisting, like `testing`) — and its **home**, where a module's output lands (`app`, `repo`, or `package`). See [Concepts](/docs/concepts#categories) for the full mental model.

| Category    | Cardinality | Home    | What it covers                                              |
| ----------- | ----------- | ------- | ----------------------------------------------------------- |
| `framework` | one         | app     | App shell + router (Next, TanStack Start, Expo, …)          |
| `api`       | one         | package | Typed RPC layer between framework and services              |
| `ai`        | one         | package | AI SDK + provider wiring                                    |
| `auth`      | one         | package | Authentication (Better Auth, Clerk, …)                      |
| `db`        | one         | package | Database driver (Postgres, SQLite)                          |
| `orm`       | one         | package | Schema + query layer (Drizzle, Prisma)                      |
| `ui`        | one         | package | Styling system + component primitives (Tailwind, shadcn, …) |
| `payments`  | one         | package | Checkout + webhooks (Stripe, Polar, …)                      |
| `email`     | one         | package | Transactional email (Resend)                                |
| `tooling`   | one         | repo    | Lint/format toolchain                                       |
| `testing`   | many        | app     | Unit + e2e (Vitest, Playwright)                             |
| `deploy`    | many        | repo    | Deploy targets (Vercel, Cloudflare, …)                      |
| `monorepo`  | one         | repo    | Monorepo task runner (Turborepo)                            |

Single-choice categories with `home: "app"` (currently `framework`) are enforced **per app** — a multi-app project can pick `next` for the web app and `expo` for a native app side by side. See [Concepts → Apps](/docs/concepts#apps).

## Framework [#framework]

Single-choice per app — the chosen framework wires the app shell, router, and React (or future) runtime. Modules declare an &#x2A;*`appKind`** (`web` or `native`) which the runner uses to validate they're installed into a compatible app: you can't install Next.js into a `kind: "native"` app, or Expo into a `kind: "web"` one. A multi-app project can pick one framework per app.

| Module           | `appKind` | Status       | Notes                                                                                    |
| ---------------- | --------- | ------------ | ---------------------------------------------------------------------------------------- |
| `tanstack-start` | web       | 🟢 Available | TanStack Start on Vite (no Vinxi). Provides `web`, `react`, `ssr`, `node`.               |
| `next`           | web       | 🟢 Available | Next.js 16 (App Router). Provides `web`, `react`, `ssr`, `rsc`, `node`, `edge`.          |
| `nuxt`           | web       | 🟨 Planned   | Vue. Requires relaxing the React-implicit assumption in peer modules (capability `vue`). |
| `svelte`         | web       | 🟨 Planned   | SvelteKit (capability `svelte`).                                                         |
| `solid`          | web       | 🟨 Planned   | SolidStart (capability `solid`).                                                         |
| `expo`           | native    | 🟨 Planned   | Expo + React Native. Unblocks the first `kind: "native"` app.                            |

## API [#api]

Single-choice, constraint-bearing. An optional layer between the framework and the database or services, installed as its own workspace package.

| Module | Status     | Notes                             |
| ------ | ---------- | --------------------------------- |
| `trpc` | 🟨 Planned | tRPC v11; per-framework adapters. |
| `orpc` | 🟨 Planned | oRPC.                             |

## AI [#ai]

Single-choice, constraint-bearing, installs into `packages/ai/`.

| Module          | Status       | Notes                                                                               |
| --------------- | ------------ | ----------------------------------------------------------------------------------- |
| `vercel-ai-sdk` | 🟢 Available | `ai` + `@ai-sdk/openai` with a streaming `/api/chat` route. Peers on `framework`.   |
| `tanstack-ai`   | 🟢 Available | `@tanstack/ai` + `@tanstack/ai-openai` with a streaming `/api/chat` route over SSE. |

## Authentication [#authentication]

Single-choice, installs into `packages/auth/`.

| Module        | Status       | Notes                                       |
| ------------- | ------------ | ------------------------------------------- |
| `better-auth` | 🟢 Available | Local data. Peers on `orm` and `framework`. |
| `clerk`       | 🟢 Available | Hosted database & UI. Peers on `framework`. |
| `workos`      | 🟨 Planned   | WorkOS AuthKit.                             |

## Database [#database]

Single-choice, installs into `packages/db/`.

| Module     | Status       | Notes                    |
| ---------- | ------------ | ------------------------ |
| `postgres` | 🟢 Available | `postgres` driver.       |
| `sqlite`   | 🟢 Available | `better-sqlite3` driver. |

## ORM [#orm]

Single-choice, shares `packages/db/` with the database driver.

| Module    | Status       | Notes                                               |
| --------- | ------------ | --------------------------------------------------- |
| `drizzle` | 🟢 Available | Drizzle ORM 0.45. Peers on `db` (postgres, sqlite). |
| `prisma`  | 🟢 Available | Prisma 7. Peers on `db` (postgres, sqlite).         |

## UI [#ui]

Single-choice. Installs into `packages/ui/` so styles + component primitives are shared across every app via `workspace:*`. Adapters branch on the active app's `framework` peer (PostCSS for Next, Vite plugin for TanStack Start, …).

| Module         | For    | Status       | Notes                                                                 |
| -------------- | ------ | ------------ | --------------------------------------------------------------------- |
| `tailwind`     | web    | 🟢 Available | Bare Tailwind v4 in `packages/ui/`; apps re-export postcss config.    |
| `shadcn-radix` | web    | 🟢 Available | shadcn/ui registry preset `radix-nova` (Radix primitives) + Tailwind. |
| `shadcn-base`  | web    | 🟢 Available | shadcn/ui registry preset `base-nova` (Base UI) + Tailwind.           |
| `nativewind`   | native | 🟨 Planned   | Tailwind-style className API for React Native.                        |
| `unistyles`    | native | 🟨 Planned   | Native StyleSheet with theme + breakpoint support.                    |

## Payments [#payments]

Single-choice, constraint-bearing. Installs into `packages/payments/`, plus a Better Auth plugin when auth is selected.

| Module   | Status       | Notes                                                                                                                                                                                                                                     |
| -------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `polar`  | 🟢 Available | `@polar-sh/sdk` + framework-native route handlers. Bridge variant (when `auth: better-auth` is selected) ships `@polar-sh/better-auth` and wires the plugin into `auth.ts`; the Better Auth catchall serves checkout / portal / webhooks. |
| `stripe` | 🟢 Available | `stripe` SDK + Checkout Sessions / webhook route handlers. Bridge variant ships `@better-auth/stripe`; the Better Auth catchall serves `/api/auth/stripe/webhook` plus subscription endpoints.                                            |
| `autumn` | 🟨 Planned   | Autumn.                                                                                                                                                                                                                                   |
| `dodo`   | 🟨 Planned   | Dodo Payments.                                                                                                                                                                                                                            |

## Email [#email]

Single-choice, installs into `packages/email/`.

| Module   | Status       | Notes                                                                                                 |
| -------- | ------------ | ----------------------------------------------------------------------------------------------------- |
| `resend` | 🟢 Available | `resend` SDK + a sample `react-email` template; framework-native `/api/webhook/resend` Svix-verifier. |

## Tooling [#tooling]

Single-choice, repo-scoped. The three toolchains are mutually exclusive substitutes.

| Module            | Status       | Notes                                                  |
| ----------------- | ------------ | ------------------------------------------------------ |
| `eslint-prettier` | 🟢 Available | ESLint flat config + Prettier; per-framework adapters. |
| `biome`           | 🟢 Available | Biome (lint + format), framework-agnostic.             |
| `oxlint-oxfmt`    | 🟢 Available | Oxlint + oxfmt, framework-agnostic.                    |

## Testing [#testing]

Coexisting, app-scoped. Vitest and Playwright are independent and routinely run side by side.

| Module       | Status       | Notes                                                             |
| ------------ | ------------ | ----------------------------------------------------------------- |
| `vitest`     | 🟢 Available | Unit + integration; `jsdom` + RTL; `test`/`test:watch` scripts.   |
| `playwright` | 🟢 Available | e2e; per-framework `webServer`; `test:e2e`/`test:e2e:ui` scripts. |

## Deploy [#deploy]

Coexisting, repo-scoped.

| Module       | Status     | Notes                                                                          |
| ------------ | ---------- | ------------------------------------------------------------------------------ |
| `vercel`     | 🟨 Planned | `vercel.json` + framework-specific output.                                     |
| `cloudflare` | 🟨 Planned | Workers / Pages adapter per framework (e.g. Vite plugins, `wrangler.json`, …). |
| `railway`    | 🟨 Planned | `railway.toml` + Dockerfile.                                                   |
| `docker`     | 🟨 Planned | Generic `Dockerfile` + compose for self-host.                                  |

## Monorepo [#monorepo]

Coexisting, repo-scoped. Currently hardcoded as Turborepo; becomes a real configurable category when a second option lands.

| Module      | Status       | Notes                                                              |
| ----------- | ------------ | ------------------------------------------------------------------ |
| `turbo`     | 🟢 Available | Turborepo v2                                                       |
| `vite-plus` | 🟨 Planned   | Locked to Vite-compatible frameworks (TanStack, etc.) and modules. |

## Package manager [#package-manager]

Not a category — a top-level field in `stanza.json` (`packageManager: "pnpm" | "bun" | "npm"`). The wizard prompts for it; codemods only ever touch `package.json`, never lockfiles.

| Manager | Status                 |
| ------- | ---------------------- |
| pnpm    | 🟢 Available (default) |
| bun     | 🟢 Available           |
| npm     | 🟢 Available           |
| yarn    | 🛑 Not Planned         |

## Third-party registries [#third-party-registries]

The categories above are first-party — Stanza ships them under the default `@stanza` namespace. Anyone can publish additional modules under their own `@scope` and have users install them with `stanza add <category> @scope/<id>`. The category taxonomy itself stays first-party (third-party registries can't redefine it).

For consumers, declaring a registry is the full URL of its main JSON file in `stanza.json`:

```jsonc
{ "registries": { "@acme": "https://reg.acme.example/index.json" } }
```

For authors, the full module surface — `defineModule`, templates, codemods, the build pipeline, hosting, namespace conventions, and a worked example — lives in the [Authoring manual](/docs/authoring).
