
Template details
create-universal-app (CUA)
Opinionated template for full-stack universal apps with Expo, Next.js, tRPC, Prisma, Clerk, Solito, and Tamagui.
About this template
create-universal-app (CUA) is a GitHub boilerplate template for scaffolding full-stack universal apps — one React Native codebase that runs on iOS, Android, and web through Expo, Next.js, tRPC, Prisma, Clerk, Solito, and Tamagui.
What is create-universal-app?
create-universal-app (CUA) is an opinionated, open-source template that generates a full-stack monorepo for universal (mobile + web) development. It takes a blank workspace and produces a project with a Next.js web app (apps/next), an Expo mobile app (apps/expo), and five shared packages: ui for Tamagui components, db for the Prisma schema, app for frontend features/navigation/providers, and api for tRPC routers. It adds Clerk authentication for both Expo and Next.js out of the box, so users can sign in on either platform. The repository is hosted on GitHub and is no longer actively maintained according to its README.
Key Features
The template ships with eight built-in capabilities that cover the full stack.
- Universal codebase — Write React Native code in
packages/app/featuresusing Tamagui Stacks; the same code renders as HTML/CSS on the Next.js side and native components in Expo. - Built-in mobile + web auth — Clerk provides the
SignedIn/SignedOuthooks and components for both Expo and Next.js, plus SDKs for Expo frontend, Next.js frontend, and Next.js server side. - tRPC API layer — All backend code lives in
packages/api; frontend and backend communicate through type-safe tRPC procedures, with route files added inpackages/api/src/router. - Prisma ORM with SQLite by default — The database schema is defined in
packages/db;yarn db-pushsyncs it, and Postgres (e.g., Railway or Supabase) is recommended for production. - Tamagui for UI and styling — Tamagui's compiler, core components, and UI kit replace React Native's View and Text, giving cross-platform components with tree-flattening optimizations.
- Routing registered in both apps — New screens are created once in
packages/app/featuresand then wired into bothapps/expo/appandapps/next/pages. - CLI and VSCode extension — Scaffold with
npx create-t3-universal-appand optional flags (--with-supabase,--with-drizzle-pg,--with-drizzle-sql); the t3-cua-tools extension automates new screen creation. - Demo and tutorial — A live demo is at https://cua-demo.vercel.app/ and a 20-minute YouTube walkthrough is available.
Who should use create-universal-app?
Developers who want to own every layer of a cross-platform app from one codebase.
- Full-stack engineers building both a mobile app and a web dashboard can use CUA to avoid duplicating API calls, auth state, and UI components.
- Startup teams prototyping cross-platform products get auth, a database, and a UI kit preconfigured, so they can start writing features in
packages/app/features. - React Native developers who want web SSR on the same code can write normal React Native code with Tamagui Stacks and get HTML/CSS output from Next.js.
- t3-stack users can extend the familiar Next.js/tRPC/Prisma stack with Expo and Tamagui without starting from scratch.
What can you do with create-universal-app?
You can scaffold a complete full-stack monorepo, add features, deploy to Vercel, and swap databases using the provided CLI flags.
- Scaffold a production-shaped monorepo — Run the CLI and get a project with folder structure, environment variables, and scripts (
yarn web,yarn native,yarn dev,yarn studio) ready to go. - Build a feature with shared logic — Add a screen in
packages/app/features, put shared UI components inpackages/ui, expose a tRPC procedure inpackages/api, and use it from both the Expo and Next.js apps. - Deploy the web app to Vercel — Set the environment variables
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY,CLERK_SECRET_KEY, andDATABASE_URL, and link the repo to Vercel. - Swap the database layer — Use the default SQLite for local development, or choose a Prisma Postgres/ Supabase setup via the
--with-supabaseflag, or switch to Drizzle with--with-drizzle-pg.
How does create-universal-app work?
Setting up and extending CUA follows these steps:
- Run
yarn installto install dependencies and build the workspace. - Duplicate
.env.exampleto.envand fill inCLERK_SECRET_KEYandNEXT_PUBLIC_CLERK_PUBLISHABLE_KEYfrom Clerk; aDATABASE_URLis optional because SQLite is the default. - Run
yarn db-pushto create the Prisma tables. - Start developing with
yarn web(web + backend),yarn native(iOS/Android),yarn dev(all packages), oryarn studio(Prisma Studio). - When adding a page, create a feature in
packages/app/features, then add arouteName.tsxfile underapps/expo/appand a folder underapps/next/pages.
Pros and cons
CUA has clear trade-offs that depend on your budget and maintenance appetite.
Pros:
- Single codebase for iOS, Android, and web with shared UI and auth.
- Type-safe communication across frontend, backend, and database thanks to tRPC and Prisma.
- Active community Discord for help (link in the README).
Cons:
- The repo is no longer actively maintained, so users should expect limited updates.
- Clerk's premium plan is expensive compared to alternatives, and SMS authentication requires a paid plan.
- Nativewind and Tailwind are not set up by default; Tamagui is the only preconfigured styling solution.
Alternatives
These related starters occupy similar territory to CUA.
- create-t3-turbo — the base that CUA builds on; it offers an Expo/Next/tRPC/Prisma monorepo but lacks UI code sharing and mobile auth.
- t3-turbo-and-clerk — adds Clerk auth for mobile and web to t3 turbo, but still does not share UI code.
- tamagui + solito starter — provides Expo and Next code sharing with Tamagui, but includes no tRPC or built-in auth.
FAQ
Is create-universal-app still maintained?
No. The repository README states it is no longer actively maintained. A community-maintained CLI, npx create-t3-universal-app, offers variations of the original template with Supabase or Drizzle support.
How do I start a new project with CUA?
Run npx create-t3-universal-app in your terminal. You can add one of these flags for a specific variation: --with-supabase, --with-drizzle-pg, or --with-drizzle-sql. Then follow the README setup steps.
Which database does CUA use?
By default, CUA uses SQLite through Prisma, so you can start without a separate database. For production, the author recommends provisioning Postgres on Railway or using Supabase and setting the DATABASE_URL environment variable.
Where should I install packages that contain native code?
Install packages that involve interactions with the phone OS (storage, camera, gyroscope, notifications) into the /expo folder. Packages that are pure JavaScript can be installed at the workspace root.
What is the difference between CUA and create-t3-turbo?
CUA is built on top of create-t3-turbo but adds two things: UI code sharing across apps through Tamagui, and authentication for both mobile and web through Clerk. create-t3-turbo alone has no shared UI layer and no mobile auth.















