Files
stanza/apps/web/content/docs/registry.mdx
T
jake 99ed11f5de docs: update CLI and registry documentation for clarity and accuracy
- Enhanced descriptions in `AGENTS.md`, `cli.mdx`, and `getting-started.mdx` to provide clearer guidance on module categories and commands.
- Added information about third-party module publishing in `registry.mdx`.
- Adjusted the order of pages in `meta.json` for better navigation.
- Improved warning and info callouts for better user experience.
2026-06-04 15:58:17 -04:00

13 KiB

title, description
title description
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, third parties can publish their own modules under any @scope and have users pull them in alongside these. See Third-party registries below, or the Authoring manual for the full implementation details.

Categories

A category has two independent properties: its cardinalityone (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 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.

Framework

Single-choice per app — the chosen framework wires the app shell, router, and React (or future) runtime. Modules declare an 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

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

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

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

Single-choice, installs into packages/db/.

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

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

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

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

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

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

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

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

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

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

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:

{ "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.