Skip to content
Documentation

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.

CategoryCardinalityHomeWhat it covers
frameworkoneappWeb app shell + router
apionepackageTyped RPC layer between framework and services
aionepackageAI SDK + provider wiring
authonepackageAuthentication, user accounts
dbonepackageDatabase driver
ormonepackageSchema + query layer
uionepackageStyling system + component primitives
paymentsonepackageCheckout + webhooks
emailonepackageTransactional email
storageonepackageObject / file storage
observabilitymanyappProduct analytics, error tracking
analyticsmanyappPrivacy-friendly site analytics
toolingonerepoLint/format toolchain
testingmanyappUnit + E2E
deploymanyrepoDeployment targets
monorepoonerepoMonorepo task runner

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.

ModuleappKindStatusNotes
tanstack-startweb🟢 AvailableTanStack Start on Vite (no Vinxi). Provides web, react, ssr, node.
nextweb🟢 AvailableNext.js 16 (App Router). Provides web, react, ssr, rsc, node, edge.
nuxtweb🟨 PlannedVue. Requires relaxing the React-implicit assumption in peer modules (capability vue).
svelteweb🟨 PlannedSvelteKit (capability svelte).
solidweb🟨 PlannedSolidStart (capability solid).
exponative🟨 PlannedExpo + 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.

ModuleStatusNotes
trpc🟨 PlannedtRPC v11; per-framework adapters.
orpc🟨 PlannedoRPC.

AI

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

ModuleStatusNotes
vercel-ai-sdk🟢 Availableai + @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/.

ModuleStatusNotes
better-auth🟢 AvailableLocal data. Peers on orm and framework.
clerk🟢 AvailableHosted database & UI. Peers on framework.
workos🟨 PlannedWorkOS AuthKit.
supabase🟨 PlannedSupabase Auth; constrains db.

Database

Single-choice, installs into packages/db/.

ModuleStatusNotes
postgres🟢 Availablepostgres driver.
sqlite🟢 Availablebetter-sqlite3 driver.
supabase🟨 PlannedHosted Postgres.
turso🟨 PlannedlibSQL (edge SQLite).

ORM

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

ModuleStatusNotes
drizzle🟢 AvailableDrizzle ORM 0.45. Peers on db (postgres, sqlite).
prisma🟢 AvailablePrisma 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, …).

ModuleForStatusNotes
tailwindweb🟢 AvailableBare Tailwind v4 in packages/ui/; apps re-export postcss config.
shadcn-radixweb🟢 Availableshadcn/ui registry preset radix-nova (Radix primitives) + Tailwind.
shadcn-baseweb🟢 Availableshadcn/ui registry preset base-nova (Base UI) + Tailwind.
nativewindnative🟨 PlannedTailwind-style className API for React Native.
unistylesnative🟨 PlannedNative StyleSheet with theme + breakpoint support.

Payments

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

ModuleStatusNotes
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🟢 Availablestripe 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🟨 PlannedAutumn.
dodo🟨 PlannedDodo Payments.

Email

Single-choice, installs into packages/email/.

ModuleStatusNotes
resend🟢 Availableresend SDK + a sample react-email template; framework-native /api/webhook/resend Svix-verifier.
postmark🟨 Plannedpostmark SDK + framework-native webhook handler.

Storage

Single-choice, installs into packages/storage/.

ModuleStatusNotes
s3🟨 PlannedAWS S3 (@aws-sdk/client-s3).
r2🟨 PlannedCloudflare R2 (S3-compatible).
uploadthing🟨 PlannedManaged uploads (UploadThing).

Observability

Coexisting, app-scoped.

ModuleStatusNotes
posthog🟨 PlannedProduct analytics, error tracking, etc.
sentry🟨 PlannedHeavier focus on error tracking
axiom🟨 PlannedLogs + event analytics.

Analytics

Coexisting, app-scoped — privacy-friendly site analytics, distinct from observability's product analytics and error tracking.

ModuleStatusNotes
plausible🟨 PlannedPrivacy-first, open source.
umami🟨 PlannedSelf-hostable, open source.
fathom🟨 PlannedPrivacy-first, hosted.

Tooling

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

ModuleStatusNotes
eslint-prettier🟢 AvailableESLint flat config + Prettier; per-framework adapters.
biome🟢 AvailableBiome (lint + format), framework-agnostic.
oxlint-oxfmt🟢 AvailableOxlint + oxfmt, framework-agnostic.

Testing

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

ModuleStatusNotes
vitest🟢 AvailableUnit + integration; jsdom + RTL; test/test:watch scripts.
playwright🟢 Availablee2e; per-framework webServer; test:e2e/test:e2e:ui scripts.
storybook🟨 PlannedComponent workshop + stories.

Deploy

Coexisting, repo-scoped.

ModuleStatusNotes
vercel🟨 Plannedvercel.json + framework-specific output.
cloudflare🟨 PlannedWorkers / Pages adapter per framework (e.g. Vite plugins, wrangler.json, …).
railway🟨 Plannedrailway.toml + Dockerfile.
docker🟨 PlannedGeneric Dockerfile + compose for self-host.
netlify🟨 Plannednetlify.toml + framework adapter.
render🟨 Plannedrender.yaml + Dockerfile.
fly🟨 Plannedfly.toml + Dockerfile (Fly.io).

Monorepo

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

ModuleStatusNotes
turbo🟢 AvailableTurborepo v2
vite-plus🟨 PlannedLocked 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.

ManagerStatus
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" } }

A registry url must be served over https:// — module payloads have no integrity check beyond TLS, so a cleartext http:// registry is refused (it would let an on-path attacker tamper with the modules you install). file:// URLs, bare filesystem paths, and loopback hosts (localhost/127.0.0.1) stay allowed for local development; set STANZA_ALLOW_INSECURE_REGISTRY=1 only if you knowingly need a trusted internal http:// mirror. A third-party registry that fails this check is skipped with a warning rather than breaking the whole CLI.

For authors, the full module surface — defineModule, templates, codemods, the build pipeline, hosting, namespace conventions, and a worked example — lives in the Authoring manual.