Full Code of t3-oss/create-t3-app for AI

main 4709861f7e67 cached
520 files
1.6 MB
489.9k tokens
136 symbols
1 requests
Download .txt
Showing preview only (1,790K chars total). Download the full file or copy to clipboard to get everything.
Repository: t3-oss/create-t3-app
Branch: main
Commit: 4709861f7e67
Files: 520
Total size: 1.6 MB

Directory structure:
gitextract_17kc1cit/

├── .changeset/
│   ├── README.md
│   ├── beige-clouds-behave.md
│   ├── config.json
│   ├── curly-zoos-add.md
│   ├── quick-snakes-give.md
│   └── tender-humans-hide.md
├── .codesandbox/
│   └── tasks.json
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── actions/
│   │   └── setup/
│   │       └── action.yml
│   ├── changeset-version.js
│   ├── labeler.yml
│   ├── pull_request_template.md
│   ├── scripts/
│   │   └── generate-matrix.js
│   ├── version-script-beta.js
│   ├── version-script-next.js
│   └── workflows/
│       ├── ci.yml
│       ├── e2e.yml
│       ├── pr-labeler.yml
│       ├── prerelease-comment.yml
│       ├── prerelease.yml
│       ├── release.yml
│       └── translations.yml
├── .gitignore
├── .gitpod.yml
├── .vscode/
│   ├── extensions.json
│   └── settings.json
├── CONTRIBUTING.md
├── LICENSE
├── cli/
│   ├── .yarnrc.yml
│   ├── CHANGELOG.md
│   ├── README.md
│   ├── eslint.config.js
│   ├── package.json
│   ├── prettier.config.mjs
│   ├── src/
│   │   ├── cli/
│   │   │   └── index.ts
│   │   ├── consts.ts
│   │   ├── helpers/
│   │   │   ├── createProject.ts
│   │   │   ├── format.ts
│   │   │   ├── git.ts
│   │   │   ├── installDependencies.ts
│   │   │   ├── installPackages.ts
│   │   │   ├── logNextSteps.ts
│   │   │   ├── scaffoldProject.ts
│   │   │   ├── selectBoilerplate.ts
│   │   │   └── setImportAlias.ts
│   │   ├── index.ts
│   │   ├── installers/
│   │   │   ├── betterAuth.ts
│   │   │   ├── biome.ts
│   │   │   ├── dbContainer.ts
│   │   │   ├── dependencyVersionMap.ts
│   │   │   ├── drizzle.ts
│   │   │   ├── envVars.ts
│   │   │   ├── eslint.ts
│   │   │   ├── index.ts
│   │   │   ├── nextAuth.ts
│   │   │   ├── prisma.ts
│   │   │   ├── tailwind.ts
│   │   │   └── trpc.ts
│   │   └── utils/
│   │       ├── addPackageDependency.ts
│   │       ├── addPackageScript.ts
│   │       ├── getT3Version.ts
│   │       ├── getUserPkgManager.ts
│   │       ├── isTTYError.ts
│   │       ├── logger.ts
│   │       ├── parseNameAndPath.ts
│   │       ├── removeTrailingSlash.ts
│   │       ├── renderTitle.ts
│   │       ├── renderVersionWarning.ts
│   │       ├── validateAppName.ts
│   │       └── validateImportAlias.ts
│   ├── template/
│   │   ├── base/
│   │   │   ├── README.md
│   │   │   ├── _gitignore
│   │   │   ├── next.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── env.js
│   │   │   │   └── styles/
│   │   │   │       └── globals.css
│   │   │   └── tsconfig.json
│   │   └── extras/
│   │       ├── config/
│   │       │   ├── _eslint.base.js
│   │       │   ├── _eslint.drizzle.js
│   │       │   ├── _prettier.config.js
│   │       │   ├── _tailwind.prettier.config.js
│   │       │   ├── biome.jsonc
│   │       │   ├── drizzle-config-mysql.ts
│   │       │   ├── drizzle-config-postgres.ts
│   │       │   ├── drizzle-config-sqlite.ts
│   │       │   ├── next-config-appdir.js
│   │       │   └── postcss.config.js
│   │       ├── pnpm/
│   │       │   └── _npmrc
│   │       ├── prisma/
│   │       │   └── schema/
│   │       │       ├── base-planetscale.prisma
│   │       │       ├── base.prisma
│   │       │       ├── with-auth-planetscale.prisma
│   │       │       ├── with-auth.prisma
│   │       │       ├── with-better-auth-planetscale.prisma
│   │       │       └── with-better-auth.prisma
│   │       ├── src/
│   │       │   ├── app/
│   │       │   │   ├── _components/
│   │       │   │   │   ├── post-tw.tsx
│   │       │   │   │   └── post.tsx
│   │       │   │   ├── api/
│   │       │   │   │   ├── auth/
│   │       │   │   │   │   ├── [...all]/
│   │       │   │   │   │   │   └── route.ts
│   │       │   │   │   │   └── [...nextauth]/
│   │       │   │   │   │       └── route.ts
│   │       │   │   │   └── trpc/
│   │       │   │   │       └── [trpc]/
│   │       │   │   │           └── route.ts
│   │       │   │   ├── layout/
│   │       │   │   │   ├── base.tsx
│   │       │   │   │   ├── with-trpc-tw.tsx
│   │       │   │   │   ├── with-trpc.tsx
│   │       │   │   │   └── with-tw.tsx
│   │       │   │   └── page/
│   │       │   │       ├── base.tsx
│   │       │   │       ├── with-auth-trpc-tw.tsx
│   │       │   │       ├── with-auth-trpc.tsx
│   │       │   │       ├── with-better-auth-trpc-tw.tsx
│   │       │   │       ├── with-better-auth-trpc.tsx
│   │       │   │       ├── with-better-auth-tw.tsx
│   │       │   │       ├── with-better-auth.tsx
│   │       │   │       ├── with-trpc-tw.tsx
│   │       │   │       ├── with-trpc.tsx
│   │       │   │       └── with-tw.tsx
│   │       │   ├── env/
│   │       │   │   ├── with-auth-db-planetscale.js
│   │       │   │   ├── with-auth-db.js
│   │       │   │   ├── with-auth.js
│   │       │   │   ├── with-better-auth-db-planetscale.js
│   │       │   │   ├── with-better-auth-db.js
│   │       │   │   ├── with-better-auth.js
│   │       │   │   ├── with-db-planetscale.js
│   │       │   │   └── with-db.js
│   │       │   ├── index.module.css
│   │       │   ├── pages/
│   │       │   │   ├── _app/
│   │       │   │   │   ├── base.tsx
│   │       │   │   │   ├── with-auth-trpc-tw.tsx
│   │       │   │   │   ├── with-auth-trpc.tsx
│   │       │   │   │   ├── with-auth-tw.tsx
│   │       │   │   │   ├── with-auth.tsx
│   │       │   │   │   ├── with-better-auth-trpc-tw.tsx
│   │       │   │   │   ├── with-better-auth-trpc.tsx
│   │       │   │   │   ├── with-trpc-tw.tsx
│   │       │   │   │   ├── with-trpc.tsx
│   │       │   │   │   └── with-tw.tsx
│   │       │   │   ├── api/
│   │       │   │   │   ├── auth/
│   │       │   │   │   │   └── [...all].ts
│   │       │   │   │   └── trpc/
│   │       │   │   │       └── [trpc].ts
│   │       │   │   └── index/
│   │       │   │       ├── base.tsx
│   │       │   │       ├── with-auth-trpc-tw.tsx
│   │       │   │       ├── with-auth-trpc.tsx
│   │       │   │       ├── with-better-auth-trpc-tw.tsx
│   │       │   │       ├── with-better-auth-trpc.tsx
│   │       │   │       ├── with-better-auth-tw.tsx
│   │       │   │       ├── with-better-auth.tsx
│   │       │   │       ├── with-trpc-tw.tsx
│   │       │   │       ├── with-trpc.tsx
│   │       │   │       └── with-tw.tsx
│   │       │   ├── server/
│   │       │   │   ├── api/
│   │       │   │   │   ├── root.ts
│   │       │   │   │   ├── routers/
│   │       │   │   │   │   └── post/
│   │       │   │   │   │       ├── base.ts
│   │       │   │   │   │       ├── with-auth-drizzle.ts
│   │       │   │   │   │       ├── with-auth-prisma.ts
│   │       │   │   │   │       ├── with-auth.ts
│   │       │   │   │   │       ├── with-drizzle.ts
│   │       │   │   │   │       └── with-prisma.ts
│   │       │   │   │   ├── trpc-app/
│   │       │   │   │   │   ├── base.ts
│   │       │   │   │   │   ├── with-auth-db.ts
│   │       │   │   │   │   ├── with-auth.ts
│   │       │   │   │   │   ├── with-better-auth-db.ts
│   │       │   │   │   │   ├── with-better-auth.ts
│   │       │   │   │   │   └── with-db.ts
│   │       │   │   │   └── trpc-pages/
│   │       │   │   │       ├── base.ts
│   │       │   │   │       ├── with-auth-db.ts
│   │       │   │   │       ├── with-auth.ts
│   │       │   │   │       ├── with-better-auth-db.ts
│   │       │   │   │       ├── with-better-auth.ts
│   │       │   │   │       └── with-db.ts
│   │       │   │   ├── auth/
│   │       │   │   │   ├── config/
│   │       │   │   │   │   ├── base.ts
│   │       │   │   │   │   ├── with-drizzle.ts
│   │       │   │   │   │   └── with-prisma.ts
│   │       │   │   │   └── index.ts
│   │       │   │   ├── better-auth/
│   │       │   │   │   ├── client.ts
│   │       │   │   │   ├── config/
│   │       │   │   │   │   ├── base.ts
│   │       │   │   │   │   ├── with-drizzle.ts
│   │       │   │   │   │   └── with-prisma.ts
│   │       │   │   │   ├── index.ts
│   │       │   │   │   └── server.ts
│   │       │   │   └── db/
│   │       │   │       ├── db-prisma-planetscale.ts
│   │       │   │       ├── db-prisma.ts
│   │       │   │       ├── index-drizzle/
│   │       │   │       │   ├── with-mysql.ts
│   │       │   │       │   ├── with-planetscale.ts
│   │       │   │       │   ├── with-postgres.ts
│   │       │   │       │   └── with-sqlite.ts
│   │       │   │       └── schema-drizzle/
│   │       │   │           ├── base-mysql.ts
│   │       │   │           ├── base-planetscale.ts
│   │       │   │           ├── base-postgres.ts
│   │       │   │           ├── base-sqlite.ts
│   │       │   │           ├── with-auth-mysql.ts
│   │       │   │           ├── with-auth-planetscale.ts
│   │       │   │           ├── with-auth-postgres.ts
│   │       │   │           ├── with-auth-sqlite.ts
│   │       │   │           ├── with-better-auth-mysql.ts
│   │       │   │           ├── with-better-auth-planetscale.ts
│   │       │   │           ├── with-better-auth-postgres.ts
│   │       │   │           └── with-better-auth-sqlite.ts
│   │       │   ├── styles/
│   │       │   │   └── globals.css
│   │       │   ├── trpc/
│   │       │   │   ├── query-client.ts
│   │       │   │   ├── react.tsx
│   │       │   │   └── server.ts
│   │       │   └── utils/
│   │       │       └── api.ts
│   │       └── start-database/
│   │           ├── mysql.sh
│   │           └── postgres.sh
│   ├── tsconfig.eslint.json
│   ├── tsconfig.json
│   └── tsup.config.ts
├── package.json
├── pnpm-workspace.yaml
├── prettier.config.mjs
├── reset.d.ts
├── tsconfig.json
├── turbo.json
└── www/
    ├── .env.example
    ├── .gitignore
    ├── README.md
    ├── TRANSLATIONS.md
    ├── astro.config.mjs
    ├── package.json
    ├── postcss.config.cjs
    ├── prettier.config.mjs
    ├── public/
    │   ├── makeScrollableCodeFocusable.js
    │   └── robots.txt
    ├── src/
    │   ├── .vscode/
    │   │   └── settings.json
    │   ├── components/
    │   │   ├── accessibility/
    │   │   │   └── jumpToContent.astro
    │   │   ├── branding/
    │   │   │   └── Asset.astro
    │   │   ├── docs/
    │   │   │   ├── avatarList.astro
    │   │   │   ├── breadCrumbs.tsx
    │   │   │   ├── callout.tsx
    │   │   │   ├── companyList.tsx
    │   │   │   ├── exampleOptionForm.astro
    │   │   │   ├── folderStructureDiagramApp.astro
    │   │   │   ├── folderStructureDiagramPages.astro
    │   │   │   ├── folderStructureForm.astro
    │   │   │   ├── indexPage.astro
    │   │   │   ├── introductionTab.tsx
    │   │   │   ├── openSourceAppList.tsx
    │   │   │   ├── outdatedDocsBanner.astro
    │   │   │   ├── pageContent.astro
    │   │   │   ├── pagination.astro
    │   │   │   └── tabs.astro
    │   │   ├── footer/
    │   │   │   └── footer.astro
    │   │   ├── headCommon.astro
    │   │   ├── headSeo.astro
    │   │   ├── icons/
    │   │   │   ├── leftArrow.astro
    │   │   │   └── rightArrow.astro
    │   │   ├── landingPage/
    │   │   │   ├── ClipboardSelect.tsx
    │   │   │   ├── about.astro
    │   │   │   ├── banner.astro
    │   │   │   ├── button.astro
    │   │   │   ├── cli.tsx
    │   │   │   ├── community/
    │   │   │   │   ├── community.astro
    │   │   │   │   └── communityCard.astro
    │   │   │   ├── pageSection.astro
    │   │   │   ├── stack/
    │   │   │   │   ├── card.astro
    │   │   │   │   └── stack.astro
    │   │   │   └── tweets/
    │   │   │       ├── featuredTweets.ts
    │   │   │       ├── tweetCard.astro
    │   │   │       ├── tweetSlider.astro
    │   │   │       └── tweets.astro
    │   │   ├── navigation/
    │   │   │   ├── LanguageSelect.tsx
    │   │   │   ├── OnThisPageLinks.tsx
    │   │   │   ├── Search.tsx
    │   │   │   ├── githubIcon.astro
    │   │   │   ├── leftSidebar.astro
    │   │   │   ├── moreMenu.astro
    │   │   │   ├── navbar.astro
    │   │   │   ├── rightSidebar.astro
    │   │   │   ├── sidebarToggle.astro
    │   │   │   ├── tableOfContents.astro
    │   │   │   └── themeToggleButton.astro
    │   │   └── openGraph.tsx
    │   ├── config.ts
    │   ├── env.d.ts
    │   ├── languages.ts
    │   ├── layouts/
    │   │   ├── docs.astro
    │   │   └── landingPage.astro
    │   ├── pages/
    │   │   ├── 404.astro
    │   │   ├── ar/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.md
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.md
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── branding.astro
    │   │   ├── en/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.mdx
    │   │   │   │   └── vercel.md
    │   │   │   ├── examples.mdx
    │   │   │   ├── faq.mdx
    │   │   │   ├── folder-structure-app.mdx
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.mdx
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── _next-auth-app-router.mdx
    │   │   │   │   ├── _next-auth-pages.mdx
    │   │   │   │   ├── drizzle.mdx
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.mdx
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── es/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.md
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.md
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── fr/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.mdx
    │   │   │   │   └── vercel.md
    │   │   │   ├── examples.mdx
    │   │   │   ├── faq.mdx
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.mdx
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── index.astro
    │   │   ├── ja/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.mdx
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.mdx
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── no/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.md
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.md
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── og.ts
    │   │   ├── pl/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── examples.mdx
    │   │   │   ├── faq.md
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.md
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── pt/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.mdx
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.mdx
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── ru/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.md
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── themeTest.astro
    │   │   ├── uk/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── examples.mdx
    │   │   │   ├── faq.mdx
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── drizzle.mdx
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.mdx
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   └── zh-hans/
    │   │       ├── deployment/
    │   │       │   ├── docker.md
    │   │       │   ├── index.astro
    │   │       │   ├── netlify.mdx
    │   │       │   └── vercel.md
    │   │       ├── faq.mdx
    │   │       ├── folder-structure-pages.mdx
    │   │       ├── installation.mdx
    │   │       ├── introduction.md
    │   │       ├── other-recs.md
    │   │       ├── t3-collection.mdx
    │   │       ├── usage/
    │   │       │   ├── drizzle.mdx
    │   │       │   ├── env-variables.mdx
    │   │       │   ├── first-steps.md
    │   │       │   ├── index.astro
    │   │       │   ├── next-auth.mdx
    │   │       │   ├── next-js.md
    │   │       │   ├── prisma.md
    │   │       │   ├── tailwind.md
    │   │       │   ├── trpc.md
    │   │       │   └── typescript.md
    │   │       └── why.md
    │   ├── styles/
    │   │   ├── accessibility.css
    │   │   ├── algolia/
    │   │   │   ├── button.css
    │   │   │   ├── modal.css
    │   │   │   └── style.css
    │   │   ├── global.css
    │   │   └── swiper.css
    │   └── utils/
    │       ├── fetchGithub.ts
    │       ├── ogFont.ts
    │       ├── pagination.ts
    │       └── siteUrl.ts
    ├── tailwind.config.ts
    ├── tsconfig.json
    └── vercel.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .changeset/README.md
================================================
# Changesets

Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
with multi-package repos, or single-package repos to help you version and publish your code. You can
find the full documentation for it [in our repository](https://github.com/changesets/changesets)

We have a quick list of common questions to get you started engaging with this project in
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)


================================================
FILE: .changeset/beige-clouds-behave.md
================================================
---
"create-t3-app": patch
---

fix #1903 #2157 #2163


================================================
FILE: .changeset/config.json
================================================
{
  "$schema": "https://unpkg.com/@changesets/config@2.1.1/schema.json",
  "changelog": [
    "@changesets/changelog-github",
    { "repo": "t3-oss/create-t3-app" }
  ],
  "commit": false,
  "fixed": [],
  "linked": [],
  "access": "public",
  "baseBranch": "main",
  "updateInternalDependencies": "patch",
  "ignore": ["@ct3a/www"],
  "changedFilePatterns": ["src/**", "template/**"]
}


================================================
FILE: .changeset/curly-zoos-add.md
================================================
---
"create-t3-app": minor
---

Fixes Biome formatter during the initial installation process


================================================
FILE: .changeset/quick-snakes-give.md
================================================
---
"create-t3-app": patch
---

fix(security): bump react and next ([BLOG](https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components#update-instructions))


================================================
FILE: .changeset/tender-humans-hide.md
================================================
---
"create-t3-app": patch
---

fix(security): bump react ([CVE-2025-55182](https://github.com/facebook/react/security/advisories/GHSA-fv66-9v8q-g76r))


================================================
FILE: .codesandbox/tasks.json
================================================
{
  // These tasks will run in order when initializing your CodeSandbox project.
  "setupTasks": [
    {
      "name": "Install Dependencies",
      "command": "pnpm install"
    }
  ],

  // These tasks can be run from CodeSandbox. Running one will open a log in the app.
  "tasks": {
    "typecheck": {
      "name": "typecheck",
      "command": "pnpm typecheck",
      "runAtStart": false
    },
    "build:cli": {
      "name": "build:cli",
      "command": "pnpm build:cli",
      "runAtStart": false
    },
    "build:www": {
      "name": "build:www",
      "command": "pnpm build:www",
      "runAtStart": false
    },
    "build": {
      "name": "build",
      "command": "pnpm build",
      "runAtStart": false
    },
    "start:cli": {
      "name": "start:cli",
      "command": "pnpm start:cli",
      "runAtStart": false
    },
    "start:www": {
      "name": "start:www",
      "command": "pnpm start:www",
      "runAtStart": false
    },
    "dev:cli": {
      "name": "dev:cli",
      "command": "pnpm dev:cli",
      "runAtStart": false
    },
    "dev:www": {
      "name": "dev:www",
      "command": "pnpm dev:www",
      "runAtStart": true
    },
    "clean": {
      "name": "clean",
      "command": "pnpm clean",
      "runAtStart": false
    },
    "lint": {
      "name": "lint",
      "command": "pnpm lint",
      "runAtStart": false
    },
    "format": {
      "name": "format",
      "command": "pnpm format",
      "runAtStart": false
    },
    "format:check": {
      "name": "format:check",
      "command": "pnpm format:check",
      "runAtStart": false
    }
  }
}


================================================
FILE: .gitattributes
================================================
# mdx
*.mdx linguist-detectable=false

================================================
FILE: .github/CODEOWNERS
================================================
# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners

* @juliusmarminge @nexxeln @t3dotgg @c-ehrlich


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: 🐞 Bug Report
description: Create a bug report to help us improve
title: "bug: "
labels: ["🐞❔ unconfirmed bug"]
body:
  - type: textarea
    attributes:
      label: Provide environment information
      description: |
        Run this command in your project root and paste the results:
        ```bash
        npx envinfo --system --binaries
        ```
        If the issue is regarding a scaffolded app, please include the version used to scaffold that app which you can find in the `package.json` under `ct3aMetadata.initVersion`.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Describe the bug
      description: A clear and concise description of the bug, as well as what you expected to happen when encountering it.
    validations:
      required: true
  - type: input
    attributes:
      label: Reproduction repo
      description: If applicable, please provide a link to a reproduction repo or a Stackblitz / CodeSandbox project. Your issue may be closed if this is not provided and we are unable to reproduce the issue. If your bug is a documentaion issue, link the appropriate page.
    validations:
      required: true
  - type: textarea
    attributes:
      label: To reproduce
      description: Describe how to reproduce your bug. Steps, code snippets, reproduction repos etc.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Additional information
      description: Add any other information related to the bug here, screenshots if applicable.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Ask a question
    url: https://t3.gg/discord
    about: Ask questions and discuss with other community members


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: 🧑‍💻 Feature Request
description: Suggest an idea for this project
title: "feat: "
labels: ["🌟 enhancement"]
body:
  - type: textarea
    attributes:
      label: Is your feature request related to a problem? Please describe.
      description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
    validations:
      required: true
  - type: textarea
    attributes:
      label: Describe the solution you'd like to see
      description: A clear and concise description of what you want to happen.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Describe alternate solutions
      description: A clear and concise description of any alternative solutions or features you've considered.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Additional information
      description: Add any other information related to the feature here. If your feature request is related to any issues or discussions, link them here.


================================================
FILE: .github/actions/setup/action.yml
================================================
name: "Setup and install"
description: "Common setup steps for Actions"

runs:
  using: composite
  steps:
    - uses: pnpm/action-setup@v3
    - uses: actions/setup-node@v4
      with:
        node-version: 20
        cache: "pnpm"

    - shell: bash
      run: pnpm install


================================================
FILE: .github/changeset-version.js
================================================
// ORIGINALLY FROM CLOUDFLARE WRANGLER:
// https://github.com/cloudflare/wrangler2/blob/main/.github/changeset-version.js

import { exec } from "child_process";
// This script is used by the `release.yml` workflow to update the version of the packages being released.
// The standard step is only to run `changeset version` but this does not update the package-lock.json file.
// So we also run `npm install`, which does this update.
// This is a workaround until this is handled automatically by `changeset version`.
// See https://github.com/changesets/changesets/issues/421.
exec("npx changeset version");
exec("npm install");


================================================
FILE: .github/labeler.yml
================================================
"📌 area: cli":
  - any: ["cli/**/*"]

"📌 area: t3-app":
  - any: ["cli/template/**/*"]

"📚 documentation":
  - any: ["www/**/*"]
  - any: ["**/*.md"]

"📌 area: ci":
  - any: [".github/**/*"]


================================================
FILE: .github/pull_request_template.md
================================================
Closes #<issue>

## ✅ Checklist

- [ ] I have followed every step in the [contributing guide](https://github.com/t3-oss/create-t3-app/blob/main/CONTRIBUTING.md) (updated 2022-10-06).
- [ ] The PR title follows the convention we established [conventional-commit](https://www.conventionalcommits.org/en/v1.0.0/)
- [ ] I performed a functional test on my final commit

---

## Changelog

_[Short description of what has changed]_

---

## Screenshots

_[Screenshots]_

💯


================================================
FILE: .github/scripts/generate-matrix.js
================================================
// Define all possible values
const options = {
  trpc: ['true', 'false'],
  tailwind: ['true', 'false'],
  nextAuth: ['true', 'false'],
  betterAuth: ['true', 'false'],
  prisma: ['true', 'false'],
  drizzle: ['true', 'false'],
  appRouter: ['true', 'false'],
  dbType: ['planetscale', 'sqlite', 'mysql', 'postgres']
};

// Generate all combinations
function generateCombinations(opts) {
  const keys = Object.keys(opts);
  const combinations = [];

  function recurse(index, current) {
    if (index === keys.length) {
      combinations.push({...current});
      return;
    }

    const key = keys[index];
    for (const value of opts[key]) {
      current[key] = value;
      recurse(index + 1, current);
    }
  }

  recurse(0, {});
  return combinations;
}

// Filter valid combinations based on current validation logic
function isValid(combo) {
  const { prisma, drizzle, nextAuth, betterAuth, dbType } = combo;

  // Not both auth true
  if (nextAuth === 'true' && betterAuth === 'true') return false;

  // Not both db true
  if (prisma === 'true' && drizzle === 'true') return false;

  // If no db selected, only allow sqlite
  if (prisma === 'false' && drizzle === 'false' && dbType !== 'sqlite') return false;

  return true;
}

const allCombos = generateCombinations(options);
const validCombos = allCombos.filter(isValid);

console.log(`matrix=${JSON.stringify({include: validCombos})}`);


================================================
FILE: .github/version-script-beta.js
================================================
// ORIGINALLY FROM CLOUDFLARE WRANGLER:
// https://github.com/cloudflare/wrangler2/blob/main/.github/version-script.js
import fs from "fs";
import { exec } from "child_process";

const pkgJsonPath = "cli/package.json";
try {
  const pkg = JSON.parse(fs.readFileSync(pkgJsonPath));
  exec("git rev-parse --short HEAD", (err, stdout) => {
    if (err) {
      console.log(err);
      process.exit(1);
    }
    const [major, minor, patch] = pkg.version.split(".").map(Number);
    pkg.version = `${major}.${minor}.${patch + 1}-beta.${stdout.trim()}`;
    fs.writeFileSync(pkgJsonPath, JSON.stringify(pkg, null, "\t") + "\n");
  });
} catch (error) {
  console.error(error);
  process.exit(1);
}


================================================
FILE: .github/version-script-next.js
================================================
// ORIGINALLY FROM CLOUDFLARE WRANGLER:
// https://github.com/cloudflare/wrangler2/blob/main/.github/version-script.js
import fs from "fs";
import { exec } from "child_process";

const pkgJsonPath = "cli/package.json";
try {
  const pkg = JSON.parse(fs.readFileSync(pkgJsonPath));
  exec("git rev-parse --short HEAD", (err, stdout) => {
    if (err) {
      console.log(err);
      process.exit(1);
    }
    const [major, minor, patch] = pkg.version.split(".").map(Number);
    pkg.version = `${major}.${minor}.${patch + 1}-next.${stdout.trim()}`;
    fs.writeFileSync(pkgJsonPath, JSON.stringify(pkg, null, "\t") + "\n");
  });
} catch (error) {
  console.error(error);
  process.exit(1);
}


================================================
FILE: .github/workflows/ci.yml
================================================
# this workflow will run on every pr to make sure the project is following the guidelines

# after labeler, run other actions with strict permissions
name: CI

on:
  pull_request:
    branches: ["*"]
  merge_group:

env:
  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
  TURBO_TEAM: ${{ secrets.TURBO_TEAM }}

jobs:
  lint:
    runs-on: ubuntu-latest
    name: Run ESLint
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: ./.github/actions/setup

      - run: pnpm turbo run lint
      - run: pnpm manypkg check

  check-changeset:
    runs-on: ubuntu-latest
    name: Check Changeset
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: ./.github/actions/setup

      - name: Check and Validate Changes in /cli
        run: |
          git fetch origin main:main
          changes=$(git diff --name-only main...${{ github.sha }} | grep '^cli/' || true)
          if [[ -n "$changes" ]]; then
            echo "Changes detected in /cli: $changes"
            pnpm changeset status --since origin/main
            exit_status=$?
            if [[ $exit_status -eq 0 ]]; then
              echo "Changeset validation succeeded."
            else
              echo "Changeset validation failed."
            fi
          else
            echo "No changes detected in /cli"
          fi

  prettier:
    runs-on: ubuntu-latest
    name: Run Prettier
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: ./.github/actions/setup

      - run: pnpm format:check

  tsc:
    runs-on: ubuntu-latest
    name: Run Typechecker
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: ./.github/actions/setup

      - run: pnpm typecheck

  build-www:
    runs-on: ubuntu-latest
    name: Build and Check Astro
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: ./.github/actions/setup

      - run: pnpm run --filter=www check
      - run: pnpm turbo --filter=www build
        # env:
        #   PUBLIC_GITHUB_TOKEN: ${{ secrets.PUBLIC_GITHUB_TOKEN }}


================================================
FILE: .github/workflows/e2e.yml
================================================
# this workflow will run on every pr to make sure the project is following the guidelines

# after labeler, run other actions with strict permissions
name: E2E Tests

on:
  pull_request:
    branches:
      - "*"
    paths:
      - "cli/**/*"
  merge_group:

env:
  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
  TURBO_TEAM: ${{ secrets.TURBO_TEAM }}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

jobs:
  generate-matrix:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.generate.outputs.matrix }}
    steps:
      - uses: actions/checkout@v4
      - name: Generate valid matrix combinations
        id: generate
        run: node .github/scripts/generate-matrix.js >> $GITHUB_OUTPUT

  build-t3-app:
    needs: generate-matrix
    runs-on: ubuntu-latest
    # if: |
    #   contains(github.event.pull_request.labels.*.name, '📌 area: cli') ||
    #   contains(github.event.pull_request.labels.*.name, '📌 area: t3-app')
    strategy:
      matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}

    name: "Build and Start T3 App ${{ matrix.trpc }}-${{ matrix.tailwind }}-${{ matrix.nextAuth }}-${{ matrix.betterAuth }}-${{ matrix.prisma }}-${{ matrix.drizzle}}-${{ matrix.appRouter }}-${{ matrix.dbType }}"
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: ./.github/actions/setup

      - run: pnpm turbo --filter=create-t3-app build

      # has to be scaffolded outside the CLI project so that no lint/tsconfig are leaking
      # through. this way it ensures that it is the app's configs that are being used
      # FIXME: this is a bit hacky, would rather have --packages=trpc,tailwind,... but not sure how to setup the matrix for that
      - run: cd cli && pnpm start ../../ci-${{ matrix.trpc }}-${{ matrix.tailwind }}-${{ matrix.nextAuth }}-${{ matrix.betterAuth }}-${{ matrix.prisma }}-${{ matrix.drizzle}}-${{ matrix.appRouter }}-${{ matrix.dbType }} --noGit --CI --trpc=${{ matrix.trpc }} --tailwind=${{ matrix.tailwind }} --nextAuth=${{ matrix.nextAuth }} --betterAuth=${{ matrix.betterAuth }} --prisma=${{ matrix.prisma }} --drizzle=${{ matrix.drizzle }} --appRouter=${{ matrix.appRouter }} --dbProvider=${{ matrix.dbType }}
        # can't use default mysql string cause t3-env blocks that

      - run: cd ../ci-${{ matrix.trpc }}-${{ matrix.tailwind }}-${{ matrix.nextAuth }}-${{ matrix.betterAuth }}-${{ matrix.prisma }}-${{ matrix.drizzle}}-${{ matrix.appRouter }}-${{ matrix.dbType }} && pnpm build
        env:
          AUTH_SECRET: foo
          AUTH_DISCORD_ID: bar
          AUTH_DISCORD_SECRET: baz
          SKIP_ENV_VALIDATION: true

  check-well-formatted:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        eslint: ["true", "false"]
        biome: ["true", "false"]

    name: "Build and Start T3 App"
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Check valid matrix
        id: matrix-valid
        run: |
          echo "continue=${{ (matrix.eslint == 'false' || matrix.biome == 'false') && (matrix.biome == 'true' || matrix.eslint == 'true') }}" >> $GITHUB_OUTPUT

      - uses: ./.github/actions/setup
        if: ${{ steps.matrix-valid.outputs.continue == 'true' }}

      - run: pnpm turbo --filter=create-t3-app build
        if: ${{ steps.matrix-valid.outputs.continue == 'true' }}

      - run: cd cli && pnpm start ../../ci-format-${{ matrix.eslint }}-${{ matrix.biome }} --noGit --CI --trpc --tailwind --nextAuth  --drizzle --appRouter --dbProvider=postgres --eslint=${{ matrix.eslint }} --biome=${{ matrix.biome }}
        if: ${{ steps.matrix-valid.outputs.continue == 'true' }}

      - run: cd ../ci-format-${{ matrix.eslint }}-${{ matrix.biome }} && pnpm build
        if: ${{ steps.matrix-valid.outputs.continue == 'true' }}
        env:
          AUTH_SECRET: foo
          AUTH_DISCORD_ID: bar
          AUTH_DISCORD_SECRET: baz
          SKIP_ENV_VALIDATION: true

      # Run biome check
      - run: cd ../ci-format-${{ matrix.eslint }}-${{ matrix.biome }} && pnpm check
        if: ${{ steps.matrix-valid.outputs.continue == 'true' && matrix.biome == 'true' }}

      # Check linting and formatting with eslint and prettier
      - run: cd ../ci-format-${{ matrix.eslint }}-${{ matrix.biome }} && pnpm lint && pnpm format:check
        if: ${{ steps.matrix-valid.outputs.continue == 'true' && matrix.eslint == 'true' }}
        env:
          AUTH_SECRET: foo
          AUTH_DISCORD_ID: bar
          AUTH_DISCORD_SECRET: baz
          SKIP_ENV_VALIDATION: true

  build-t3-app-with-bun:
    runs-on: ubuntu-latest

    name: "Build and Start T3 App with Bun"
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

      # First install everything and build the CLI with Node
      - uses: ./.github/actions/setup
      - run: pnpm turbo --filter=create-t3-app build

      # Then, run the CLI and build the generated app with Bun
      # Let's just build a full app with Bun, we don't need the matrix here
      - uses: oven-sh/setup-bun@v1
        with:
          bun-version: latest

      - run: cd cli && bun run dist/index.js ../../ci-bun --default

      - name: We should have a Bun lockfile
        run: |
          if [ ! -f "../ci-bun/bun.lock" ]; then
            echo "Bun lockfile not found"
            exit 1
          fi

      # FIXME: This doesn't actually run the build script using bun, since Next.js doesn't support it yet.
      # But you should still be able to use `bun` as a package manager for any Next.js app.
      # If/When Next.js supports it, we should be able to run `bun --bun run build` here to override any Node binaries.
      # See: https://bun.sh/docs/cli/bunx#shebangs
      - run: cd ../ci-bun && bun run build
        # - run: cd ../ci-bun && bun --bun run build
        env:
          AUTH_SECRET: foo
          AUTH_DISCORD_ID: bar
          AUTH_DISCORD_SECRET: baz
          DATABASE_URL: mysql://root:root@localhost:3306/test # can't use url from example env cause we block that in t3-env


================================================
FILE: .github/workflows/pr-labeler.yml
================================================
# this workflow will run on every pr to make sure the project is following the guidelines

# run labeler with elevated permissions before other actions

name: PR Checks

on:
  pull_request_target:
    branches: ["*"]
    types: ["opened", "edited", "synchronize"]

jobs:
  lint-pr-title:
    runs-on: ubuntu-latest
    name: Validate PR Title
    steps:
      - uses: amannn/action-semantic-pull-request@v5
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  labeler:
    name: Label PR
    permissions:
      contents: read
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
      - uses: actions/labeler@v5
        with:
          repo-token: "${{ secrets.GITHUB_TOKEN }}"
          sync-labels: true


================================================
FILE: .github/workflows/prerelease-comment.yml
================================================
name: Write Beta Release comment

on:
  workflow_run:
    workflows: ["Release - Beta"]
    types:
      - completed

jobs:
  comment:
    if: |
      github.repository_owner == 't3-oss' &&
      ${{ github.event.workflow_run.conclusion == 'success' }}
    runs-on: ubuntu-latest
    name: Write comment to the PR
    steps:
      - name: "Comment on PR"
        uses: actions/github-script@v7
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
              owner: context.repo.owner,
              repo: context.repo.repo,
              run_id: context.payload.workflow_run.id,
            });

            for (const artifact of allArtifacts.data.artifacts) {
              // Extract the PR number and package version from the artifact name
              const match = /^npm-package-create-t3-app@(.*?)-pr-(\d+)/.exec(artifact.name);
              
              if (match) {
                require("fs").appendFileSync(
                  process.env.GITHUB_ENV,
                  `\nBETA_PACKAGE_VERSION=${match[1]}` +
                  `\nWORKFLOW_RUN_PR=${match[2]}` +
                  `\nWORKFLOW_RUN_ID=${context.payload.workflow_run.id}`
                );
                break;
              }
            }

      - name: "Comment on PR with Link"
        uses: marocchino/sticky-pull-request-comment@v2
        with:
          number: ${{ env.WORKFLOW_RUN_PR }}
          message: |
            A new create-t3-app prerelease is available for testing. You can install this latest build in your project with:

            ```sh
            pnpm create t3-app@${{ env.BETA_PACKAGE_VERSION }}
            ```

      - name: "Remove the autorelease label once published"
        uses: actions/github-script@v7
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            github.rest.issues.removeLabel({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: ${{ env.WORKFLOW_RUN_PR }},
              name: '🚀 autorelease',
            });


================================================
FILE: .github/workflows/prerelease.yml
================================================
# Originally inspired by Cloudflare Wrangler
# https://github.com/cloudflare/wrangler2/blob/main/.github/workflows/prereleases.yml

name: Release - Beta

on:
  pull_request:
    types: [labeled]
    branches:
      - main
jobs:
  prerelease:
    if: |
      github.repository_owner == 't3-oss' &&
      contains(github.event.pull_request.labels.*.name, '🚀 autorelease')
    name: Build & Publish a beta release to NPM
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: ./.github/actions/setup

      - name: Modify package.json version
        run: node .github/version-script-beta.js

      - name: Authenticate to NPM
        run: echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_ACCESS_TOKEN }}" > cli/.npmrc

      - name: Publish Beta to NPM
        run: pnpm pub:beta
        env:
          NPM_PUBLISH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }}

      - name: get-npm-version
        id: package-version
        uses: martinbeentjes/npm-get-version-action@main
        with:
          path: cli

      - name: Upload packaged artifact
        uses: actions/upload-artifact@v4
        with:
          name: npm-package-create-t3-app@${{ steps.package-version.outputs.current-version }}-pr-${{ github.event.number }} # encode the PR number into the artifact name
          path: cli/dist/index.js


================================================
FILE: .github/workflows/release.yml
================================================
# Originally inspired by Cloudflare Wrangler
# https://github.com/cloudflare/wrangler2/blob/main/.github/workflows/release.yml

name: Release

on:
  push:
    branches:
      - main

jobs:
  release:
    if: ${{ github.repository_owner == 't3-oss' }}
    permissions:
      contents: write # to create release (changesets/action)
      id-token: write # OpenID Connect token needed for provenance
      pull-requests: write # to create pull request (changesets/action)
    name: Create a PR for release workflow
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: ./.github/actions/setup

      - name: Check for errors
        run: pnpm check

      - name: Build the package
        run: pnpm build:cli

      - name: Create Version PR or Publish to NPM
        id: changesets
        uses: changesets/action@v1
        with:
          commit: "chore(release): version packages"
          title: "chore(release): version packages"
          version: node .github/changeset-version.js
          publish: npx changeset publish
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NPM_CONFIG_PROVENANCE: true
          NPM_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }}
          NODE_ENV: "production"


================================================
FILE: .github/workflows/translations.yml
================================================
name: "Notify codeowners about changes in docs"

on:
  pull_request_target:
    types: [opened, edited, synchronize]
    branches:
      - "*"
    paths:
      - "www/src/pages/**"
      - "!www/src/pages/en/**"

jobs:
  notify-codeowners:
    if: |
      github.repository_owner == 't3-oss'
    runs-on: ubuntu-latest
    steps:
      - name: Parse changed files and write to env
        uses: actions/github-script@v7
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const changedFiles = (await github.rest.pulls.listFiles({
              owner: "t3-oss",
              repo: "create-t3-app",
              pull_number: context.payload.number,
            })).data.map(file => file.filename);

            const changedLanguages = [
              ...new Set(
                changedFiles
                  .filter((file) => file.startsWith("www/src/pages/"))
                  .map((file) => file.split("/")[3])
                  .filter((file) => file !== "en"),
              ),
            ];

            const CODEOWNERS = {
              ar: ["a4addel", "Sboonny"],
              fr: ["Defranos", "joachimjusth", "vdeva"],
              ja: ["t6adev", "uehaj"],
              no: ["estubmo", "josephayman"],
              pl: ["matibox", "Infiplaya", "PiotrekPKP"],
              pt: ["minsk-dev", "Sn0wye", "victoriaquasar", "MattFerreira18", "gilhrpenner"],
              ru: ["AmadeusTwi", "ronanru", "JohnBakhmat"],
              uk: ["pqoqubbw"],
              "zh-hans": ["fernandoxu", "escwxyz"],
            };

            console.log("Changed languages:", changedLanguages)

            const formattedString = changedLanguages
              .map(
                (lang) =>
                  `${lang.toUpperCase()}: ${(CODEOWNERS[lang] || []).map((user) => `@${user}`).join(", ")}`,
              )
              .join("  |  "); // cause we can't linebreak in env vars

            console.log("Formatted string:", formattedString)

            require("fs").appendFileSync(
              process.env.GITHUB_ENV,
              `\nCODEOWNERS=${formattedString}`,
            );

      - name: Write comment on the PR tagging codeowners
        uses: marocchino/sticky-pull-request-comment@v2
        with:
          number: ${{ env.WORKFLOW_RUN_PR }}
          message: |
            Hey t3-oss/translators! 

            This PR contains changes to your language. Please review the changes ❤️.

            ${{ env.CODEOWNERS }}


================================================
FILE: .gitignore
================================================
### STANDARD GIT IGNORE FILE ###

# DEPENDENCIES
node_modules/
/.pnp
.pnp.js
package-lock.json
yarn.lock

# TESTING
/coverage
*.lcov
.nyc_output

# BUILD
build/
public/build/
dist/
generated/
.astro

# ENV FILES
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

# LOGS
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# MISC
.idea
.cache/
.next/
next-env.d.ts
.nuxt/
tmp/
temp/
.docusaurus
*.tsbuildinfo

# MAC
._*
.DS_Store
Thumbs.db

.turbo
.vercel

# Emacs backup files
\#*
.\#*

# TYPESCRIPT
*.tsbuildinfo


================================================
FILE: .gitpod.yml
================================================
tasks:
  - init: pnpm install
vscode:
  extensions:
    - astro-build.astro-vscode
    - bradlc.vscode-tailwindcss

================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": [
    "esbenp.prettier-vscode",
    "dbaeumer.vscode-eslint",
    "astro-build.astro-vscode",
    "bradlc.vscode-tailwindcss",
    "unifiedjs.vscode-mdx",
    "yoavbls.pretty-ts-errors"
  ]
}


================================================
FILE: .vscode/settings.json
================================================
{
  "workbench.colorCustomizations": {
    "titleBar.activeBackground": "#1f0d49",
    "titleBar.activeForeground": "#e2e8f0",
    "titleBar.inactiveBackground": "#181239",
    "titleBar.inactiveForeground": "#b1b6bd"
  },

  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"
  },
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnSave": true,
  "editor.rulers": [100],
  "editor.tabSize": 2,
  "editor.quickSuggestions": {
    "strings": true
  },

  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "astro",
    "typescript",
    "typescriptreact"
  ],
  "eslint.workingDirectories": ["cli", "upgrade", "www"],

  "eslint.rules.customizations": [{ "rule": "*", "severity": "warn" }],
  "typescript.tsdk": "node_modules/typescript/lib",
  "prettier.documentSelectors": [
    "**/*.{cjs,mjs,ts,tsx,astro,md,mdx,json,yaml,yml}"
  ],
  "mdx.experimentalLanguageServer": true,
  "[astro]": {
    "editor.defaultFormatter": "astro-build.astro-vscode"
  },
  "[prisma]": {
    "editor.defaultFormatter": "Prisma.prisma"
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  }
}


================================================
FILE: CONTRIBUTING.md
================================================
# Contribution Guidelines

When contributing to `create-t3-app`, whether on GitHub or in other community spaces:

- Be respectful, civil, and open-minded.
- Before opening a new pull request, try searching through the [issue tracker](https://github.com/t3-oss/create-t3-app/issues) for known issues or fixes.
- If you want to make code changes based on your personal opinion(s), make sure you open an issue first describing the changes you want to make, and open a pull request only when your suggestions get approved by maintainers.

## How to Contribute

### Prerequisites

In order to not waste your time implementing a change that has already been declined, or is generally not needed, start by [opening an issue](https://github.com/t3-oss/create-t3-app/issues/new/choose) describing the problem you would like to solve.

### Contributing via Codesandbox

You can contribute to this documentation on codesandbox which will automatically run all the setup command for you. [![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/github/t3-oss/create-t3-app).

### Setup your environment locally

_Some commands will assume you have the Github CLI installed, if you haven't, consider [installing it](https://github.com/cli/cli#installation), but you can always use the Web UI if you prefer that instead._

In order to contribute to this project, you will need to fork the repository:

```bash
gh repo fork t3-oss/create-t3-app
```

then, clone it to your local machine:

```bash
gh repo clone <your-github-name>/create-t3-app
```

This project uses [pnpm](https://pnpm.io) as its package manager. Install it if you haven't already:

```bash
npm install -g pnpm
```

Then, install the project's dependencies:

```bash
pnpm install
```

### Implement your changes

This project is a [Turborepo](https://turborepo.org/) monorepo. The code for the CLI is in the `cli` directory, and the docs is in the `www` directory. Now you're all setup and can start implementing your changes.

Here are some useful scripts for when you are developing:

| Command          | Description                                             |
| ---------------- | ------------------------------------------------------- |
| `pnpm dev:cli`   | Builds and starts the CLI in watch-mode                 |
| `pnpm dev:www`   | Starts the development server for the docs with HMR     |
| `pnpm build:cli` | Builds the CLI                                          |
| `pnpm build:www` | Builds the docs                                         |
| `pnpm build`     | Builds CLI and docs                                     |
| `pnpm format`    | Formats the code                                        |
| `pnpm lint`      | Lints the code                                          |
| `pnpm lint:fix`  | Lints the code and fixes any errors                     |
| `pnpm check`     | Checks your code for typeerrors, formatting and linting |

When making commits, make sure to follow the [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) guidelines, i.e. prepending the message with `feat:`, `fix:`, `chore:`, `docs:`, etc... You can use `git status` to double check which files have not yet been staged for commit:

```bash
git add <file> && git commit -m "feat/fix/chore/docs: commit message"
```

### When you're done

Check that your code follows the project's style guidelines by running:

```bash
pnpm check
```

Please also make a manual, functional test of your changes.

If your change should appear in the changelog, i.e. it changes some behavior of either the CLI or the outputted application, it must be captured by `changeset` which is done by running

```bash
pnpm changeset
```

and filling out the form with the appropriate information. Then, add the generated changeset to git:

```bash
git add .changeset/*.md && git commit -m "chore: add changeset"
```

When all that's done, it's time to file a pull request to upstream:

```bash
gh pr create --web
```

and fill out the title and body appropriately. Again, make sure to follow the [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) guidelines for your title.

## Translations

For more information on how to help with translation, please see the [contributing guidelines for our docs](https://github.com/t3-oss/create-t3-app/blob/main/www/TRANSLATIONS.md).

## Credits

This documented was inspired by the contributing guidelines for [cloudflare/wrangler2](https://github.com/cloudflare/wrangler2/blob/main/CONTRIBUTING.md).


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2022 Shoubhit Dash

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: cli/.yarnrc.yml
================================================
packageExtensions:
  chalk@5.0.1:
    dependencies:
      "#ansi-styles": npm:ansi-styles@6.1.0
      "#supports-color": npm:supports-color@9.2.2


================================================
FILE: cli/CHANGELOG.md
================================================
# Changelog

## 7.38.1

### Patch Changes

- [#2010](https://github.com/t3-oss/create-t3-app/pull/2010) [`12fccae15d08bc11168fe6b462d978a6787b5c7c`](https://github.com/t3-oss/create-t3-app/commit/12fccae15d08bc11168fe6b462d978a6787b5c7c) Thanks [@swyckoff](https://github.com/swyckoff)! - Added an import for crypto in the cli envVars.ts to support older node versions.

## 7.38.0

### Minor Changes

- [#2000](https://github.com/t3-oss/create-t3-app/pull/2000) [`41de302b5a76966741d1dc270ba5da27064f82e8`](https://github.com/t3-oss/create-t3-app/commit/41de302b5a76966741d1dc270ba5da27064f82e8) Thanks [@ronanru](https://github.com/ronanru)! - update to next.js 15 and next-auth v5

- [#2002](https://github.com/t3-oss/create-t3-app/pull/2002) [`54b66484692b76d325f59dc233eb27e0aee59af2`](https://github.com/t3-oss/create-t3-app/commit/54b66484692b76d325f59dc233eb27e0aee59af2) Thanks [@devotoare](https://github.com/devotoare)! - Change drizzle with PostgresQL to use identity columns

### Patch Changes

- [#1969](https://github.com/t3-oss/create-t3-app/pull/1969) [`e08dbe307b4e37c7cc7e0cbf6243c008771ef4f8`](https://github.com/t3-oss/create-t3-app/commit/e08dbe307b4e37c7cc7e0cbf6243c008771ef4f8) Thanks [@Guria](https://github.com/Guria)! - fix issue with prefetch protected procedure in auth templates

- [#1997](https://github.com/t3-oss/create-t3-app/pull/1997) [`fe85a233c62af607e8a39bf5ca1b2358d43c6587`](https://github.com/t3-oss/create-t3-app/commit/fe85a233c62af607e8a39bf5ca1b2358d43c6587) Thanks [@programming-with-ia](https://github.com/programming-with-ia)! - Add more scripts in `package.json`

- [#1975](https://github.com/t3-oss/create-t3-app/pull/1975) [`78cb06f99f15f4f4f90b57e3545f1dc0b222eaf3`](https://github.com/t3-oss/create-t3-app/commit/78cb06f99f15f4f4f90b57e3545f1dc0b222eaf3) Thanks [@0pilatos0](https://github.com/0pilatos0)! - Resolved issue where database startup script did not check for docker daemon being up and running

## 7.37.0

### Minor Changes

- [#1936](https://github.com/t3-oss/create-t3-app/pull/1936) [`2d1878e53767e35ab4b22a37622fbf0d5fdb4da7`](https://github.com/t3-oss/create-t3-app/commit/2d1878e53767e35ab4b22a37622fbf0d5fdb4da7) Thanks [@JoshuaKGoldberg](https://github.com/JoshuaKGoldberg)! - upgrade to typescript eslint v8

- [#1936](https://github.com/t3-oss/create-t3-app/pull/1936) [`2d1878e53767e35ab4b22a37622fbf0d5fdb4da7`](https://github.com/t3-oss/create-t3-app/commit/2d1878e53767e35ab4b22a37622fbf0d5fdb4da7) Thanks [@JoshuaKGoldberg](https://github.com/JoshuaKGoldberg)! - upgrade to drizzle-orm@0.33 and corresponding drizzle-kit version

### Patch Changes

- [#1954](https://github.com/t3-oss/create-t3-app/pull/1954) [`f9f96d069af87d4372dc917e3625409859e4e615`](https://github.com/t3-oss/create-t3-app/commit/f9f96d069af87d4372dc917e3625409859e4e615) Thanks [@ronanru](https://github.com/ronanru)! - fix typo

## 7.36.2

### Patch Changes

- [#1945](https://github.com/t3-oss/create-t3-app/pull/1945) [`9eea9fb5f6d26d42944a660bfcee5f7fb33438ad`](https://github.com/t3-oss/create-t3-app/commit/9eea9fb5f6d26d42944a660bfcee5f7fb33438ad) Thanks [@datasalaryman](https://github.com/datasalaryman)! - resolve client error during getLatest trpc call

- [#1948](https://github.com/t3-oss/create-t3-app/pull/1948) [`3a1b94d29a3addc783e2d6645c2e88a5b7273174`](https://github.com/t3-oss/create-t3-app/commit/3a1b94d29a3addc783e2d6645c2e88a5b7273174) Thanks [@keyding](https://github.com/keyding)! - Update seed.ts in prisma in documentation

- [#1940](https://github.com/t3-oss/create-t3-app/pull/1940) [`46a4e2d144da8b184bf39444b19e0b1bd00bab2b`](https://github.com/t3-oss/create-t3-app/commit/46a4e2d144da8b184bf39444b19e0b1bd00bab2b) Thanks [@KrishanGoyal1](https://github.com/KrishanGoyal1)! - changed default password error message for `start-database` script

## 7.36.1

### Patch Changes

- [#1937](https://github.com/t3-oss/create-t3-app/pull/1937) [`5a0cbc53afb8597d6da2bc6d184ea1427e741cec`](https://github.com/t3-oss/create-t3-app/commit/5a0cbc53afb8597d6da2bc6d184ea1427e741cec) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - chore: dependency bumps

## 7.36.0

### Minor Changes

- [#1932](https://github.com/t3-oss/create-t3-app/pull/1932) [`42a485a29370fbfe4f03e5f756d97c0fee0b09e8`](https://github.com/t3-oss/create-t3-app/commit/42a485a29370fbfe4f03e5f756d97c0fee0b09e8) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat: add trpc rsc prefetching

### Patch Changes

- [#1934](https://github.com/t3-oss/create-t3-app/pull/1934) [`1cfbb117c892905ea956a597aa6d48e9984b1190`](https://github.com/t3-oss/create-t3-app/commit/1cfbb117c892905ea956a597aa6d48e9984b1190) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - remove duplicate `<main>` tags

- [#1931](https://github.com/t3-oss/create-t3-app/pull/1931) [`a1a4b8707b95b82e755733b2853ac595bb9d4829`](https://github.com/t3-oss/create-t3-app/commit/a1a4b8707b95b82e755733b2853ac595bb9d4829) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix: unify drizlze schema and fix sqlite timestamps

## 7.35.0

### Minor Changes

- [#1905](https://github.com/t3-oss/create-t3-app/pull/1905) [`b22e2e10d005689faa7b1db771a217b59c88635f`](https://github.com/t3-oss/create-t3-app/commit/b22e2e10d005689faa7b1db771a217b59c88635f) Thanks [@jessedelira](https://github.com/jessedelira)! - Add .idea to .gitignore

### Patch Changes

- [#1909](https://github.com/t3-oss/create-t3-app/pull/1909) [`f69fa29733d3bd0d6e5043d1200e250a938b6335`](https://github.com/t3-oss/create-t3-app/commit/f69fa29733d3bd0d6e5043d1200e250a938b6335) Thanks [@TheDevilOnLine](https://github.com/TheDevilOnLine)! - fix: Added $defaultFn to the user table's id field when using Drizzle to fix #1906

## 7.34.0

### Minor Changes

- [#1893](https://github.com/t3-oss/create-t3-app/pull/1893) [`1925236bcfcafc6c490319ab5f07b2a698e88ef5`](https://github.com/t3-oss/create-t3-app/commit/1925236bcfcafc6c490319ab5f07b2a698e88ef5) Thanks [@brandon93s](https://github.com/brandon93s)! - Add `db:generate` and `db:migrate` scripts to drizzle and prisma installers

### Patch Changes

- [#1891](https://github.com/t3-oss/create-t3-app/pull/1891) [`4236f0dfa969ff0d8b7ce2a60b5595c43ced9043`](https://github.com/t3-oss/create-t3-app/commit/4236f0dfa969ff0d8b7ce2a60b5595c43ced9043) Thanks [@thecmdrunner](https://github.com/thecmdrunner)! - Apply drizzle rules for `ctx.db` object in tRPC context

## 7.33.1

### Patch Changes

- [#1884](https://github.com/t3-oss/create-t3-app/pull/1884) [`f148deb`](https://github.com/t3-oss/create-t3-app/commit/f148debf74e16b61dae89c684fbc9ac1d97ac2c8) Thanks [@Irere123](https://github.com/Irere123)! - fix: remove deprecated push command in drizzle package.json scripts (…
  )

## 7.33.0

### Minor Changes

- [#1821](https://github.com/t3-oss/create-t3-app/pull/1821) [`4de1927`](https://github.com/t3-oss/create-t3-app/commit/4de1927489aa2d0cf61313ea1543f85268c0e645) Thanks [@kakeWasTaken](https://github.com/kakeWasTaken)! - change default font from Inter to Geist Sans

### Patch Changes

- [#1881](https://github.com/t3-oss/create-t3-app/pull/1881) [`9e5e7d0`](https://github.com/t3-oss/create-t3-app/commit/9e5e7d0c4342542fec18fdc97552b494fe31f5a3) Thanks [@gcjbr](https://github.com/gcjbr)! - chore: update `drizzle-kit` to `0.21.0`

## 7.32.1

### Patch Changes

- [#1867](https://github.com/t3-oss/create-t3-app/pull/1867) [`304a67f`](https://github.com/t3-oss/create-t3-app/commit/304a67f5bde05116b143c86588546af02e86cfda) Thanks [@xelacast](https://github.com/xelacast)! - Parsed --dbprovider flag correctly and added related error message

- [#1860](https://github.com/t3-oss/create-t3-app/pull/1860) [`b5ced34`](https://github.com/t3-oss/create-t3-app/commit/b5ced343f8a7fbc889a113ec05bef6c5e550cd55) Thanks [@victor-falcon](https://github.com/victor-falcon)! - Load PORT in start-database script

- [#1871](https://github.com/t3-oss/create-t3-app/pull/1871) [`f29a69f`](https://github.com/t3-oss/create-t3-app/commit/f29a69fcc300db539fe0cfa9f52858551e89b869) Thanks [@xelacast](https://github.com/xelacast)! - Fixed project creation of . bug in ./start-database.sh

- [#1858](https://github.com/t3-oss/create-t3-app/pull/1858) [`29348b6`](https://github.com/t3-oss/create-t3-app/commit/29348b6b4f11d7f19915be6639e3c5aaa27b8907) Thanks [@lcabraja](https://github.com/lcabraja)! - Added drizzle's db.sqlite location to .gitignore

## 7.32.0

### Minor Changes

- [#1842](https://github.com/t3-oss/create-t3-app/pull/1842) [`088a773`](https://github.com/t3-oss/create-t3-app/commit/088a773103a03e0ec34cbe22329ead33cd80c5ff) Thanks [@nick22985](https://github.com/nick22985)! - Infers tRPC input & output types to the client for app router

- [#1841](https://github.com/t3-oss/create-t3-app/pull/1841) [`41bd524`](https://github.com/t3-oss/create-t3-app/commit/41bd5240276f1029633cde588b0ca08301c4e78c) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - mark app router as stable

### Patch Changes

- [#1838](https://github.com/t3-oss/create-t3-app/pull/1838) [`ff886b3`](https://github.com/t3-oss/create-t3-app/commit/ff886b3fed4b193b8fc85882a71c7e8085457cf0) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - bump zod and t3-env

## 7.31.0

### Minor Changes

- [#1830](https://github.com/t3-oss/create-t3-app/pull/1830) [`3257d0a`](https://github.com/t3-oss/create-t3-app/commit/3257d0a2fe73847b501bdf36f09053638b4a41a4) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat: replace better-sqlite3 with libsql

### Patch Changes

- [`ab5fa95`](https://github.com/t3-oss/create-t3-app/commit/ab5fa95afce2a0feb8567aed6bb02beeef1401e5) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - chore: pin zod version

- [#1835](https://github.com/t3-oss/create-t3-app/pull/1835) [`f66e30a`](https://github.com/t3-oss/create-t3-app/commit/f66e30a0c84eb4f74182d79b23e3c5e900788e10) Thanks [@Inshiku-Han](https://github.com/Inshiku-Han)! - Only install @trpc/next when router style is page router

## 7.30.2

### Patch Changes

- [#1817](https://github.com/t3-oss/create-t3-app/pull/1817) [`d49300a`](https://github.com/t3-oss/create-t3-app/commit/d49300a4230835f6a771ed1a6b759c61c8902d7e) Thanks [@kxzazz](https://github.com/kxzazz)! - fix: `start-database.sh` is marked optional

- [#1823](https://github.com/t3-oss/create-t3-app/pull/1823) [`f5c5db9`](https://github.com/t3-oss/create-t3-app/commit/f5c5db99dbd86010369b26e55dd65973ccd0db05) Thanks [@t3dotgg](https://github.com/t3dotgg)! - chore: update next to 14.2.1

## 7.30.1

### Patch Changes

- [#1802](https://github.com/t3-oss/create-t3-app/pull/1802) [`41380d1`](https://github.com/t3-oss/create-t3-app/commit/41380d1cbf29418c3d60a2dcefd3eaf3f7e7bc28) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - fix: non planetscale env.js refers to YOUR_MYSQL_URL_HERE

- [#1808](https://github.com/t3-oss/create-t3-app/pull/1808) [`fedd7b3`](https://github.com/t3-oss/create-t3-app/commit/fedd7b3926540fdf3137f327cac917237a438943) Thanks [@thecmdrunner](https://github.com/thecmdrunner)! - Apply drizzle-orm lint rules for `db` keyword only

## 7.30.0

### Minor Changes

- [#1741](https://github.com/t3-oss/create-t3-app/pull/1741) [`5de586d`](https://github.com/t3-oss/create-t3-app/commit/5de586da1933064c9eef84ddae47d795e71afc53) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat: use trpc 11

## 7.29.0

### Minor Changes

- [#1785](https://github.com/t3-oss/create-t3-app/pull/1785) [`57dc6ab`](https://github.com/t3-oss/create-t3-app/commit/57dc6ab0625d7cd56bf8f6b5c4d3b844421ffe48) Thanks [@thecmdrunner](https://github.com/thecmdrunner)! - Include ESLlint rules for `drizzle-orm`.

- [#1794](https://github.com/t3-oss/create-t3-app/pull/1794) [`3cca996`](https://github.com/t3-oss/create-t3-app/commit/3cca9965739d29cc010e586406d40fff471a9bed) Thanks [@thecmdrunner](https://github.com/thecmdrunner)! - Use portable shebangs in scripts for nix systems

## 7.28.0

### Minor Changes

- [#1777](https://github.com/t3-oss/create-t3-app/pull/1777) [`640a0e0`](https://github.com/t3-oss/create-t3-app/commit/640a0e086d1515f4f88315d3295b44296fe7bbd0) Thanks [@limegorilla](https://github.com/limegorilla)! - Warning about planetscale's serverless driver now only shown if using mySQL

### Patch Changes

- [#1778](https://github.com/t3-oss/create-t3-app/pull/1778) [`01badfb`](https://github.com/t3-oss/create-t3-app/commit/01badfb38caec5d0d211d7f93c6e288d55f2a751) Thanks [@DerTimonius](https://github.com/DerTimonius)! - fix: add missing default font in pagesDir

- [#1766](https://github.com/t3-oss/create-t3-app/pull/1766) [`d7695df`](https://github.com/t3-oss/create-t3-app/commit/d7695df89a77ea5add1d703b63b9aeda5b5ef0c5) Thanks [@fuegoio](https://github.com/fuegoio)! - fix: cache database connection during development to prevent `Too many connections` due to HMR

## 7.27.0

### Minor Changes

- [#1773](https://github.com/t3-oss/create-t3-app/pull/1773) [`8f29eb9`](https://github.com/t3-oss/create-t3-app/commit/8f29eb990ccbc36c018ce596d2de0205b3c7edac) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat(prisma): support correct typings when using `.extends()`

### Patch Changes

- [#1774](https://github.com/t3-oss/create-t3-app/pull/1774) [`0418663`](https://github.com/t3-oss/create-t3-app/commit/0418663ec6cc370ed1e067f1ef68f0d5ca41af53) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - chore: update drizzle-orm

- [#1763](https://github.com/t3-oss/create-t3-app/pull/1763) [`836fccf`](https://github.com/t3-oss/create-t3-app/commit/836fccf22dc224e283a764649c16090e4ba42b18) Thanks [@skullface](https://github.com/skullface)! - fix: correct casing of “PlanetScale”

- [#1764](https://github.com/t3-oss/create-t3-app/pull/1764) [`79e361c`](https://github.com/t3-oss/create-t3-app/commit/79e361cfd8ad0740a353c7712cad8d38cbc8ee7b) Thanks [@vlxm](https://github.com/vlxm)! - fix: fix password substitution in start-database scripts

- [#1769](https://github.com/t3-oss/create-t3-app/pull/1769) [`c944c49`](https://github.com/t3-oss/create-t3-app/commit/c944c490522a3fb921d564ab55eecd8c535142c3) Thanks [@jhamill34](https://github.com/jhamill34)! - fix: generated comments in env file

- [#1772](https://github.com/t3-oss/create-t3-app/pull/1772) [`c3c4710`](https://github.com/t3-oss/create-t3-app/commit/c3c4710b2e7e6245c0afae45e1a5119d91cb9578) Thanks [@mladenovic-13](https://github.com/mladenovic-13)! - fix: use singleton pattern for client-side QueryClient to support `useSuspenseQuery` when there is no parent `<Suspense>`-element

- [#1748](https://github.com/t3-oss/create-t3-app/pull/1748) [`17c2a5e`](https://github.com/t3-oss/create-t3-app/commit/17c2a5eb52a7faff7ea9e1d1a6270c2216235ff2) Thanks [@aaronmallen](https://github.com/aaronmallen)! - add missing `pg` dev dependency when using postgres drizzle option, required for `drizzle-studio`

## 7.26.0

### Minor Changes

- [#1622](https://github.com/t3-oss/create-t3-app/pull/1622) [`06b1bca`](https://github.com/t3-oss/create-t3-app/commit/06b1bcafe8751a0fc3cfb7992dfb12cb88bf0234) Thanks [@ronanru](https://github.com/ronanru)! - add more db options

## 7.25.2

### Patch Changes

- [#1723](https://github.com/t3-oss/create-t3-app/pull/1723) [`c116281`](https://github.com/t3-oss/create-t3-app/commit/c116281f3626ae5f05191037789d7338a8fa2e5c) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix: don't pass cookies to CC

- [#1728](https://github.com/t3-oss/create-t3-app/pull/1728) [`06ec5b3`](https://github.com/t3-oss/create-t3-app/commit/06ec5b37784c305d18a775b64d34cecb5de45bf2) Thanks [@Nsttt](https://github.com/Nsttt)! - fix missuse of binary expressions

## 7.25.1

### Patch Changes

- [#1713](https://github.com/t3-oss/create-t3-app/pull/1713) [`e34b082`](https://github.com/t3-oss/create-t3-app/commit/e34b08245cc3c1288f90b289577e7c18b37acb1c) Thanks [@daikiejp](https://github.com/daikiejp)! - remove unused @types/inquirer

- [#1703](https://github.com/t3-oss/create-t3-app/pull/1703) [`b6ccded`](https://github.com/t3-oss/create-t3-app/commit/b6ccdedd11b22b64e7bb6f1c55997362fa2915a4) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - update eslint setup for next 14.0.4

- [#1714](https://github.com/t3-oss/create-t3-app/pull/1714) [`ba352ef`](https://github.com/t3-oss/create-t3-app/commit/ba352ef73823eb6413cf251bd7111db6fcb3a585) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - chore: update drizzle dep to remove invalid expo peerDep

- [#1707](https://github.com/t3-oss/create-t3-app/pull/1707) [`26efe48`](https://github.com/t3-oss/create-t3-app/commit/26efe482bdcb309796a2bf207c50ebc844233106) Thanks [@esize](https://github.com/esize)! - chore: update drizzle-orm and drizzle-kit

- [#1708](https://github.com/t3-oss/create-t3-app/pull/1708) [`8f379b4`](https://github.com/t3-oss/create-t3-app/commit/8f379b4df75e56b98973aabcc2097b62be80d0c7) Thanks [@KATT](https://github.com/KATT)! - chore: drop `t.middleware()`

## 7.25.0

### Minor Changes

- [#1702](https://github.com/t3-oss/create-t3-app/pull/1702) [`62fa8dc`](https://github.com/t3-oss/create-t3-app/commit/62fa8dcad2e0d3d6bad04bb6167d7580a754049c) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - update drizzle-kit and change connectionString to uri

### Patch Changes

- [#1690](https://github.com/t3-oss/create-t3-app/pull/1690) [`6efb99a`](https://github.com/t3-oss/create-t3-app/commit/6efb99a94f29d28243fa7c625b099995e84e4db2) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - fix typo in env.mjs

## 7.24.2

### Patch Changes

- [#1687](https://github.com/t3-oss/create-t3-app/pull/1687) [`6461090`](https://github.com/t3-oss/create-t3-app/commit/6461090a029dd2094065493e513a289a1b414673) Thanks [@sinasab](https://github.com/sinasab)! - chore: reuse existing AppRouter type #1687

## 7.24.1

### Patch Changes

- [#1673](https://github.com/t3-oss/create-t3-app/pull/1673) [`b80188e`](https://github.com/t3-oss/create-t3-app/commit/b80188eaecc64e564909ed7ee566790f5e56e59f) Thanks [@ahkhanjani](https://github.com/ahkhanjani)! - fix: Use the correct types for `prettier-plugin-tailwindcss`

## 7.24.0

### Minor Changes

- [#1670](https://github.com/t3-oss/create-t3-app/pull/1670) [`32e0747`](https://github.com/t3-oss/create-t3-app/commit/32e0747a027be16cc36ad5bead062eea696e4012) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat: trpc server caller without http

### Patch Changes

- [#1661](https://github.com/t3-oss/create-t3-app/pull/1661) [`ef8f99f`](https://github.com/t3-oss/create-t3-app/commit/ef8f99f65443e48284bc54699eeddc9d10c43a8c) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - update sharp

- [#1667](https://github.com/t3-oss/create-t3-app/pull/1667) [`43cc10b`](https://github.com/t3-oss/create-t3-app/commit/43cc10b0e4ddd6c1b3eb175309df3aebe0571285) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - chore: bump some deps

- [#1666](https://github.com/t3-oss/create-t3-app/pull/1666) [`3317a41`](https://github.com/t3-oss/create-t3-app/commit/3317a41546728509543d8fc44a8fe715b04f09e8) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - refactor: use `type: module` for more modern setup

- [#1664](https://github.com/t3-oss/create-t3-app/pull/1664) [`66213b0`](https://github.com/t3-oss/create-t3-app/commit/66213b04cf03fd7d4d0602bbb34a3de2ab703daa) Thanks [@piousdeer](https://github.com/piousdeer)! - chore: replace a `2` with `"error"` in eslint config

## 7.23.2

### Patch Changes

- [#1651](https://github.com/t3-oss/create-t3-app/pull/1651) [`4834ec3`](https://github.com/t3-oss/create-t3-app/commit/4834ec3cd16c8dba4be1bcd2a9b162c37a0bc7d2) Thanks [@mattpocock](https://github.com/mattpocock)! - tidy up and modernize tsconfig

## 7.23.1

### Patch Changes

- [#1644](https://github.com/t3-oss/create-t3-app/pull/1644) [`e6649f1`](https://github.com/t3-oss/create-t3-app/commit/e6649f18963086b2d016815e60cc9915711a85d8) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix: only forward required cookie header

## 7.23.0

### Minor Changes

- [#1628](https://github.com/t3-oss/create-t3-app/pull/1628) [`57a82d2`](https://github.com/t3-oss/create-t3-app/commit/57a82d2f4c1a34068280a1f01c1f2618af260650) Thanks [@CarlosZiegler](https://github.com/CarlosZiegler)! - Update Next to use last version (14.0.0)

## 7.22.0

### Minor Changes

- [#1567](https://github.com/t3-oss/create-t3-app/pull/1567) [`e71bedd`](https://github.com/t3-oss/create-t3-app/commit/e71bedde0d6944fa7719a5f97cd27a1503156faa) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat: add app router option

- [#1595](https://github.com/t3-oss/create-t3-app/pull/1595) [`d7824e0`](https://github.com/t3-oss/create-t3-app/commit/d7824e0e2523703662b731945229e2fae88708ae) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - show callout when scaffolding with app router

## 7.21.0

### Minor Changes

- [#1584](https://github.com/t3-oss/create-t3-app/pull/1584) [`9614d84`](https://github.com/t3-oss/create-t3-app/commit/9614d8424d810278facf012fb99d1da51d2238e6) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - bump deps and add `emptyStringAsUndefined` option for `t3-env`

## 7.20.2

### Patch Changes

- [#1564](https://github.com/t3-oss/create-t3-app/pull/1564) [`58ee08e`](https://github.com/t3-oss/create-t3-app/commit/58ee08e850d985b5ef1b7e5bf0cc164cfaff3f3f) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix: block drizzle apps when the example database url hasn't been changed yet

## 7.20.1

### Patch Changes

- [#1561](https://github.com/t3-oss/create-t3-app/pull/1561) [`b8507dc`](https://github.com/t3-oss/create-t3-app/commit/b8507dc64ee91b8423de2ab6145cb3e7d8072528) Thanks [@Nsttt](https://github.com/Nsttt)! - Add packageManager field in package.json at app creation

## 7.20.0

### Minor Changes

- [#1461](https://github.com/t3-oss/create-t3-app/pull/1461) [`8034db0`](https://github.com/t3-oss/create-t3-app/commit/8034db042b9ed12f5ba01c1f779c5ee77d78afc4) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat: add drizzle

  This release adds a new option to use [`drizzle-orm`](https://orm.drizzle.team/docs/overview) as an alternative to Prisma.

  To make the different ORM options as similar as possible, some minor changes has also been made to the Prisma installer:

  - a new script `db:push` has been added and is included in both ORM options.
  - the prisma client has been renamed to `db` in the trpc context - you now access your database client like
    ```ts
    examples: publicProcedure.query((opts) => {
       // prisma
       opts.ctx.db.example.findMany()
       // drizzle
       opts.ctx.db.query.example.findMany()
    }),
    ```

  You cannot choose the two options in the same app.

### Patch Changes

- [#1461](https://github.com/t3-oss/create-t3-app/pull/1461) [`8034db0`](https://github.com/t3-oss/create-t3-app/commit/8034db042b9ed12f5ba01c1f779c5ee77d78afc4) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - refactor: swap inquirer for clack

## 7.19.0

### Minor Changes

- [#1375](https://github.com/t3-oss/create-t3-app/pull/1375) [`d781f08`](https://github.com/t3-oss/create-t3-app/commit/d781f0861ba05aee6b3d460fc53e126868409fb5) Thanks [@Zeko369](https://github.com/Zeko369)! - feat: detect and support usage of Bun as package manager

## 7.18.0

### Minor Changes

- [#1532](https://github.com/t3-oss/create-t3-app/pull/1532) [`941a0fc`](https://github.com/t3-oss/create-t3-app/commit/941a0fc79bcfb24c894525c93aab87c2860b2ad4) Thanks [@spicybackend](https://github.com/spicybackend)! - chore(deps): upgrade Prisma to v5.1.1, bump patch versions of other dependencies

- [#1507](https://github.com/t3-oss/create-t3-app/pull/1507) [`fe5755c`](https://github.com/t3-oss/create-t3-app/commit/fe5755c2d575ce27e8e9c86e6fc79e7903af0390) Thanks [@LevinUncu](https://github.com/LevinUncu)! - If the project is not in a Git repo, the next steps will show git init instead of git commit -m "initial commit".

## 7.17.0

### Minor Changes

- [#1523](https://github.com/t3-oss/create-t3-app/pull/1523) [`c441a9e`](https://github.com/t3-oss/create-t3-app/commit/c441a9ecfaeb61866a76379712b297fc6c2c36b3) Thanks [@JoshuaKGoldberg](https://github.com/JoshuaKGoldberg)! - reduced stylistic linting

## 7.16.0

### Minor Changes

- [#1476](https://github.com/t3-oss/create-t3-app/pull/1476) [`f3fd50f`](https://github.com/t3-oss/create-t3-app/commit/f3fd50fbd5dfd705507b1a2b53e8e6fd39b2dadb) Thanks [@JoshuaKGoldberg](https://github.com/JoshuaKGoldberg)! - Upgraded typescript-eslint to v6, with reworked ESLint configurations

- [#1508](https://github.com/t3-oss/create-t3-app/pull/1508) [`e9c862e`](https://github.com/t3-oss/create-t3-app/commit/e9c862e7e114214139f05572d62af45d87d3fc1c) Thanks [@Sn0wye](https://github.com/Sn0wye)! - chore(deps): bump prisma to v5.0.0

## 7.15.0

### Minor Changes

- [#1484](https://github.com/t3-oss/create-t3-app/pull/1484) [`23a9d60`](https://github.com/t3-oss/create-t3-app/commit/23a9d60cd013c40d76ab96d0340425e1e3d8efa2) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - reminder to git commit after creating an application with the CLI

### Patch Changes

- [#1493](https://github.com/t3-oss/create-t3-app/pull/1493) [`a230d9f`](https://github.com/t3-oss/create-t3-app/commit/a230d9f7bb3a78669f2003ae9084c868f06639b7) Thanks [@dcottr](https://github.com/dcottr)! - Remove trailing newlines in generated app that aren't allowed by the generated prettier config

## 7.14.1

### Patch Changes

- [#1479](https://github.com/t3-oss/create-t3-app/pull/1479) [`bb7324c`](https://github.com/t3-oss/create-t3-app/commit/bb7324c9503995949c61c0a5abe736c38f07b815) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - use custom error class for IsTTYError

## 7.14.0

### Minor Changes

- [#1466](https://github.com/t3-oss/create-t3-app/pull/1466) [`e8b68d9`](https://github.com/t3-oss/create-t3-app/commit/e8b68d92af093361bf73eed7eacd7ed6848500c3) Thanks [@brunoeduardodev](https://github.com/brunoeduardodev)! - Ignore trailing slashes when prompting the app name.

## 7.13.2

### Patch Changes

- [#1469](https://github.com/t3-oss/create-t3-app/pull/1469) [`547f504`](https://github.com/t3-oss/create-t3-app/commit/547f504b91c3da9b6419ea7f9f43d03e6c243839) Thanks [@ericshively](https://github.com/ericshively)! - Replace React.FC with basic function syntax

## 7.13.1

### Patch Changes

- [#1436](https://github.com/t3-oss/create-t3-app/pull/1436) [`b0facee`](https://github.com/t3-oss/create-t3-app/commit/b0facee2736e3e0afc909c3d80b38499174fd84c) Thanks [@harrismcc](https://github.com/harrismcc)! - When using NextAuth but not Prisma, the session user's id is now set to `token.sub` instead of `user.id` because `user` is undefined when not using database sessions.

- [#1433](https://github.com/t3-oss/create-t3-app/pull/1433) [`7fbe991`](https://github.com/t3-oss/create-t3-app/commit/7fbe991175f4da02184e0e43a5439515d1ef7439) Thanks [@FinnDore](https://github.com/FinnDore)! - fix: SKIP_ENV_VALIDATION not skipping env validation

## 7.13.0

### Minor Changes

- [#1397](https://github.com/t3-oss/create-t3-app/pull/1397) [`be9a834`](https://github.com/t3-oss/create-t3-app/commit/be9a83483339f8bb799be7a3d69cf67e64882daf) Thanks [@brieyla1](https://github.com/brieyla1)! - feat: Added JsonProtocol as the Default Prisma Engine for Serverless speedups

  modified:

      - cli/template/extras/prisma/schema/base.prisma

      - cli/template/extras/prisma/schema/with-auth.prisma

  Description: This pull request proposes the enabling of the JsonProtocol by default. The rationale for this change is based on the performance improvements provided by the JsonProtocol without compromising stability, even though it is still a preview feature. Empirical evidence gathered from large-scale projects, with 100+ Prisma calls, demonstrates the significant time reductions enabled by this optimization, particularly in serverless environments such as Vercel. Another point worth adding is that most projects using nextJS create-t3-app will be deployed on serverless platforms such as vercel, where the real impact is.

## 7.12.3

### Patch Changes

- [#1404](https://github.com/t3-oss/create-t3-app/pull/1404) [`48dd89a`](https://github.com/t3-oss/create-t3-app/commit/48dd89adb33ff9625dba82f6e149cf111f02e488) Thanks [@michalbundyra](https://github.com/michalbundyra)! - update nextjs dependency to ^13.4.1

## 7.12.2

### Patch Changes

- [#1401](https://github.com/t3-oss/create-t3-app/pull/1401) [`b1a35dd`](https://github.com/t3-oss/create-t3-app/commit/b1a35dd66c5c9abab13daebfee93c08b67317272) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - temporarily pin next to fix vercel build error

## 7.12.1

### Patch Changes

- [#1377](https://github.com/t3-oss/create-t3-app/pull/1377) [`00018ff`](https://github.com/t3-oss/create-t3-app/commit/00018ff0cbe5904f0bb37b8cb0a64814ca5f9410) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - move env validation logic out to a separate package

- [#1385](https://github.com/t3-oss/create-t3-app/pull/1385) [`ac12abb`](https://github.com/t3-oss/create-t3-app/commit/ac12abb92a77d251b2c4bc72caceb422ab4ca706) Thanks [@iAverages](https://github.com/iAverages)! - Fixed issue with creating git repository with git versions below 2.28
  Fixed bug with check to use --inital-branch set in git v2.28

## 7.12.0

### Minor Changes

- [#1370](https://github.com/t3-oss/create-t3-app/pull/1370) [`18bc6a7`](https://github.com/t3-oss/create-t3-app/commit/18bc6a73a77b0b48191792ddfd0c296b58cc8221) Thanks [@chungweileong94](https://github.com/chungweileong94)! - Enforce `NEXT_PUBLIC_` env key on client

## 7.11.0

### Minor Changes

- [#1358](https://github.com/t3-oss/create-t3-app/pull/1358) [`1a8a97e`](https://github.com/t3-oss/create-t3-app/commit/1a8a97e42b8991596fc70e50dd6870c987a59075) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - improve boolean coercion of `SKIP_ENV_VALIDATION` environment variable

  If defined, "0" and "false" are now considered falsey values, all other values are considered truthy.

### Patch Changes

- [#1352](https://github.com/t3-oss/create-t3-app/pull/1352) [`c48b38f`](https://github.com/t3-oss/create-t3-app/commit/c48b38f522b81097e2f0e883ede053dbac620c12) Thanks [@Tungetyt](https://github.com/Tungetyt)! - refactor: make destructuring consistent

## 7.10.3

### Patch Changes

- [#1330](https://github.com/t3-oss/create-t3-app/pull/1330) [`85997e0`](https://github.com/t3-oss/create-t3-app/commit/85997e0cc26a2ae6fbcd08458734bd6335ba467a) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix: create a new object for the session callback

## 7.10.2

### Patch Changes

- [#1329](https://github.com/t3-oss/create-t3-app/pull/1329) [`5429989`](https://github.com/t3-oss/create-t3-app/commit/54299895517d3c406637efec8f0512cf1ba2da5a) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - temporarily pin next-auth version

- [#1321](https://github.com/t3-oss/create-t3-app/pull/1321) [`7fcb41c`](https://github.com/t3-oss/create-t3-app/commit/7fcb41c95d24567040b72409a576d8c694f910a1) Thanks [@JingLi1998](https://github.com/JingLi1998)! - Update the type for global prisma instance

## 7.10.1

### Patch Changes

- [#1312](https://github.com/t3-oss/create-t3-app/pull/1312) [`2fb3a51`](https://github.com/t3-oss/create-t3-app/commit/2fb3a51b8b91cf2eb992a3af49ff52588f1e9c95) Thanks [@FinnDore](https://github.com/FinnDore)! - feat: bumped tailwind from 3.2.7 -> 3.3.0

## 7.10.0

### Minor Changes

- [#1295](https://github.com/t3-oss/create-t3-app/pull/1295) [`d0a8143`](https://github.com/t3-oss/create-t3-app/commit/d0a8143587c935819790521533e7cfa0862d300c) Thanks [@iAverages](https://github.com/iAverages)! - Replace Git Bash check with Mintty check

### Patch Changes

- [#1304](https://github.com/t3-oss/create-t3-app/pull/1304) [`2cb41e6`](https://github.com/t3-oss/create-t3-app/commit/2cb41e676f01d4e8bfb8c7fc41bf0d5c4a1c0689) Thanks [@PiotrekPKP](https://github.com/PiotrekPKP)! - fix: replace trpc links

## 7.9.0

### Minor Changes

- [#1284](https://github.com/t3-oss/create-t3-app/pull/1284) [`a2af1a2`](https://github.com/t3-oss/create-t3-app/commit/a2af1a2b7d4fd3005f8efe0e297b871d6b1747ff) Thanks [@michalbundyra](https://github.com/michalbundyra)! - chore: bump typescript - 5.0.2

## 7.8.0

### Minor Changes

- [#1273](https://github.com/t3-oss/create-t3-app/pull/1273) [`10a5e0b`](https://github.com/t3-oss/create-t3-app/commit/10a5e0b2fe91b887526960515c6422791a77c724) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat: add errorformatter for zod errors

### Patch Changes

- [#1263](https://github.com/t3-oss/create-t3-app/pull/1263) [`8dc6e33`](https://github.com/t3-oss/create-t3-app/commit/8dc6e33ea149851de97f84e8d8388accdd5547d9) Thanks [@mkreuzmayr](https://github.com/mkreuzmayr)! - search for tsconfig relative to eslintrc

- [#1279](https://github.com/t3-oss/create-t3-app/pull/1279) [`ae5cd40`](https://github.com/t3-oss/create-t3-app/commit/ae5cd405c9d5bb672e3971c496d437a7a05b3f8f) Thanks [@arielconti10](https://github.com/arielconti10)! - fix: remove //@ts-check comment in next.config

## 7.7.0

### Minor Changes

- [#1268](https://github.com/t3-oss/create-t3-app/pull/1268) [`db394ed`](https://github.com/t3-oss/create-t3-app/commit/db394edf396288dd754f5743ae2fe26a39c70ef5) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - ignore unused vars that begin with underscore

## 7.6.0

### Minor Changes

- [#1255](https://github.com/t3-oss/create-t3-app/pull/1255) [`601cbb2`](https://github.com/t3-oss/create-t3-app/commit/601cbb23075cd33170c5b3ea2b1b0dbb0f2d5716) Thanks [@justasam](https://github.com/justasam)! - Add import alias validation

## 7.5.9

### Patch Changes

- [#1252](https://github.com/t3-oss/create-t3-app/pull/1252) [`d8be181`](https://github.com/t3-oss/create-t3-app/commit/d8be181fd71dafba8c4c1358fea38b70bca8171a) Thanks [@ggrochow](https://github.com/ggrochow)! - Rename \_eslint.cjs before intializing git repo to ensure .eslint.cjs is added by default

## 7.5.8

### Patch Changes

- [#1249](https://github.com/t3-oss/create-t3-app/pull/1249) [`2432d76`](https://github.com/t3-oss/create-t3-app/commit/2432d76acb337e215743e712d12969b141b22879) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - chore: bump nextjs

## 7.5.7

### Patch Changes

- [#1232](https://github.com/t3-oss/create-t3-app/pull/1232) [`9c82f86`](https://github.com/t3-oss/create-t3-app/commit/9c82f862f5f5227c48e355a8fc31f83d88b0baeb) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix: bind configs to variables before exporting to make sure typeerrors are reported

## 7.5.6

### Patch Changes

- [#1222](https://github.com/t3-oss/create-t3-app/pull/1222) [`7baa339`](https://github.com/t3-oss/create-t3-app/commit/7baa339b36b40760443083e0a378d8fe04dddb40) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix: detect and handle git bash environment

## 7.5.5

### Patch Changes

- [#1218](https://github.com/t3-oss/create-t3-app/pull/1218) [`4f8d41a`](https://github.com/t3-oss/create-t3-app/commit/4f8d41ae2f41bef197cab13a332034e0ddffc955) Thanks [@bai](https://github.com/bai)! - feat: change eslint config to use `.cjs` format and typecheck it

- [#1217](https://github.com/t3-oss/create-t3-app/pull/1217) [`55c87af`](https://github.com/t3-oss/create-t3-app/commit/55c87af37f64fbf778a5091b9cca75f9c9546468) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix: add autofix to eslint type rule

## 7.5.4

### Patch Changes

- [#1191](https://github.com/t3-oss/create-t3-app/pull/1191) [`aabb9a4`](https://github.com/t3-oss/create-t3-app/commit/aabb9a41aa8acce4b3b02e2341b83cd78b802924) Thanks [@bai](https://github.com/bai)! - Use ~/\* import alias

## 7.5.3

### Patch Changes

- [#1213](https://github.com/t3-oss/create-t3-app/pull/1213) [`ab3c7cb`](https://github.com/t3-oss/create-t3-app/commit/ab3c7cb4d4e78ab646a645bc28b4fe3496ba7831) Thanks [@michalbundyra](https://github.com/michalbundyra)! - fix: update comment regarding schema definition of env vars

## 7.5.2

### Patch Changes

- [#1189](https://github.com/t3-oss/create-t3-app/pull/1189) [`bf12635`](https://github.com/t3-oss/create-t3-app/commit/bf1263576866116a904f3d1fa741c5496a535cb9) Thanks [@p13lgst](https://github.com/p13lgst)! - fix: remove ts-ignores on env.mjs

## 7.5.1

### Patch Changes

- [#1187](https://github.com/t3-oss/create-t3-app/pull/1187) [`e111fb5`](https://github.com/t3-oss/create-t3-app/commit/e111fb5cb816de9b2d87bdf4ffcf84f446fd2023) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - remove old env files

## 7.5.0

### Minor Changes

- [#1092](https://github.com/t3-oss/create-t3-app/pull/1092) [`aa44574`](https://github.com/t3-oss/create-t3-app/commit/aa44574680bf380cf4cf7f255fb547e5d9ced7d7) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - single env file

### Patch Changes

- [#1171](https://github.com/t3-oss/create-t3-app/pull/1171) [`efe8b7f`](https://github.com/t3-oss/create-t3-app/commit/efe8b7f54cf0fe5448dc52118745668ae4913547) Thanks [@esotuvaka](https://github.com/esotuvaka)! - fix: swap `@ts-check` comments to `checkJs: true` in scaffolded app's tsconfig

## 7.4.1

### Patch Changes

- [#1155](https://github.com/t3-oss/create-t3-app/pull/1155) [`90955a5`](https://github.com/t3-oss/create-t3-app/commit/90955a50390eee8a23e1c1b35e10c860e4341fed) Thanks [@christopher-kapic](https://github.com/christopher-kapic)! - Change unstable_getServerSession to match the updated getServerSession from next-auth (introduced in next-auth 4.19.0)

## 7.4.0

### Minor Changes

- [#1136](https://github.com/t3-oss/create-t3-app/pull/1136) [`715f6e8`](https://github.com/t3-oss/create-t3-app/commit/715f6e8e795685c054145149acff427a1b46172f) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat: colocate auth config/dts/session-getter into a single file

- [#1134](https://github.com/t3-oss/create-t3-app/pull/1134) [`4cb2e4e`](https://github.com/t3-oss/create-t3-app/commit/4cb2e4e5020f93636889499bf71029ce7fcb5fce) Thanks [@PiotrekPKP](https://github.com/PiotrekPKP)! - feat: added package installation progress

### Patch Changes

- [#1131](https://github.com/t3-oss/create-t3-app/pull/1131) [`ab0790e`](https://github.com/t3-oss/create-t3-app/commit/ab0790e95194291cab65dee458982a2b637a4d15) Thanks [@bastibuck](https://github.com/bastibuck)! - fix: fix types of serverEnv and clientEnv

- [#1140](https://github.com/t3-oss/create-t3-app/pull/1140) [`fc445bf`](https://github.com/t3-oss/create-t3-app/commit/fc445bfaa72e2de2880fb286cee71ff2b26a72a6) Thanks [@Zamiell](https://github.com/Zamiell)! - chore: add descriptive comments and format .env prettier

## 7.3.2

### Patch Changes

- [#1097](https://github.com/t3-oss/create-t3-app/pull/1097) [`2ed36cd`](https://github.com/t3-oss/create-t3-app/commit/2ed36cd624cba2032ba70c465cd47c49a962bb0d) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - chore: bump nextjs and add a note about appDir+i18n being incompat

## 7.3.1

### Patch Changes

- [#1084](https://github.com/t3-oss/create-t3-app/pull/1084) [`7490a34`](https://github.com/t3-oss/create-t3-app/commit/7490a34a3f46d8e912f996843d27ae5933f26164) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - fix: undo env changes

## 7.3.0

### Minor Changes

- [#1071](https://github.com/t3-oss/create-t3-app/pull/1071) [`34d6c5b`](https://github.com/t3-oss/create-t3-app/commit/34d6c5b0431ea7baa922a27768d0c82b05c12bdc) Thanks [@ JacobADevore](https://github.com/JacobADevore)! - feat: automatically destructure env objects

## 7.2.0

### Minor Changes

- [#1021](https://github.com/t3-oss/create-t3-app/pull/1021) [`78dfdc9`](https://github.com/t3-oss/create-t3-app/commit/78dfdc9b480ea19ac90270827653400e31300e6e) Thanks [@iduuck](https://github.com/iduuck)! - construct `serverEnv`, like we do with `clientEnv` #1000

### Patch Changes

- [#1060](https://github.com/t3-oss/create-t3-app/pull/1060) [`a8cc106`](https://github.com/t3-oss/create-t3-app/commit/a8cc106c3ef507e275f38c09a5d6a7a14336c254) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix: cleanup context type in `initTRPC`

## 7.1.0

### Minor Changes

- [#1036](https://github.com/t3-oss/create-t3-app/pull/1036) [`c5ca65e`](https://github.com/t3-oss/create-t3-app/commit/c5ca65e03e2a9d1c3c7f6844eb678402b0fa8993) Thanks [@JoshuaKGoldberg](https://github.com/JoshuaKGoldberg)! - use typescript-eslint's recommended-required-type-checking

## 7.0.2

### Patch Changes

- [#1056](https://github.com/t3-oss/create-t3-app/pull/1056) [`c6704fb`](https://github.com/t3-oss/create-t3-app/commit/c6704fbeef1473e77ad62543770f1804645389a8) Thanks [@prashantrahul141](https://github.com/prashantrahul141)! - fix: update `package.json->name` before installing dependencies.

## 7.0.1

### Patch Changes

- [#1043](https://github.com/t3-oss/create-t3-app/pull/1043) [`6fe7e1e`](https://github.com/t3-oss/create-t3-app/commit/6fe7e1e1025f46ea8fe6cc82bee7a68e96864078) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix(cli): exit with error code when aborting installation
  fix(cli): don't log when scaffolding in current directory and it's empty

## 7.0.0

### Major Changes

- [#934](https://github.com/t3-oss/create-t3-app/pull/934) [`c20ec70`](https://github.com/t3-oss/create-t3-app/commit/c20ec705a6d3d3005da24d072cc9be04370ab822) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat!: implement new folder structure

  create-t3-app has decided to switch out the folder structure of the generated t3-app to, what is to us, a more minimal, logical and easier to understand structure.

## 6.12.0

### Minor Changes

- [#1031](https://github.com/t3-oss/create-t3-app/pull/1031) [`61ba991`](https://github.com/t3-oss/create-t3-app/commit/61ba991ea92f5eb3e971d34769df0ba470310990) Thanks [@complexengine](https://github.com/complexengine)! - The CLI now stages the files on project initialization.

## 6.11.6

### Patch Changes

- [#1024](https://github.com/t3-oss/create-t3-app/pull/1024) [`fcf59b0`](https://github.com/t3-oss/create-t3-app/commit/fcf59b077d80fdf0728ab7a4ea12a4b3b5521da3) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix: allow dot name in name prompt

## 6.11.5

### Patch Changes

- [#1010](https://github.com/t3-oss/create-t3-app/pull/1010) [`9eddbab`](https://github.com/t3-oss/create-t3-app/commit/9eddbabb9e045b2a8a668ec1389218020360b305) Thanks [@maxmellen](https://github.com/maxmellen)! - chore(create-t3-app): add @types/prettier package to tailwind installer and bump prettier versions

## 6.11.4

### Patch Changes

- [#981](https://github.com/t3-oss/create-t3-app/pull/981) [`ac32b6d`](https://github.com/t3-oss/create-t3-app/commit/ac32b6d09df6d7b3620a41ace8cd2612bd909cc8) Thanks [@balazsorban44](https://github.com/balazsorban44)! - fix(cli): prompt TS first

## 6.11.3

### Patch Changes

- [#939](https://github.com/t3-oss/create-t3-app/pull/939) [`77cfb4b`](https://github.com/t3-oss/create-t3-app/commit/77cfb4bd156ca3d97cbb70cf51ec8e12a632bd64) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - use next-auth 4.18.3 and undo hotfix

- [#932](https://github.com/t3-oss/create-t3-app/pull/932) [`c04a35a`](https://github.com/t3-oss/create-t3-app/commit/c04a35a2b215c8537cf7f0d9ff9760c831720514) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - fix next-auth error

## 6.11.2

### Patch Changes

- [#917](https://github.com/t3-oss/create-t3-app/pull/917) [`eb55d19`](https://github.com/t3-oss/create-t3-app/commit/eb55d19ae0204f6e61fb65b82057b93ed485e880) Thanks [@sharkby7e](https://github.com/sharkby7e)! - feat: add blank target to base template

## 6.11.1

### Patch Changes

- [#914](https://github.com/t3-oss/create-t3-app/pull/914) [`1037d14`](https://github.com/t3-oss/create-t3-app/commit/1037d1472764080a5641d657cac75adec2bbd3f1) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - temporarily pin next-auth

## 6.11.0

### Minor Changes

- [#901](https://github.com/t3-oss/create-t3-app/pull/901) [`9b6ae5c`](https://github.com/t3-oss/create-t3-app/commit/9b6ae5cc1c8fe85becd367d36b61828b06a0a6a9) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - include env files in all apps

### Patch Changes

- [#895](https://github.com/t3-oss/create-t3-app/pull/895) [`91362db`](https://github.com/t3-oss/create-t3-app/commit/91362db87a50fe7f09807aa9950acc5c60ba80dc) Thanks [@Mvmo](https://github.com/Mvmo)! - When initializing a new git repo the git config value 'init.defaultBranch' will be used as the branch name

- [#897](https://github.com/t3-oss/create-t3-app/pull/897) [`272b954`](https://github.com/t3-oss/create-t3-app/commit/272b9547f42f70df3c24dc9d438a7cd88a244773) Thanks [@AyanavaKarmakar](https://github.com/AyanavaKarmakar)! - fix(cli): fix wrong prompt when setting up project name

## 6.10.3

### Patch Changes

- [#869](https://github.com/t3-oss/create-t3-app/pull/869) [`cd93b98`](https://github.com/t3-oss/create-t3-app/commit/cd93b98d00e559721da0674b81978a00870e68ff) Thanks [@meech-ward](https://github.com/meech-ward)! - docs: add notes about env vars

- [#878](https://github.com/t3-oss/create-t3-app/pull/878) [`9abaf80`](https://github.com/t3-oss/create-t3-app/commit/9abaf80d20620e3399c3a1ae51e06a41e2990e28) Thanks [@AyanavaKarmakar](https://github.com/AyanavaKarmakar)! - feat: update scaffolded README.md

- [#845](https://github.com/t3-oss/create-t3-app/pull/845) [`c387187`](https://github.com/t3-oss/create-t3-app/commit/c38718768661944807daee92b21aae2789649ecb) Thanks [@GabrielPedroza](https://github.com/gabrielpedroza)! - fix: typo in env-schema comments

## 6.10.2

### Patch Changes

- [#834](https://github.com/t3-oss/create-t3-app/pull/834) [`3ace6c8`](https://github.com/t3-oss/create-t3-app/commit/3ace6c8149b01d68c1503c6b3087f2a8e5ebc865) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - use trpc 10.0.0

## 6.10.1

### Patch Changes

- [#784](https://github.com/t3-oss/create-t3-app/pull/784) [`f10ce0e`](https://github.com/t3-oss/create-t3-app/commit/f10ce0e9badd3ad6ed45b8dca272bdfc5fbfbff6) Thanks [@AyanavaKarmakar](https://github.com/AyanavaKarmakar)! - fix(t3-app): fix broken links

- [#786](https://github.com/t3-oss/create-t3-app/pull/786) [`4d70f04`](https://github.com/t3-oss/create-t3-app/commit/4d70f048955cd75aa67f0ba91fd5cec5d0311d08) Thanks [@skuridin](https://github.com/skuridin)! - Add next-env.d.ts to .gitignore

- [#800](https://github.com/t3-oss/create-t3-app/pull/800) [`d5d5a2f`](https://github.com/t3-oss/create-t3-app/commit/d5d5a2f7503cf9d7c3bfab4609aeb6a0188d6af1) Thanks [@HatulaPro](https://github.com/HatulaPro)! - fix: removing redundant optional chaining in templates

## 6.10.0

### Minor Changes

- [#711](https://github.com/t3-oss/create-t3-app/pull/711) [`da760c7`](https://github.com/t3-oss/create-t3-app/commit/da760c7d4b96fb783ca1621aed933d63f0d51d4e) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - create new index pages

### Patch Changes

- [#754](https://github.com/t3-oss/create-t3-app/pull/754) [`b6cdcb3`](https://github.com/t3-oss/create-t3-app/commit/b6cdcb3f21feeec6153601d420177b0ada490f2e) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - fix: rename example env file

## 6.9.0

### Minor Changes

- [#727](https://github.com/t3-oss/create-t3-app/pull/727) [`57cb2b5`](https://github.com/t3-oss/create-t3-app/commit/57cb2b5881c31182acc6918cf86330dda26d0586) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat: add warning message when not using latest

## 6.8.1

### Patch Changes

- [#717](https://github.com/t3-oss/create-t3-app/pull/717) [`7f8e706`](https://github.com/t3-oss/create-t3-app/commit/7f8e70643c3de0ba8c457833a54c4700bd974816) Thanks [@robotkutya](https://github.com/robotkutya)! - feat: update NEXTAUTH_SECRET validator and set a default

- [#719](https://github.com/t3-oss/create-t3-app/pull/719) [`b359802`](https://github.com/t3-oss/create-t3-app/commit/b359802f128297f0048ae587453031d05e49b566) Thanks [@AyanavaKarmakar](https://github.com/AyanavaKarmakar)! - fix: update NEXTAUTH_SECRET validator to be optional in dev

## 6.8.0

### Minor Changes

- [#673](https://github.com/t3-oss/create-t3-app/pull/673) [`44a107b`](https://github.com/t3-oss/create-t3-app/commit/44a107b8d5345023bafc8a773322e5ee39ba8580) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - remove node 18 and next 13 checks

### Patch Changes

- [#684](https://github.com/t3-oss/create-t3-app/pull/684) [`a707c4b`](https://github.com/t3-oss/create-t3-app/commit/a707c4ba9ffedb8991fc14976e352ff83f4502ac) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - chore: version bumps

## 6.7.0

### Minor Changes

- [#667](https://github.com/t3-oss/create-t3-app/pull/667) [`fde5b76`](https://github.com/t3-oss/create-t3-app/commit/fde5b7628860b305c95f70f5cc42ae3c37ad59a9) Thanks [@Pegasust](https://github.com/Pegasust)! - Add documentation on how to generate NEXTAUTH_SECRET in .env file for clarity

- [#675](https://github.com/t3-oss/create-t3-app/pull/675) [`5d20745`](https://github.com/t3-oss/create-t3-app/commit/5d207453497c327b5c54cd3a55c824d59b80effe) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - only try to get secret message if there is a user

### Patch Changes

- [#676](https://github.com/t3-oss/create-t3-app/pull/676) [`a497e47`](https://github.com/t3-oss/create-t3-app/commit/a497e4765b17e686482ef5b5701766b2299ea0b2) Thanks [@nexxeln](https://github.com/nexxeln)! - update next to 13.0.1

- [#654](https://github.com/t3-oss/create-t3-app/pull/654) [`3dfc27d`](https://github.com/t3-oss/create-t3-app/commit/3dfc27d7edc8dfedee6ed06e9b381cbd791ae0e7) Thanks [@nexxeln](https://github.com/nexxeln)! - Make experimental flags booleans and not require the name to be "double passed"

## 6.6.0

### Minor Changes

- [#657](https://github.com/t3-oss/create-t3-app/pull/657) [`f1673eb`](https://github.com/t3-oss/create-t3-app/commit/f1673ebbf58033746b9a020b7f0b72d976988f84) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat: update dependency Next.js to 13

## 6.5.2

### Patch Changes

- [#649](https://github.com/t3-oss/create-t3-app/pull/649) [`6a21032`](https://github.com/t3-oss/create-t3-app/commit/6a210329136d089d61d41acaf99519223003f606) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - chore: version bumps

## 6.5.1

### Patch Changes

- [#642](https://github.com/t3-oss/create-t3-app/pull/642) [`9639419`](https://github.com/t3-oss/create-t3-app/commit/9639419f1f24f8c3f5418680d9d8a214e16c8cd6) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - get next-auth to work with node 18

## 6.5.0

### Minor Changes

- [#623](https://github.com/t3-oss/create-t3-app/pull/623) [`cf99211`](https://github.com/t3-oss/create-t3-app/commit/cf992110e7d7e741e56561a728ee0f2dee6fc614) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - consistent cli text color

### Patch Changes

- [#619](https://github.com/t3-oss/create-t3-app/pull/619) [`1122720`](https://github.com/t3-oss/create-t3-app/commit/112272083e6130209bfbac0cd350e985dcd9f19f) Thanks [@nexxeln](https://github.com/nexxeln)! - Added `createdAt` and `updatedAt` fields to the Example model in the Prisma schema.

- [#621](https://github.com/t3-oss/create-t3-app/pull/621) [`1cc6735`](https://github.com/t3-oss/create-t3-app/commit/1cc67350c626db3c67f012a84d1a73a7a0f03a91) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - fix git spinner

## 6.4.0

### Minor Changes

- [#613](https://github.com/t3-oss/create-t3-app/pull/613) [`135ee5b`](https://github.com/t3-oss/create-t3-app/commit/135ee5b469c575e3fa0d7729a9a545811cc9cf74) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - add inference helper for v10

### Patch Changes

- [#611](https://github.com/t3-oss/create-t3-app/pull/611) [`78a0da3`](https://github.com/t3-oss/create-t3-app/commit/78a0da3d08b9e4468fecbae29cccde7ec43801ab) Thanks [@nexxeln](https://github.com/nexxeln)! - fix(cli): make `installDependencies` step async to make loader spin

## 6.3.0

### Minor Changes

- [#606](https://github.com/t3-oss/create-t3-app/pull/606) [`7f73518`](https://github.com/t3-oss/create-t3-app/commit/7f73518b488b0391f19c8d4d31f583e2be71195a) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - rename index.ts to \_app.ts

## 6.2.1

### Patch Changes

- [#602](https://github.com/t3-oss/create-t3-app/pull/602) [`9f86e39`](https://github.com/t3-oss/create-t3-app/commit/9f86e391fded7bb196ac40b83ac633d996bf035f) Thanks [@nexxeln](https://github.com/nexxeln)! - feat(template): add prettier.Config type to prettier config and resolve prettier-plugin-tailwindcss import

## 6.2.0

### Minor Changes

- [#581](https://github.com/t3-oss/create-t3-app/pull/581) [`dd0e172`](https://github.com/t3-oss/create-t3-app/commit/dd0e172579d0436f5bdb5d29b721dd55362f620e) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - export helper procedures for trpc instead of the `t`-object

## 6.1.2

### Patch Changes

- [#593](https://github.com/t3-oss/create-t3-app/pull/593) [`c8e2753`](https://github.com/t3-oss/create-t3-app/commit/c8e2753b916d15f3ce1103e7fa89dbd046150474) Thanks [@nexxeln](https://github.com/nexxeln)! - chore(template): remove the mention of @next in template readme

## 6.1.1

### Patch Changes

- [#591](https://github.com/t3-oss/create-t3-app/pull/591) [`c90a695`](https://github.com/t3-oss/create-t3-app/commit/c90a6957de7a644e1669762c7a0d19bfbd300715) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - bump next-auth dependency to ^4.12

## 6.1.0

### Minor Changes

- [#582](https://github.com/t3-oss/create-t3-app/pull/582) [`e562ee8`](https://github.com/t3-oss/create-t3-app/commit/e562ee89401307d92177573a9ead1b45373b63c7) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - move prettier from base to tailwind installer

- [#587](https://github.com/t3-oss/create-t3-app/pull/587) [`8c0267f`](https://github.com/t3-oss/create-t3-app/commit/8c0267f98bb7c71e0d90644a9f6af97f1599c723) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - Add .env-example to scaffolded app

## 6.0.1

### Patch Changes

- [#578](https://github.com/t3-oss/create-t3-app/pull/578) [`befc7f4`](https://github.com/t3-oss/create-t3-app/commit/befc7f4f74faeb1538cb6cad6191a1849bf34987) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - upgrade trpc to beta.15 and typescript to 4.8.4

## 6.0.0

### Major Changes

- [#575](https://github.com/t3-oss/create-t3-app/pull/575) [`75fcb49`](https://github.com/t3-oss/create-t3-app/commit/75fcb49f338fbf783a1b157332a803f7c51048c6) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - upgrades trpc to v10 and improves cli performance by making it synchronous

### Minor Changes

- [#575](https://github.com/t3-oss/create-t3-app/pull/575) [`75fcb49`](https://github.com/t3-oss/create-t3-app/commit/75fcb49f338fbf783a1b157332a803f7c51048c6) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - enable vercel_url to pass default env-schema

## 5.15.0

### Minor Changes

- [#533](https://github.com/t3-oss/create-t3-app/pull/533) [`a3a168a`](https://github.com/t3-oss/create-t3-app/commit/a3a168a5a2c54a51e841b2fce5786ec94d72b0fb) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - Tailor .env to only include relevant keys

## 5.14.1

### Patch Changes

- [#510](https://github.com/t3-oss/create-t3-app/pull/510) [`39d766d`](https://github.com/t3-oss/create-t3-app/commit/39d766d3b384c3420c6c058c27be775e961a9319) Thanks [@EkkoKo](https://github.com/EkkoKo)! - fix: resolve target area of `Documentation` links in TechnologyCard

## 5.14.0

### Minor Changes

- [#517](https://github.com/t3-oss/create-t3-app/pull/517) [`2b434bb`](https://github.com/t3-oss/create-t3-app/commit/2b434bb181dc346f299591ddf5465d3175df5c07) Thanks [@gabrielelpidio](https://github.com/gabrielelpidio)! - Add prettier and prettier-plugin-tailwindcss

## 5.13.1

### Patch Changes

- [#506](https://github.com/t3-oss/create-t3-app/pull/506) [`f371ef8`](https://github.com/t3-oss/create-t3-app/commit/f371ef8f0b64205cbbfb5dc6f3416da01a673a71) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - temp fix for next-auth peer deps issue

## 5.13.0

### Minor Changes

- [#485](https://github.com/t3-oss/create-t3-app/pull/485) [`ecc7642`](https://github.com/t3-oss/create-t3-app/commit/ecc764264eff0cf5062fee4f7e4bd9f75975ef41) Thanks [@nexxeln](https://github.com/nexxeln)! - bump next to 12.3.1 and fix AppType

## 5.12.0

### Minor Changes

- [#446](https://github.com/t3-oss/create-t3-app/pull/446) [`6f63ec6`](https://github.com/t3-oss/create-t3-app/commit/6f63ec65201a077e534ec89c4ef18bfa07a30331) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - feat: better cli text when scaffolding in '.'

## 5.11.0

### Minor Changes

- [#430](https://github.com/t3-oss/create-t3-app/pull/430) [`306777a`](https://github.com/t3-oss/create-t3-app/commit/306777a5513c365dfb3525c1484459236734a289) Thanks [@benmarg](https://github.com/benmarg)! - feat: direct developer to add schema from .env to schema.mjs for zod validation

### Patch Changes

- [#416](https://github.com/t3-oss/create-t3-app/pull/416) [`14b6d4a`](https://github.com/t3-oss/create-t3-app/commit/14b6d4a0764f57ece45749724c5b12a85544733e) Thanks [@xpressivecode](https://github.com/xpressivecode)! - fix(template): missing ctx when using ssr with trpc

## 5.10.3

### Patch Changes

- [#419](https://github.com/t3-oss/create-t3-app/pull/419) [`554de8f`](https://github.com/t3-oss/create-t3-app/commit/554de8f2838a8d539d81bcb520f121a7e14e3c84) Thanks [@sor4chi](https://github.com/sor4chi)! - Remove unnecessary singlequote in tailwind classname

## 5.10.2

### Patch Changes

- [#387](https://github.com/t3-oss/create-t3-app/pull/387) [`0f8f59c`](https://github.com/t3-oss/create-t3-app/commit/0f8f59c30155ddf4f6be90f3713ff5d5379f0cbb) Thanks [@Vallerem](https://github.com/Vallerem)! - feat: add basic i18n configuration in next.config

## 5.10.1

### Patch Changes

- [#396](https://github.com/t3-oss/create-t3-app/pull/396) [`30f3db6`](https://github.com/t3-oss/create-t3-app/commit/30f3db64c3a81475488c712fa16682076ba3f18b) Thanks [@rhenriquez28](https://github.com/rhenriquez28)! - fixing ssr by forwarding client's headers

## 5.10.0

### Minor Changes

- [#388](https://github.com/t3-oss/create-t3-app/pull/388) [`86d053c`](https://github.com/t3-oss/create-t3-app/commit/86d053c440ed3c5d5101faf8d73574b6d24bf99e) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - feat: non-tw index.tsx with styling

* [#381](https://github.com/t3-oss/create-t3-app/pull/381) [`773b27e`](https://github.com/t3-oss/create-t3-app/commit/773b27e1399970992e232975830d327100316e74) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - feat: include all cards on all index.tsx files

- [#383](https://github.com/t3-oss/create-t3-app/pull/383) [`e05bc3d`](https://github.com/t3-oss/create-t3-app/commit/e05bc3da9867fcf8d8262b4e8dd976565650cf8f) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - add safeguards for overwriting git repos

* [#375](https://github.com/t3-oss/create-t3-app/pull/375) [`296c79b`](https://github.com/t3-oss/create-t3-app/commit/296c79b9617142d727a12e9a5c4250f68f437d9d) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - feat: add option to continue and overwrite on existing directory

  for reference see: https://github.com/t3-oss/create-t3-app/issues/230

### Patch Changes

- [#394](https://github.com/t3-oss/create-t3-app/pull/394) [`52e9db7`](https://github.com/t3-oss/create-t3-app/commit/52e9db7be8eacbb1e0bb2196647f646f8af617ea) Thanks [@nadilas](https://github.com/nadilas)! - Extending the warning message for invalid client environment variables by including the reason

## 5.9.0

### Minor Changes

- [#366](https://github.com/t3-oss/create-t3-app/pull/366) [`1f43f83`](https://github.com/t3-oss/create-t3-app/commit/1f43f83261c0e6f91b6af0fb39f579845889b724) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - Thanks [@hnqg](https://github.com/hnqg) for the initial PR. add wrapper function for unstable_getServerSession

## 5.8.5

### Patch Changes

- [#357](https://github.com/t3-oss/create-t3-app/pull/357) [`b032074`](https://github.com/t3-oss/create-t3-app/commit/b03207434484d7ec3411b2d7c062a22cf425badc) Thanks [@virtuoushub](https://github.com/virtuoushub)! - chore: Sort package.json when in noInstallMode

* [#365](https://github.com/t3-oss/create-t3-app/pull/365) [`b3ce004`](https://github.com/t3-oss/create-t3-app/commit/b3ce004affb9474e53e845e8507f676e3a771de0) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - revert prisma cleint teardown from #353

## 5.8.4

### Patch Changes

- [#353](https://github.com/t3-oss/create-t3-app/pull/353) [`7a20de9`](https://github.com/t3-oss/create-t3-app/commit/7a20de9f19dfd9ae64143da112a4e3e1bfe30f52) Thanks [@Gejsi](https://github.com/Gejsi)! - Added loggers during development

## 5.8.3

### Patch Changes

- [#345](https://github.com/t3-oss/create-t3-app/pull/345) [`8ee2ea0`](https://github.com/t3-oss/create-t3-app/commit/8ee2ea0c6ca4e49f2bb9b0f5c988471947c8a7ff) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - Include `cjs` and `mjs` files in tsconfig. Thanks @timfee for reporting!

## 5.8.2

### Patch Changes

- [#330](https://github.com/t3-oss/create-t3-app/pull/330) [`5ba03fd`](https://github.com/t3-oss/create-t3-app/commit/5ba03fdf801265668c7bb89b757840ef1f8410f8) Thanks [@nexxeln](https://github.com/nexxeln)! - use auth instead of question while merging the router

## 5.8.1

### Patch Changes

- [#335](https://github.com/t3-oss/create-t3-app/pull/335) [`5745ad7`](https://github.com/t3-oss/create-t3-app/commit/5745ad796ed5647a7103bfb91e16f981152bcbe5) Thanks [@julianread](https://github.com/julianread)! - Fix invalid typeof window comparison to undefined

* [#334](https://github.com/t3-oss/create-t3-app/pull/334) [`a107f14`](https://github.com/t3-oss/create-t3-app/commit/a107f14c5981a233d118252a57066bdf1938b96c) Thanks [@c-ehrlich](https://github.com/c-ehrlich)! - fix: build fails on trpc, trpc+next

## 5.8.0

### Minor Changes

- [#324](https://github.com/t3-oss/create-t3-app/pull/324) [`fb5498c`](https://github.com/t3-oss/create-t3-app/commit/fb5498ceda6d3c528c2fe4e9a5ba4adf3dd36b10) Thanks [@juliusmarminge](https://github.com/juliusmarminge)! - feat: wrap createContext with helper function to make it independent of req/res

## 5.7.0

### Minor Changes

- 7a76c95: feat(app): add lint config for typescript

## [5.6.0](https://github.com/t3-oss/create-t3-app/compare/v5.5.0...v5.6.0) (2022-08-11)

### Features

- Include ct3a version as metadata in generated app ([#305](https://github.com/t3-oss/create-t3-app/issues/305)) ([0be4a97](https://github.com/t3-oss/create-t3-app/commit/0be4a97fdf1c7bfab78d7be2051c2b21e665c491))

### Bug Fixes

- change ! reversion to equality in env validation ([#293](https://github.com/t3-oss/create-t3-app/issues/293)) ([7822c43](https://github.com/t3-oss/create-t3-app/commit/7822c433df18011f0cc6748e2c499c0e4283386c))
- parse path returned from process.cwd() before using it ([#303](https://github.com/t3-oss/create-t3-app/issues/303)) ([b55f196](https://github.com/t3-oss/create-t3-app/commit/b55f196d0146c5c3969de4c25e7732046aad6284))

## [5.5.0](https://github.com/t3-oss/create-t3-app/compare/v5.4.0...v5.5.0) (2022-08-07)

### Features

- make session.user.id non-nullable ([#282](https://github.com/t3-oss/create-t3-app/issues/282)) ([6a81f03](https://github.com/t3-oss/create-t3-app/commit/6a81f03bfafdf77c1c82b7972a97e3e54d77935c))

## [5.4.0](https://github.com/t3-oss/create-t3-app/compare/v5.3.0...v5.4.0) (2022-08-02)

### Features

- add deployment strategy to generated README ([#258](https://github.com/t3-oss/create-t3-app/issues/258)) ([c7d4dce](https://github.com/t3-oss/create-t3-app/commit/c7d4dce182b1c306dc2a41d42483994c336843f4))
- set appName to directory on 'npx create-t3-app .' ([#273](https://github.com/t3-oss/create-t3-app/issues/273)) ([2179f2d](https://github.com/t3-oss/create-t3-app/commit/2179f2d38f74de0e3fda5661f5125d049eb4d238))

### Bug Fixes

- height on small screens ([#256](https://github.com/t3-oss/create-t3-app/issues/256)) ([fe86915](https://github.com/t3-oss/create-t3-app/commit/fe86915ced72dc979e5fe68bd56b038d9c714928))
- missing next-auth types ([#255](https://github.com/t3-oss/create-t3-app/issues/255)) ([ed42629](https://github.com/t3-oss/create-t3-app/commit/ed42629be5fb9be72abd40bbe784f2bda99eec99)), closes [#254](https://github.com/t3-oss/create-t3-app/issues/254)
- **prisma:** make db changes for next-auth on mysql obvious ([#275](https://github.com/t3-oss/create-t3-app/issues/275)) ([e9507c8](https://github.com/t3-oss/create-t3-app/commit/e9507c887e135f3e44357c618689f5cdb2f13c43))

## [5.3.0](https://github.com/t3-oss/create-t3-app/compare/v5.2.1...v5.3.0) (2022-07-25)

### Features

- add typesafe client side env variables ([#209](https://github.com/t3-oss/create-t3-app/issues/209)) ([d4cf879](https://github.com/t3-oss/create-t3-app/commit/d4cf879df811ded012a5f7cb3d91ff0bb95d87ac))
- improved logo typography ([#238](https://github.com/t3-oss/create-t3-app/issues/238)) ([48c6720](https://github.com/t3-oss/create-t3-app/commit/48c67207da48c901822e214a00285c99bb785fd8))
- updating tailwind and postcss config's to use .cjs ([#242](https://github.com/t3-oss/create-t3-app/issues/242)) ([5b97367](https://github.com/t3-oss/create-t3-app/commit/5b973670cae729c9e93b6c3c6f0b3e5b48dda904))

### Bug Fixes

- added JSDoc type to clientEnv in all env-schema ([#240](https://github.com/t3-oss/create-t3-app/issues/240)) ([9cb5ebb](https://github.com/t3-oss/create-t3-app/commit/9cb5ebbb2a0147ce15726c7e1a6c6be4065bc2dc))
- clarify some comments and rename some files in env ([#245](https://github.com/t3-oss/create-t3-app/issues/245)) ([2048783](https://github.com/t3-oss/create-t3-app/commit/2048783bd26f7f0522357a3ab1e74e6f560a221c))
- remove semicolon in \_app.tsx with next-auth to avoid early return ([1be7713](https://github.com/t3-oss/create-t3-app/commit/1be771393628631b818b46d3f3bf1ca41ad99dce))
- title being offset when using yarn/pnpm ([c881f00](https://github.com/t3-oss/create-t3-app/commit/c881f00430f606040a448eecc41e779ab0c728a7))

### [5.2.1](https://github.com/t3-oss/create-t3-app/compare/v5.2.0...v5.2.1) (2022-07-19)

### Bug Fixes

- update url in auth prisma schema ([97c9e27](https://github.com/t3-oss/create-t3-app/commit/97c9e279bf7465a47f29add10c8a6d4c9b7339a5))

## [5.2.0](https://github.com/t3-oss/create-t3-app/compare/v5.1.1...v5.2.0) (2022-07-19)

### Features

- add db.sqlite-journal to gitignore ([#221](https://github.com/t3-oss/create-t3-app/issues/221)) ([0604d21](https://github.com/t3-oss/create-t3-app/commit/0604d217f0dfe3d165013395c1a801e6bc32a17c))

### Bug Fixes

- handle pkg with version in noInstall mode ([#220](https://github.com/t3-oss/create-t3-app/issues/220)) ([5737beb](https://github.com/t3-oss/create-t3-app/commit/5737bebaab3ff6f955bf825274e25419a91642d6))
- missing DATABASE_URL ([#222](https://github.com/t3-oss/create-t3-app/issues/222)) ([b6164d8](https://github.com/t3-oss/create-t3-app/commit/b6164d8944330564e9911e47f36d82620986c8c5))
- typo - rename 'varibles' to 'variables' ([#223](https://github.com/t3-oss/create-t3-app/issues/223)) ([fc6519f](https://github.com/t3-oss/create-t3-app/commit/fc6519f66d067e4e348c7f4c00f6287dc5c40c3d))
- typo in readme ([9390400](https://github.com/t3-oss/create-t3-app/commit/9390400b8720240c650e5dbde7ca0718b7835757))

### [5.1.1](https://github.com/t3-oss/create-t3-app/compare/v5.1.0...v5.1.1) (2022-07-18)

### Bug Fixes

- add missing trpc import ([37b6283](https://github.com/t3-oss/create-t3-app/commit/37b6283bb56e44092fc9ef2d65c84e5298e51d22))

## [5.1.0](https://github.com/t3-oss/create-t3-app/compare/v5.0.0...v5.1.0) (2022-07-18)

### Features

- add trpc inference helpers ([1fcec81](https://github.com/t3-oss/create-t3-app/commit/1fcec81a74372ce5cfaf6503d63f16d5e2b12e3c))
- migrate env + next config to esm ([#205](https://github.com/t3-oss/create-t3-app/issues/205)) ([59f8ad4](https://github.com/t3-oss/create-t3-app/commit/59f8ad4f2104aa1f11508b55da75c333dce03625))

### Bug Fixes

- **#218:** lock react-query to v3 ([15ea5f1](https://github.com/t3-oss/create-t3-app/commit/15ea5f1dc8b86430a720f2eaeb6ccdfaab629892)), closes [#218](https://github.com/t3-oss/create-t3-app/issues/218)
- move gitignore rename call ([#215](https://github.com/t3-oss/create-t3-app/issues/215)) ([7111033](https://github.com/t3-oss/create-t3-app/commit/7111033d75c858041f06d69e95c51e40515457fc))

## 5.0.0 (2022-07-16)

### Features

- add check for yarn 3 ([#173](https://github.com/t3-oss/create-t3-app/issues/173)) ([cd846e1](https://github.com/t3-oss/create-t3-app/commit/cd846e16123a6bb11549276030224ec4ff1223df))
- add ci for pull requests ([0e7cdc8](https://github.com/t3-oss/create-t3-app/commit/0e7cdc8bd307e17e95bd1874af2d0eb43211530e))
- add commitlint ([#126](https://github.com/t3-oss/create-t3-app/issues/126)) ([3672aa3](https://github.com/t3-oss/create-t3-app/commit/3672aa3f4482ef592022cd94f1300b81e3fa7429))
- add CONTRIBUTING.md for newcomers ([99f8220](https://github.com/t3-oss/create-t3-app/commit/99f8220f83a6363e5aab6c0ec33260eb059c9643))
- add db.sqlite to gitignore ([#201](https://github.com/t3-oss/create-t3-app/issues/201)) ([90371c7](https://github.com/t3-oss/create-t3-app/commit/90371c7f88258b4b3e9a2689c09f67a9e439b189))
- add environment variables validation ([#147](https://github.com/t3-oss/create-t3-app/issues/147)) ([0f0b56d](https://github.com/t3-oss/create-t3-app/commit/0f0b56d2604c1ba9dccd8d2a5213f0d2a640cd68))
- add git prompt ([#130](https://github.com/t3-oss/create-t3-app/issues/130)) ([e5be271](https://github.com/t3-oss/create-t3-app/commit/e5be271612db741e3a692cd780ef84455faa115c))
- add inferQueryResponse helper for tRPC ([748800f](https://github.com/t3-oss/create-t3-app/commit/748800f060031da58ce2b45bd65e4fd83266ce5c))
- add main as initial branch ([7b94005](https://github.com/t3-oss/create-t3-app/commit/7b94005fd515d140176e639a487ab5035a290125))
- add next-auth config to env-example [#108](https://github.com/t3-oss/create-t3-app/issues/108) ([c3ab997](https://github.com/t3-oss/create-t3-app/commit/c3ab997f149ee3635d2d33a67650e95e04877d5b))
- add noInstall flag and prompt ([#133](https://github.com/t3-oss/create-t3-app/issues/133)) ([7ff0fca](https://github.com/t3-oss/create-t3-app/commit/7ff0fcacc3b94a4fd15d0db25e2efc09131d73c9))
- add standard-version ([#125](https://github.com/t3-oss/create-t3-app/issues/125)) ([0fc6b47](https://github.com/t3-oss/create-t3-app/commit/0fc6b479c99c76ab830a81d011ba0e4ef90ce849))
- add tRPC inference helper docs commment on utils ([3e784cb](https://github.com/t3-oss/create-t3-app/commit/3e784cbf3f9b4f6eeb4441a881ebbd028f311957))
- added windows build support ([29acbf8](https://github.com/t3-oss/create-t3-app/commit/29acbf816c69f980454568946fba1afea6be114c))
- better ui for templates ([e2e8c7e](https://github.com/t3-oss/create-t3-app/commit/e2e8c7eeeab576d730cd1c7e397497460c1787e0))
- better validation and add path support ([#135](https://github.com/t3-oss/create-t3-app/issues/135)) ([e50cb8a](https://github.com/t3-oss/create-t3-app/commit/e50cb8a3e13126de628d098e00650a52753681f3))
- check if dir is empty ([71bbdba](https://github.com/t3-oss/create-t3-app/commit/71bbdbae564d6e7df4b08645db59a8364b891b99))
- make the ui symmetric ([19df71e](https://github.com/t3-oss/create-t3-app/commit/19df71ec53fd64e60b27ecd055cd9f0c6acc4a63))

### Bug Fixes

- add newline at the end of the file ([64eee1c](https://github.com/t3-oss/create-t3-app/commit/64eee1c8058aa5d2ec29fc1903ee63819fa8fc9d))
- add scripts for CI ([539f3fd](https://github.com/t3-oss/create-t3-app/commit/539f3fdc44e1d96e5429f21afbb74f71bf4d963d))
- add semantic elements and update tw classes on tw pages ([#151](https://github.com/t3-oss/create-t3-app/issues/151)) ([61d6819](https://github.com/t3-oss/create-t3-app/commit/61d6819f14ac5b65c779081c91ca894f724f7b16))
- bumped package.json for beta-release ([3fe35f1](https://github.com/t3-oss/create-t3-app/commit/3fe35f14313da611cb16e26141e06d1afb5efb78))
- change comment in .env to discord ([d992713](https://github.com/t3-oss/create-t3-app/commit/d992713cad08c08267a0f018fa8582b569a554db))
- **cli:** use correct spelling, fix short choices ([7776aa9](https://github.com/t3-oss/create-t3-app/commit/7776aa9fc03293f27d9e27808cd03810f96ccc33))
- conditionally run envVars installer ([#196](https://github.com/t3-oss/create-t3-app/issues/196)) ([f5f4f62](https://github.com/t3-oss/create-t3-app/commit/f5f4f6275c1a967f6de2e7c6d40d9a7731a3830b))
- docs wrong format ([3d2dbb0](https://github.com/t3-oss/create-t3-app/commit/3d2dbb06cadb42d24f134ce09edc5a371d79aff9))
- dont prompt for typesafe env-vars ([2faee56](https://github.com/t3-oss/create-t3-app/commit/2faee56720c39d770ebe05d15e3fb2aaacaf704e))
- eslint warning (import/no-anonymous-default-export) ([a1cce55](https://github.com/t3-oss/create-t3-app/commit/a1cce5546a8fd6efb79c65a2f2b52d4c597dafd0))
- fixed some typos ([#131](https://github.com/t3-oss/create-t3-app/issues/131)) ([a86466e](https://github.com/t3-oss/create-t3-app/commit/a86466eb0bc1ef51a1c8ba1b96938dc1bd7dfbbb))
- format contributing.md ([4111476](https://github.com/t3-oss/create-t3-app/commit/41114766582ca33fb2a3fd0b566e609a6dd3e861))
- handle git projects correctly ([3ed897f](https://github.com/t3-oss/create-t3-app/commit/3ed897ff49c06f6d70d49aee31d5c3741fced96e))
- incompatible git version ([#127](https://github.com/t3-oss/create-t3-app/issues/127)) ([34f44f8](https://github.com/t3-oss/create-t3-app/commit/34f44f817df52b317afea5b8d55c87eea487833f))
- invalid pnpm action version ([2a1f6e3](https://github.com/t3-oss/create-t3-app/commit/2a1f6e32aedb8f86ee7ca403e481be8e474b76b2))
- language prompt short answer should both be ts ([#142](https://github.com/t3-oss/create-t3-app/issues/142)) ([5e4f80d](https://github.com/t3-oss/create-t3-app/commit/5e4f80d7aa930f16add3bb2273a23f5829548f49))
- **markup:** multiple h1 replaced to h2 ([6bf9040](https://github.com/t3-oss/create-t3-app/commit/6bf90407b9a9774348a77927d37c47f3ded5552a))
- **prompts:** show correct package manager in prompts ([#153](https://github.com/t3-oss/create-t3-app/issues/153)) ([fe66ae9](https://github.com/t3-oss/create-t3-app/commit/fe66ae9f60cbe6a2e429be406a1cd548c51e7bbd))
- properly display the welcome title when installing with Yarn ([#160](https://github.com/t3-oss/create-t3-app/issues/160)) ([a5b9d53](https://github.com/t3-oss/create-t3-app/commit/a5b9d534e6395e494dcfab8419e71bf201b7326b))
- provide cwd inside git init exec call ([9679492](https://github.com/t3-oss/create-t3-app/commit/9679492ebd9175973c99d647cf11a4f1b979a505))
- reapply style fixes on tw pages ([#189](https://github.com/t3-oss/create-t3-app/issues/189)) ([af1067b](https://github.com/t3-oss/create-t3-app/commit/af1067b196205b0dd70a44571c62012d9667987e)), closes [#178](https://github.com/t3-oss/create-t3-app/issues/178)
- remove changeset from repo ([#134](https://github.com/t3-oss/create-t3-app/issues/134)) ([d58b380](https://github.com/t3-oss/create-t3-app/commit/d58b380ed4310021a771e05037a6054176c14b91))
- remove duplicated types ([#138](https://github.com/t3-oss/create-t3-app/issues/138)) ([e4c8e33](https://github.com/t3-oss/create-t3-app/commit/e4c8e336fff94bd125cac06f4bfa4d5eb365dd54))
- remove unncesary import on auth router ([abdc61f](https://github.com/t3-oss/create-t3-app/commit/abdc61ffc18dd4f1e82f3fc02cd87a2144d0cc03))
- run prettier ([9961645](https://github.com/t3-oss/create-t3-app/commit/99616456d54abde5b458d57add1132dcb2b68256))
- standardize log messages ([83a13b9](https://github.com/t3-oss/create-t3-app/commit/83a13b9963f83317a62e3eeaed14dd5e2cb45344))
- **template:** converting to use tech props and remove tw from template ([#183](https://github.com/t3-oss/create-t3-app/issues/183)) ([b2d542a](https://github.com/t3-oss/create-t3-app/commit/b2d542a44eed0aa699fe91e52f25f6ac68a0021c))
- **templates:** h1 restored ([e51e03d](https://github.com/t3-oss/create-t3-app/commit/e51e03d93a899674bef839ddb215a36e62397e26))
- type entrire app and not just the props ([908630e](https://github.com/t3-oss/create-t3-app/commit/908630e5cc14789b88a0ddf6dd097fb14eb9068a))
- typo in "Javascript" ([#136](https://github.com/t3-oss/create-t3-app/issues/136)) ([6873a7a](https://github.com/t3-oss/create-t3-app/commit/6873a7a5ff17c6efda1b78fe73597ec43821552c))
- update templates ([4418f1d](https://github.com/t3-oss/create-t3-app/commit/4418f1db06a29050293f0d4dd16a1347d34c6cf9))
- use components for the tech within the splash screen ([#178](https://github.com/t3-oss/create-t3-app/issues/178)) ([c436382](https://github.com/t3-oss/create-t3-app/commit/c4363821664fe95b4301d46b3e2d34fbeb14952d))
- with-tw removed unused styles and added motion saftey ([#148](https://github.com/t3-oss/create-t3-app/issues/148)) ([598ed0e](https://github.com/t3-oss/create-t3-app/commit/598ed0eda73e5218658ff7d574e28ecc25a4e2cb))

## 4.4.1

### Patch Changes

- changed ui for template

## 4.4.0

### Minor Changes

- improve ui examples of template app

## 4.3.5

### Patch Changes

- add warning for old git versions

## 4.3.4

### Patch Changes

- improve template styling

## 4.3.3

### Patch Changes

- Add description for packages in the template

## 4.3.2

### Patch Changes

- Redesign pages

## 4.3.0

### Minor Changes

- added Next-Auth protected routes when using tRPC

## 4.2.12

### Patch Changes

- upgrade next to 12.2.0

## 4.2.11

### Patch Changes

- modified the title to print a colorful ascii art

## 4.2.10

### Patch Changes

- add warning about next-auth when using Node 18

## 4.2.9

### Patch Changes

- fix resolved path to package root

## 4.2.8

### Patch Changes

- diable version flag

## 4.2.2

### Patch Changes

- fix esm issues

## 4.2.1

### Patch Changes

- trying to fix esm error

## 4.2.0

### Minor Changes

- a548f22: added cli args, esm support

## 4.1.1

### Patch Changes

- Updated package to full ESM support

## 4.1.0

### Minor Changes

- Create-t3-app now accepts args!

  When calling create-t3-app, you can specify the app name and directory directly from the cli.

  Additonal options are visable by passing -h or --help into the command line

## 4.0.8

### Patch Changes

- added loading spinners

## 4.0.7

### Patch Changes

- added tsup as build tool

## 4.0.6

### Patch Changes

- Added dev tooling.


================================================
FILE: cli/README.md
================================================
<p align="center">
  <picture>
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/t3-oss/create-t3-app/99286f37324330ecdf75132fae1f246440a88035/www/public/images/t3-light.svg">
  <img src="https://raw.githubusercontent.com/t3-oss/create-t3-app/99286f37324330ecdf75132fae1f246440a88035/www/public/images/t3-dark.svg" width="130" alt="Logo for T3">
</picture>
</p>

<h1 align="center">
  create-t3-app
</h1>

<p align="center">
  Interactive CLI to start a full-stack, typesafe Next.js app.
</p>

<p align="center">
  Get started with the <a rel="noopener noreferrer" target="_blank" href="https://init.tips">T3 Stack</a> by running <code>npm create t3-app@latest</code>
</p>

<div align="center">

[![PRs-Welcome][contribute-image]][contribute-url] [![Discord](https://img.shields.io/discord/966627436387266600?color=%235865F2&label=Discord&logo=discord&logoColor=%23fff)](https://t3.gg/discord) [![NPM version][npm-image]][npm-url]
[![Downloads][downloads-image]][npm-url]

</div>

<a href="http://www.youtube.com/watch?v=PbjHxIuHduU" target="_blank">
  <p align="center">
    <img src="https://t3.gg/random/T3%20Stack%20V4.png" alt="Video thumbnail of Theo with an indecipherable expression on his face" width="320" />
  </p>
</a>

<a href="http://www.youtube.com/watch?v=PbjHxIuHduU" target="_blank">
  <p align="center">Watch Theo's overview on Youtube here</p>
</a>

## Table of contents

- <a href="#about">The T3 Stack</a>
- <a href="#axioms">T3 Axioms</a>
- <a href="#getting-started">Getting Started</a>
- <a href="#community">Community</a>
- <a href="#contributors">Contributors</a>

<h2 id="about">The T3 Stack</h2>

The _"T3 Stack"_ is a web development stack made by [Theo](https://twitter.com/t3dotgg) focused on **simplicity**, **modularity**, and **full-stack typesafety**. It consists of:

- [Next.js](https://nextjs.org)
- [tRPC](https://trpc.io)
- [Tailwind CSS](https://tailwindcss.com)
- [TypeScript](https://typescriptlang.org)
- [Prisma](https://prisma.io)
- [Drizzle](https://orm.drizzle.team)
- [NextAuth.js](https://next-auth.js.org)

### So... what is `create-t3-app`? A template?

Kind of? `create-t3-app` is a CLI built by seasoned T3 Stack devs to streamline the setup of a modular T3 Stack app. This means each piece is optional, and the "template" is generated based on your specific needs.

After countless projects and many years on this tech, we have lots of opinions and insights. We’ve done our best to encode them into this CLI.

This is **NOT** an all-inclusive template. We **expect** you to bring your own libraries that solve the needs of **YOUR** application. While we don’t want to prescribe solutions to more specific problems like state management and deployment, we [do have some recommendations listed here](https://create.t3.gg/en/other-recs).

<h2 id="axioms">T3 Axioms</h2>

We'll be frank - this is an _opinionated project_. We share a handful of core beliefs around building and we treat them as the basis for our decisions.

### 1. Solve Problems

It's easy to fall into the trap of "adding everything" - we explicitly _don't_ want to do that. Everything added to `create-t3-app` should solve a _specific_ problem that exists within the core technologies included. This means we **won't** add things like state libraries (`zustand`, `redux`) but we **will** add things like NextAuth.js and integrate Prisma and tRPC for you.

### 2. Bleed Responsibly

We love our bleeding edge tech. The amount of speed and, honestly, _fun_ that comes out of new shit is really cool. We think it's important to **bleed responsibly**, using riskier tech in the less risky parts. This means we **wouldn't** ⛔️ bet on risky new database tech (SQL is great!). But we **happily** ✅ bet on tRPC since it's just functions that are trivial to move off.

### 3. Typesafety Isn't Optional

The stated goal of `create-t3-app` is to provide the quickest way to start a new full-stack, typesafe web application. We take typesafety seriously in these parts as it improves our productivity and helps us ship fewer bugs. Any decision that compromises the typesafe nature of `create-t3-app` is a decision that should be made in a different project.

<h2 id="getting-started">Getting Started</h2>

To scaffold an app using `create-t3-app`, run any of the following four commands and answer the command prompt questions:

### npm

```bash
npm create t3-app@latest
```

### yarn

```bash
yarn create t3-app
```

### pnpm

```bash
pnpm create t3-app@latest
```

### bun

```bash
bun create t3-app@latest
```

For more advanced usage, check out the [CLI docs](https://create.t3.gg/en/installation).

<h2 id="community">Community</h2>

For help, discussion about best practices, or any other conversation that would benefit create-t3-app:

[Join the T3 Discord Server](https://t3.gg/discord)

<h2 id="contributors">Contributors</h2>

We 💖 contributors! Feel free to contribute to this project but **please read the [Contributing Guidelines](CONTRIBUTING.md) before opening an issue or PR** so you understand the branching strategy and local development environment. We also welcome you to join our [Discord](https://discord.gg/tEAQjDseSX) community for either support or contributing guidance.

<a href="https://github.com/t3-oss/create-t3-app/graphs/contributors">
  <p align="center">
    <img width="720" src="https://contrib.rocks/image?repo=t3-oss/create-t3-app" alt="A table of avatars from the project's contributors" />
  </p>
</a>

<p align="center">
  Made with <a rel="noopener noreferrer" target="_blank" href="https://contrib.rocks">contrib.rocks</a>
</p>

<p align="center">
  <a rel="noopener noreferrer" target="_blank" href="https://vercel.com/?utm_source=t3-oss&utm_campaign=oss">
    <img height="34px" src="https://www.datocms-assets.com/31049/1618983297-powered-by-vercel.svg" alt="Powered by vercel">
  </a>
</p>

[downloads-image]: https://img.shields.io/npm/dm/create-t3-app?color=364fc7&logoColor=364fc7
[npm-url]: https://www.npmjs.com/package/create-t3-app
[npm-image]: https://img.shields.io/npm/v/create-t3-app?color=0b7285&logoColor=0b7285
[contribute-url]: https://github.com/t3-oss/create-t3-app/blob/main/CONTRIBUTING.md
[contribute-image]: https://img.shields.io/badge/PRs-welcome-blue.svg


================================================
FILE: cli/eslint.config.js
================================================
// @ts-check
import tseslint from "typescript-eslint";
// import isaacscript from "eslint-plugin-isaacscript";
import importPlugin from "eslint-plugin-import-x";

export default tseslint.config(
  { ignores: ["dist", "*.config.*"] },
  {
    files: ["**/*.{ts,tsx}"],
    plugins: {
      // isaacscript, // REENABLE
      "import-x": importPlugin,
    },
    extends: [
      ...tseslint.configs.recommended,
    ],
    rules: {
      "@typescript-eslint/no-unused-vars": [
        "error",
        { argsIgnorePattern: "^_", destructuredArrayIgnorePattern: "^_" },
      ],
      "@typescript-eslint/consistent-type-imports": [
        "error",
        { prefer: "type-imports", fixStyle: "inline-type-imports" },
      ],
      "import-x/consistent-type-specifier-style": ["error", "prefer-inline"],

      // // For educational purposes we format our comments/jsdoc nicely
      // "isaacscript/complete-sentences-jsdoc": "warn",
      // "isaacscript/format-jsdoc-comments": "warn",

      // These lint rules don't make sense for us but are enabled in the preset configs
      "@typescript-eslint/no-confusing-void-expression": "off",
      "@typescript-eslint/restrict-template-expressions": "off",

      // This rule doesn't seem to be working properly
      "@typescript-eslint/prefer-nullish-coalescing": "off",
    },
  },
  {
    files: ["src/**/*.{ts,tsx}"],
    extends: [
      ...tseslint.configs.recommendedTypeChecked,
      ...tseslint.configs.stylisticTypeChecked,
    ],
    rules: {
      "@typescript-eslint/no-explicit-any": "error",
    },
  },
  {
    // Template files don't have reliable type information
    files: ["./template/**/*.{ts,tsx}"],
    extends: [tseslint.configs.disableTypeChecked],
  },
  {
    linterOptions: {
      reportUnusedDisableDirectives: true,
    },
    languageOptions: {
      sourceType: "module",
      parserOptions: {
        project: [
          "./tsconfig.eslint.json",
        ],
        // projectService: {
        //   defaultProject: "tsconfig.eslint.json",
        // },
        tsconfigRootDir: import.meta.dirname,
      },
    },
  },
);


================================================
FILE: cli/package.json
================================================
{
  "name": "create-t3-app",
  "version": "7.40.0",
  "description": "Create web application with the t3 stack",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/t3-oss/create-t3-app.git",
    "directory": "cli"
  },
  "keywords": [
    "create-t3-app",
    "init.tips",
    "next.js",
    "t3-stack",
    "tailwind",
    "tRPC",
    "typescript"
  ],
  "type": "module",
  "exports": "./dist/index.js",
  "bin": {
    "create-t3-app": "./dist/index.js"
  },
  "files": [
    "dist",
    "template",
    "README.md",
    "LICENSE",
    "CHANGELOG.md",
    ".yarnrc.yml",
    "package.json"
  ],
  "engines": {
    "node": ">=18.17.0"
  },
  "scripts": {
    "typecheck": "tsc",
    "build": "tsup",
    "dev": "tsup --watch",
    "clean": "rm -rf dist .turbo node_modules",
    "start": "node dist/index.js",
    "lint": "eslint",
    "lint:fix": "pnpm lint --fix",
    "format": "prettier '**/*.{cjs,mjs,ts,tsx,md,json}' --ignore-path ../.gitignore --ignore-unknown --no-error-on-unmatched-pattern --write",
    "format:check": "prettier '**/*.{cjs,mjs,ts,tsx,md,json}' --ignore-path ../.gitignore --ignore-unknown --no-error-on-unmatched-pattern --check",
    "release": "changeset version",
    "pub:beta": "pnpm build && npm publish --tag beta",
    "pub:next": "pnpm build && npm publish --tag next",
    "pub:release": "pnpm build && npm publish"
  },
  "dependencies": {
    "@clack/core": "^0.3.4",
    "@clack/prompts": "^0.6.3",
    "@ianvs/prettier-plugin-sort-imports": "^4.2.1",
    "chalk": "5.2.0",
    "commander": "^10.0.1",
    "execa": "^7.2.0",
    "fs-extra": "^11.2.0",
    "gradient-string": "^2.0.2",
    "ora": "6.3.1",
    "sort-package-json": "^2.10.0"
  },
  "devDependencies": {
    "@auth/drizzle-adapter": "^1.1.0",
    "@auth/prisma-adapter": "^1.6.0",
    "@libsql/client": "^0.14.0",
    "@planetscale/database": "^1.19.0",
    "@prisma/adapter-planetscale": "^6.6.0",
    "@prisma/client": "^6.6.0",
    "@t3-oss/env-nextjs": "^0.12.0",
    "@tailwindcss/postcss": "^4.0.15",
    "@tanstack/react-query": "^5.69.0",
    "@trpc/client": "11.0.0",
    "@trpc/next": "11.0.0",
    "@trpc/react-query": "11.0.0",
    "@trpc/server": "11.0.0",
    "@types/fs-extra": "^11.0.4",
    "@types/gradient-string": "^1.1.6",
    "@types/node": "^24.10.1",
    "better-auth": "^1.3",
    "drizzle-kit": "^0.30.5",
    "drizzle-orm": "^0.41.0",
    "mysql2": "^3.11.0",
    "next": "^15.5.9",
    "next-auth": "^4.24.7",
    "postgres": "^3.4.4",
    "prettier": "^3.5.3",
    "prettier-plugin-tailwindcss": "^0.6.11",
    "prisma": "^6.6.0",
    "react": "^19.2.3",
    "react-dom": "^19.2.3",
    "superjson": "^2.2.1",
    "tailwindcss": "^4.0.15",
    "tsup": "^6.7.0",
    "type-fest": "^3.13.1",
    "typescript": "^5.8.2",
    "zod": "^3.24.2"
  }
}


================================================
FILE: cli/prettier.config.mjs
================================================
import baseConfig from "../prettier.config.mjs";

/**
 * @type {import('prettier').Config & import('prettier-plugin-tailwindcss').PluginOptions &
 *       import("@ianvs/prettier-plugin-sort-imports").PluginConfig}
 */
const config = {
  ...baseConfig,
  arrowParens: "always",
  plugins: [
    "@ianvs/prettier-plugin-sort-imports",
    "prettier-plugin-tailwindcss",
  ],
  tailwindConfig: "./template/extras/config/tailwind.config.ts",
  trailingComma: "es5",
  importOrder: ["<THIRD_PARTY_MODULES>", "", "^~/", "^[.][.]/", "^[.]/"],
  importOrderParserPlugins: ["typescript", "jsx", "decorators-legacy"],
  importOrderTypeScriptVersion: "4.4.0",
};

export default config;


================================================
FILE: cli/src/cli/index.ts
================================================
import * as p from "@clack/prompts";
import chalk from "chalk";
import { Command } from "commander";

import { CREATE_T3_APP, DEFAULT_APP_NAME } from "~/consts.js";
import {
  databaseProviders,
  type AvailablePackages,
  type DatabaseProvider,
} from "~/installers/index.js";
import { getVersion } from "~/utils/getT3Version.js";
import { getUserPkgManager } from "~/utils/getUserPkgManager.js";
import { IsTTYError } from "~/utils/isTTYError.js";
import { logger } from "~/utils/logger.js";
import { validateAppName } from "~/utils/validateAppName.js";
import { validateImportAlias } from "~/utils/validateImportAlias.js";

interface CliFlags {
  noGit: boolean;
  noInstall: boolean;
  default: boolean;
  importAlias: string;

  /** @internal Used in CI. */
  CI: boolean;
  /** @internal Used in CI. */
  tailwind: boolean;
  /** @internal Used in CI. */
  trpc: boolean;
  /** @internal Used in CI. */
  prisma: boolean;
  /** @internal Used in CI. */
  drizzle: boolean;
  /** @internal Used in CI. */
  nextAuth: boolean;
  /** @internal Used in CI. */
  betterAuth: boolean;
  /** @internal Used in CI. */
  appRouter: boolean;
  /** @internal Used in CI. */
  dbProvider: DatabaseProvider;
  /** @internal Used in CI */
  eslint: boolean;
  /** @internal Used in CI */
  biome: boolean;
}

interface CliResults {
  appName: string;
  packages: AvailablePackages[];
  flags: CliFlags;
  databaseProvider: DatabaseProvider;
}

const defaultOptions: CliResults = {
  appName: DEFAULT_APP_NAME,
  packages: ["nextAuth", "prisma", "tailwind", "trpc", "eslint"],
  flags: {
    noGit: false,
    noInstall: false,
    default: false,
    CI: false,
    tailwind: false,
    trpc: false,
    prisma: false,
    drizzle: false,
    nextAuth: false,
    betterAuth: false,
    importAlias: "~/",
    appRouter: false,
    dbProvider: "sqlite",
    eslint: false,
    biome: false,
  },
  databaseProvider: "sqlite",
};

export const runCli = async (): Promise<CliResults> => {
  const cliResults = defaultOptions;

  const program = new Command()
    .name(CREATE_T3_APP)
    .description("A CLI for creating web applications with the t3 stack")
    .argument(
      "[dir]",
      "The name of the application, as well as the name of the directory to create"
    )
    .option(
      "--noGit",
      "Explicitly tell the CLI to not initialize a new git repo in the project",
      false
    )
    .option(
      "--noInstall",
      "Explicitly tell the CLI to not run the package manager's install command",
      false
    )
    .option(
      "-y, --default",
      "Bypass the CLI and use all default options to bootstrap a new t3-app",
      false
    )
    /** START CI-FLAGS */
    /**
     * @experimental Used for CI E2E tests. If any of the following option-flags are provided, we
     *               skip prompting.
     */
    .option("--CI", "Boolean value if we're running in CI", false)
    /** @experimental - Used for CI E2E tests. Used in conjunction with `--CI` to skip prompting. */
    .option(
      "--tailwind [boolean]",
      "Experimental: Boolean value if we should install Tailwind CSS. Must be used in conjunction with `--CI`.",
      (value) => !!value && value !== "false"
    )
    /** @experimental Used for CI E2E tests. Used in conjunction with `--CI` to skip prompting. */
    .option(
      "--nextAuth [boolean]",
      "Experimental: Boolean value if we should install NextAuth.js. Must be used in conjunction with `--CI`.",
      (value) => !!value && value !== "false"
    )
    /** @experimental Used for CI E2E tests. Used in conjunction with `--CI` to skip prompting. */
    .option(
      "--betterAuth [boolean]",
      "Experimental: Boolean value if we should install BetterAuth. Must be used in conjunction with `--CI`.",
      (value) => !!value && value !== "false"
    )
    /** @experimental - Used for CI E2E tests. Used in conjunction with `--CI` to skip prompting. */
    .option(
      "--prisma [boolean]",
      "Experimental: Boolean value if we should install Prisma. Must be used in conjunction with `--CI`.",
      (value) => !!value && value !== "false"
    )
    /** @experimental - Used for CI E2E tests. Used in conjunction with `--CI` to skip prompting. */
    .option(
      "--drizzle [boolean]",
      "Experimental: Boolean value if we should install Drizzle. Must be used in conjunction with `--CI`.",
      (value) => !!value && value !== "false"
    )
    /** @experimental - Used for CI E2E tests. Used in conjunction with `--CI` to skip prompting. */
    .option(
      "--trpc [boolean]",
      "Experimental: Boolean value if we should install tRPC. Must be used in conjunction with `--CI`.",
      (value) => !!value && value !== "false"
    )
    /** @experimental - Used for CI E2E tests. Used in conjunction with `--CI` to skip prompting. */
    .option(
      "-i, --import-alias [alias]",
      "Explicitly tell the CLI to use a custom import alias",
      defaultOptions.flags.importAlias
    )
    .option(
      "--dbProvider [provider]",
      `Choose a database provider to use. Possible values: ${databaseProviders.join(
        ", "
      )}`,
      defaultOptions.flags.dbProvider
    )
    .option(
      "--appRouter [boolean]",
      "Explicitly tell the CLI to use the new Next.js app router",
      (value) => !!value && value !== "false"
    )
    .option(
      "--eslint [boolean]",
      "Experimental: Boolean value if we should install eslint and prettier. Must be used in conjunction with `--CI`.",
      (value) => !!value && value !== "false"
    )
    .option(
      "--biome [boolean]",
      "Experimental: Boolean value if we should install biome. Must be used in conjunction with `--CI`.",
      (value) => !!value && value !== "false"
    )
    /** END CI-FLAGS */
    .version(getVersion(), "-v, --version", "Display the version number")
    .addHelpText(
      "afterAll",
      `\n The t3 stack was inspired by ${chalk
        .hex("#E8DCFF")
        .bold(
          "@t3dotgg"
        )} and has been used to build awesome fullstack applications like ${chalk
        .hex("#E24A8D")
        .underline("https://ping.gg")} \n`
    )
    .parse(process.argv);

  // FIXME: TEMPORARY WARNING WHEN USING YARN 3. SEE ISSUE #57
  if (process.env.npm_config_user_agent?.startsWith("yarn/3")) {
    logger.warn(`  WARNING: It looks like you are using Yarn 3. This is currently not supported,
  and likely to result in a crash. Please run create-t3-app with another
  package manager such as pnpm, npm, or Yarn Classic.
  See: https://github.com/t3-oss/create-t3-app/issues/57`);
  }

  // Needs to be separated outside the if statement to correctly infer the type as string | undefined
  const cliProvidedName = program.args[0];
  if (cliProvidedName) {
    cliResults.appName = cliProvidedName;
  }

  cliResults.flags = program.opts();

  /** @internal Used for CI E2E tests. */
  if (cliResults.flags.CI) {
    cliResults.packages = [];
    if (cliResults.flags.trpc) cliResults.packages.push("trpc");
    if (cliResults.flags.tailwind) cliResults.packages.push("tailwind");
    if (cliResults.flags.prisma) cliResults.packages.push("prisma");
    if (cliResults.flags.drizzle) cliResults.packages.push("drizzle");
    if (cliResults.flags.nextAuth) cliResults.packages.push("nextAuth");
    if (cliResults.flags.betterAuth) cliResults.packages.push("betterAuth");
    if (cliResults.flags.eslint) cliResults.packages.push("eslint");
    if (cliResults.flags.biome) cliResults.packages.push("biome");
    if (cliResults.flags.prisma && cliResults.flags.drizzle) {
      // We test a matrix of all possible combination of packages in CI. Checking for impossible
      // combinations here and exiting gracefully is easier than changing the CI matrix to exclude
      // invalid combinations. We are using an "OK" exit code so CI continues with the next combination.
      logger.warn("Incompatible combination Prisma + Drizzle. Exiting.");
      process.exit(0);
    }
    if (cliResults.flags.biome && cliResults.flags.eslint) {
      logger.warn("Incompatible combination Biome + ESLint. Exiting.");
      process.exit(0);
    }
    if (cliResults.flags.nextAuth && cliResults.flags.betterAuth) {
      logger.warn("Incompatible combination NextAuth + BetterAuth. Exiting.");
      process.exit(0);
    }
    if (databaseProviders.includes(cliResults.flags.dbProvider) === false) {
      logger.warn(
        `Incompatible database provided. Use: ${databaseProviders.join(", ")}. Exiting.`
      );
      process.exit(0);
    }

    cliResults.databaseProvider =
      cliResults.packages.includes("drizzle") ||
      cliResults.packages.includes("prisma")
        ? cliResults.flags.dbProvider
        : "sqlite";

    return cliResults;
  }

  if (cliResults.flags.default) {
    return cliResults;
  }

  // Explained below why this is in a try/catch block
  try {
    if (process.env.TERM_PROGRAM?.toLowerCase().includes("mintty")) {
      logger.warn(`  WARNING: It looks like you are using MinTTY, which is non-interactive. This is most likely because you are
  using Git Bash. If that's that case, please use Git Bash from another terminal, such as Windows Terminal. Alternatively, you
  can provide the arguments from the CLI directly: https://create.t3.gg/en/installation#experimental-usage to skip the prompts.`);

      throw new IsTTYError("Non-interactive environment");
    }

    // if --CI flag is set, we are running in CI mode and should not prompt the user

    const pkgManager = getUserPkgManager();

    const project = await p.group(
      {
        ...(!cliProvidedName && {
          name: () =>
            p.text({
              message: "What will your project be called?",
              defaultValue: cliProvidedName,
              validate: validateAppName,
            }),
        }),
        language: () => {
          return p.select({
            message: "Will you be using TypeScript or JavaScript?",
            options: [
              { value: "typescript", label: "TypeScript" },
              { value: "javascript", label: "JavaScript" },
            ],
            initialValue: "typescript",
          });
        },
        _: ({ results }) =>
          results.language === "javascript"
            ? p.note(chalk.redBright("Wrong answer, using TypeScript instead"))
            : undefined,
        styling: () => {
          return p.confirm({
            message: "Will you be using Tailwind CSS for styling?",
          });
        },
        trpc: () => {
          return p.confirm({
            message: "Would you like to use tRPC?",
          });
        },
        authentication: () => {
          return p.select({
            message: "What authentication provider would you like to use?",
            options: [
              { value: "none", label: "None" },
              { value: "next-auth", label: "NextAuth.js" },
              { value: "better-auth", label: "BetterAuth" },
              // Maybe later
              // { value: "clerk", label: "Clerk" },
            ],
            initialValue: "none",
          });
        },
        database: () => {
          return p.select({
            message: "What database ORM would you like to use?",
            options: [
              { value: "none", label: "None" },
              { value: "prisma", label: "Prisma" },
              { value: "drizzle", label: "Drizzle" },
            ],
            initialValue: "none",
          });
        },
        appRouter: () => {
          return p.confirm({
            message: "Would you like to use Next.js App Router?",
            initialValue: true,
          });
        },
        databaseProvider: ({ results }) => {
          if (results.database === "none") return;
          return p.select({
            message: "What database provider would you like to use?",
            options: [
              { value: "sqlite", label: "SQLite (LibSQL)" },
              { value: "mysql", label: "MySQL" },
              { value: "postgres", label: "PostgreSQL" },
              { value: "planetscale", label: "PlanetScale" },
            ],
            initialValue: "sqlite",
          });
        },
        linter: () => {
          return p.select({
            message:
              "Would you like to use ESLint and Prettier or Biome for linting and formatting?",
            options: [
              { value: "eslint", label: "ESLint/Prettier" },
              { value: "biome", label: "Biome" },
            ],
            initialValue: "eslint",
          });
        },
        ...(!cliResults.flags.noGit && {
          git: () => {
            return p.confirm({
              message:
                "Should we initialize a Git repository and stage the changes?",
              initialValue: !defaultOptions.flags.noGit,
            });
          },
        }),
        ...(!cliResults.flags.noInstall && {
          install: () => {
            return p.confirm({
              message:
                `Should we run '${pkgManager}` +
                (pkgManager === "yarn" ? `'?` : ` install' for you?`),
              initialValue: !defaultOptions.flags.noInstall,
            });
          },
        }),
        importAlias: () => {
          return p.text({
            message: "What import alias would you like to use?",
            defaultValue: defaultOptions.flags.importAlias,
            placeholder: defaultOptions.flags.importAlias,
            validate: validateImportAlias,
          });
        },
      },
      {
        onCancel() {
          process.exit(1);
        },
      }
    );

    const packages: AvailablePackages[] = [];
    if (project.styling) packages.push("tailwind");
    if (project.trpc) packages.push("trpc");
    if (project.authentication === "next-auth") packages.push("nextAuth");
    if (project.authentication === "better-auth") packages.push("betterAuth");
    if (project.database === "prisma") packages.push("prisma");
    if (project.database === "drizzle") packages.push("drizzle");
    if (project.linter === "eslint") packages.push("eslint");
    if (project.linter === "biome") packages.push("biome");

    return {
      appName: project.name ?? cliResults.appName,
      packages,
      databaseProvider:
        (project.databaseProvider as DatabaseProvider) || "sqlite",
      flags: {
        ...cliResults.flags,
        appRouter: project.appRouter ?? cliResults.flags.appRouter,
        noGit: !project.git || cliResults.flags.noGit,
        noInstall: !project.install || cliResults.flags.noInstall,
        importAlias: project.importAlias ?? cliResults.flags.importAlias,
      },
    };
  } catch (err) {
    // If the user is not calling create-t3-app from an interactive terminal, inquirer will throw an IsTTYError
    // If this happens, we catch the error, tell the user what has happened, and then continue to run the program with a default t3 app
    if (err instanceof IsTTYError) {
      logger.warn(`
  ${CREATE_T3_APP} needs an interactive terminal to provide options`);

      const shouldContinue = await p.confirm({
        message: `Continue scaffolding a default T3 app?`,
        initialValue: true,
      });

      if (!shouldContinue) {
        logger.info("Exiting...");
        process.exit(0);
      }

      logger.info(`Bootstrapping a default T3 app in ./${cliResults.appName}`);
    } else {
      throw err;
    }
  }

  return cliResults;
};


================================================
FILE: cli/src/consts.ts
================================================
import path from "path";
import { fileURLToPath } from "url";

// With the move to TSUP as a build tool, this keeps path routes in other files (installers, loaders, etc) in check more easily.
// Path is in relation to a single index.js file inside ./dist
const __filename = fileURLToPath(import.meta.url);
const distPath = path.dirname(__filename);
export const PKG_ROOT = path.join(distPath, "../");

//export const PKG_ROOT = path.dirname(require.main.filename);

export const TITLE_TEXT = `   ___ ___ ___   __ _____ ___   _____ ____    __   ___ ___
  / __| _ \\ __| /  \\_   _| __| |_   _|__ /   /  \\ | _ \\ _ \\
 | (__|   / _| / /\\ \\| | | _|    | |  |_ \\  / /\\ \\|  _/  _/
  \\___|_|_\\___|_/‾‾\\_\\_| |___|   |_| |___/ /_/‾‾\\_\\_| |_|
`;
export const DEFAULT_APP_NAME = "my-t3-app";
export const CREATE_T3_APP = "create-t3-app";


================================================
FILE: cli/src/helpers/createProject.ts
================================================
import fs from "fs";
import path from "path";

import { PKG_ROOT } from "~/consts.js";
import { installPackages } from "~/helpers/installPackages.js";
import { scaffoldProject } from "~/helpers/scaffoldProject.js";
import {
  selectAppFile,
  selectIndexFile,
  selectLayoutFile,
  selectPageFile,
} from "~/helpers/selectBoilerplate.js";
import {
  type DatabaseProvider,
  type PkgInstallerMap,
} from "~/installers/index.js";
import { getUserPkgManager } from "~/utils/getUserPkgManager.js";

interface CreateProjectOptions {
  projectName: string;
  packages: PkgInstallerMap;
  scopedAppName: string;
  noInstall: boolean;
  importAlias: string;
  appRouter: boolean;
  databaseProvider: DatabaseProvider;
}

export const createProject = async ({
  projectName,
  scopedAppName,
  packages,
  noInstall,
  appRouter,
  databaseProvider,
}: CreateProjectOptions) => {
  const pkgManager = getUserPkgManager();
  const projectDir = path.resolve(process.cwd(), projectName);

  // Bootstraps the base Next.js application
  await scaffoldProject({
    projectName,
    projectDir,
    pkgManager,
    scopedAppName,
    noInstall,
    appRouter,
    databaseProvider,
  });

  // Install the selected packages
  installPackages({
    projectName,
    scopedAppName,
    projectDir,
    pkgManager,
    packages,
    noInstall,
    appRouter,
    databaseProvider,
  });

  // Select necessary _app,index / layout,page files
  if (appRouter) {
    // Replace next.config
    fs.copyFileSync(
      path.join(PKG_ROOT, "template/extras/config/next-config-appdir.js"),
      path.join(projectDir, "next.config.js")
    );

    selectLayoutFile({ projectDir, packages });
    selectPageFile({ projectDir, packages });
  } else {
    selectAppFile({ projectDir, packages });
    selectIndexFile({ projectDir, packages });
  }

  // If no tailwind, select use css modules
  if (!packages.tailwind.inUse) {
    const indexModuleCss = path.join(
      PKG_ROOT,
      "template/extras/src/index.module.css"
    );
    const indexModuleCssDest = path.join(
      projectDir,
      "src",
      appRouter ? "app" : "pages",
      "index.module.css"
    );
    fs.copyFileSync(indexModuleCss, indexModuleCssDest);
  }

  return projectDir;
};


================================================
FILE: cli/src/helpers/format.ts
================================================
import chalk from "chalk";
import { execa } from "execa";
import ora from "ora";

import { type PackageManager } from "~/utils/getUserPkgManager.js";
import { logger } from "~/utils/logger.js";

// Runs format and lint command to ensure created repository is tidy upon creation
export const formatProject = async ({
  pkgManager,
  projectDir,
  eslint,
  biome,
}: {
  pkgManager: PackageManager;
  projectDir: string;
  eslint: boolean;
  biome: boolean;
}) => {
  logger.info(`Formatting project with ${eslint ? "prettier" : "biome"}...`);
  const spinner = ora("Running format command\n").start();

  if (eslint) {
    await execa(pkgManager, ["run", "format:write"], {
      cwd: projectDir,
    });
  } else if (biome) {
    await execa(pkgManager, ["run", "check:unsafe"], {
      cwd: projectDir,
    });
  }
  spinner.succeed(`${chalk.green("Successfully formatted project")}`);
};


================================================
FILE: cli/src/helpers/git.ts
================================================
import { execSync } from "child_process";
import path from "path";
import * as p from "@clack/prompts";
import chalk from "chalk";
import { execa } from "execa";
import fs from "fs-extra";
import ora from "ora";

import { logger } from "~/utils/logger.js";

const isGitInstalled = (dir: string): boolean => {
  try {
    execSync("git --version", { cwd: dir });
    return true;
  } catch {
    return false;
  }
};

/** @returns Whether or not the provided directory has a `.git` subdirectory in it. */
export const isRootGitRepo = (dir: string): boolean => {
  return fs.existsSync(path.join(dir, ".git"));
};

/** @returns Whether or not this directory or a parent directory has a `.git` directory. */
export const isInsideGitRepo = async (dir: string): Promise<boolean> => {
  try {
    // If this command succeeds, we're inside a git repo
    await execa("git", ["rev-parse", "--is-inside-work-tree"], {
      cwd: dir,
      stdout: "ignore",
    });
    return true;
  } catch {
    // Else, it will throw a git-error and we return false
    return false;
  }
};

const getGitVersion = () => {
  const stdout = execSync("git --version").toString().trim();
  const gitVersionTag = stdout.split(" ")[2];
  const major = gitVersionTag?.split(".")[0];
  const minor = gitVersionTag?.split(".")[1];
  return { major: Number(major), minor: Number(minor) };
};

/** @returns The git config value of "init.defaultBranch". If it is not set, returns "main". */
const getDefaultBranch = () => {
  const stdout = execSync("git config --global init.defaultBranch || echo main")
    .toString()
    .trim();

  return stdout;
};

// This initializes the Git-repository for the project
export const initializeGit = async (projectDir: string) => {
  logger.info("Initializing Git...");

  if (!isGitInstalled(projectDir)) {
    logger.warn("Git is not installed. Skipping Git initialization.");
    return;
  }

  const spinner = ora("Creating a new git repo...\n").start();

  const isRoot = isRootGitRepo(projectDir);
  const isInside = await isInsideGitRepo(projectDir);
  const dirName = path.parse(projectDir).name; // skip full path for logging

  if (isInside && isRoot) {
    // Dir is a root git repo
    spinner.stop();
    const overwriteGit = await p.confirm({
      message: `${chalk.redBright.bold(
        "Warning:"
      )} Git is already initialized in "${dirName}". Initializing a new git repository would delete the previous history. Would you like to continue anyways?`,
      initialValue: false,
    });

    if (!overwriteGit) {
      spinner.info("Skipping Git initialization.");
      return;
    }
    // Deleting the .git folder
    fs.removeSync(path.join(projectDir, ".git"));
  } else if (isInside && !isRoot) {
    // Dir is inside a git worktree
    spinner.stop();
    const initializeChildGitRepo = await p.confirm({
      message: `${chalk.redBright.bold(
        "Warning:"
      )} "${dirName}" is already in a git worktree. Would you still like to initialize a new git repository in this directory?`,
      initialValue: false,
    });
    if (!initializeChildGitRepo) {
      spinner.info("Skipping Git initialization.");
      return;
    }
  }

  // We're good to go, initializing the git repo
  try {
    const branchName = getDefaultBranch();

    // --initial-branch flag was added in git v2.28.0
    const { major, minor } = getGitVersion();
    if (major < 2 || (major == 2 && minor < 28)) {
      await execa("git", ["init"], { cwd: projectDir });
      // symbolic-ref is used here due to refs/heads/master not existing
      // It is only created after the first commit
      // https://superuser.com/a/1419674
      await execa("git", ["symbolic-ref", "HEAD", `refs/heads/${branchName}`], {
        cwd: projectDir,
      });
    } else {
      await execa("git", ["init", `--initial-branch=${branchName}`], {
        cwd: projectDir,
      });
    }
    await execa("git", ["add", "."], { cwd: projectDir });
    spinner.succeed(
      `${chalk.green("Successfully initialized and staged")} ${chalk.green.bold(
        "git"
      )}\n`
    );
  } catch {
    // Safeguard, should be unreachable
    spinner.fail(
      `${chalk.bold.red(
        "Failed:"
      )} could not initialize git. Update git to the latest version!\n`
    );
  }
};


================================================
FILE: cli/src/helpers/installDependencies.ts
================================================
import chalk from "chalk";
import { execa, type StdioOption } from "execa";
import ora, { type Ora } from "ora";

import {
  getUserPkgManager,
  type PackageManager,
} from "~/utils/getUserPkgManager.js";
import { logger } from "~/utils/logger.js";

const execWithSpinner = async (
  projectDir: string,
  pkgManager: PackageManager,
  options: {
    args?: string[];
    stdout?: StdioOption;
    onDataHandle?: (spinner: Ora) => (data: Buffer) => void;
  }
) => {
  const { onDataHandle, args = ["install"], stdout = "pipe" } = options;

  const spinner = ora(`Running ${pkgManager} install...`).start();
  const subprocess = execa(pkgManager, args, { cwd: projectDir, stdout });

  await new Promise<void>((res, rej) => {
    if (onDataHandle) {
      subprocess.stdout?.on("data", onDataHandle(spinner));
    }

    void subprocess.on("error", (e) => rej(e));
    void subprocess.on("close", () => res());
  });

  return spinner;
};

const runInstallCommand = async (
  pkgManager: PackageManager,
  projectDir: string
): Promise<Ora | null> => {
  switch (pkgManager) {
    // When using npm, inherit the stderr stream so that the progress bar is shown
    case "npm":
      await execa(pkgManager, ["install"], {
        cwd: projectDir,
        stderr: "inherit",
      });

      return null;
    // When using yarn or pnpm, use the stdout stream and ora spinner to show the progress
    case "pnpm":
      return execWithSpinner(projectDir, pkgManager, {
        onDataHandle: (spinner) => (data) => {
          const text = data.toString();

          if (text.includes("Progress")) {
            spinner.text = text.includes("|")
              ? (text.split(" | ")[1] ?? "")
              : text;
          }
        },
      });
    case "yarn":
      return execWithSpinner(projectDir, pkgManager, {
        onDataHandle: (spinner) => (data) => {
          spinner.text = data.toString();
        },
      });
    // When using bun, the stdout stream is ignored and the spinner is shown
    case "bun":
      return execWithSpinner(projectDir, pkgManager, { stdout: "ignore" });
  }
};

export const installDependencies = async ({
  projectDir,
}: {
  projectDir: string;
}) => {
  logger.info("Installing dependencies...");
  const pkgManager = getUserPkgManager();

  const installSpinner = await runInstallCommand(pkgManager, projectDir);

  // If the spinner was used to show the progress, use succeed method on it
  // If not, use the succeed on a new spinner
  (installSpinner ?? ora()).succeed(
    chalk.green("Successfully installed dependencies!\n")
  );
};


================================================
FILE: cli/src/helpers/installPackages.ts
================================================
import chalk from "chalk";
import ora from "ora";

import {
  type InstallerOptions,
  type PkgInstallerMap,
} from "~/installers/index.js";
import { logger } from "~/utils/logger.js";

type InstallPackagesOptions = InstallerOptions & {
  packages: PkgInstallerMap;
};
// This runs the installer for all the packages that the user has selected
export const installPackages = (options: InstallPackagesOptions) => {
  const { packages } = options;
  logger.info("Adding boilerplate...");

  for (const [name, pkgOpts] of Object.entries(packages)) {
    if (pkgOpts.inUse) {
      const spinner = ora(`Boilerplating ${name}...`).start();
      pkgOpts.installer(options);
      spinner.succeed(
        chalk.green(
          `Successfully setup boilerplate for ${chalk.green.bold(name)}`
        )
      );
    }
  }

  logger.info("");
};


================================================
FILE: cli/src/helpers/logNextSteps.ts
================================================
import { DEFAULT_APP_NAME } from "~/consts.js";
import { type InstallerOptions } from "~/installers/index.js";
import { getUserPkgManager } from "~/utils/getUserPkgManager.js";
import { logger } from "~/utils/logger.js";
import { isInsideGitRepo, isRootGitRepo } from "./git.js";

// This logs the next steps that the user should take in order to advance the project
export const logNextSteps = async ({
  projectName = DEFAULT_APP_NAME,
  packages,
  noInstall,
  projectDir,
  databaseProvider,
}: Pick<
  InstallerOptions,
  | "projectName"
  | "packages"
  | "noInstall"
  | "projectDir"
  | "appRouter"
  | "databaseProvider"
>) => {
  const pkgManager = getUserPkgManager();

  logger.info("Next steps:");
  if (projectName !== ".") {
    logger.info(`  cd ${projectName}`);
  }
  if (noInstall) {
    // To reflect yarn's default behavior of installing packages when no additional args provided
    if (pkgManager === "yarn") {
      logger.info(`  ${pkgManager}`);
    } else {
      logger.info(`  ${pkgManager} install`);
    }
  }

  if (["postgres", "mysql"].includes(databaseProvider)) {
    logger.info("  Start up a database, if needed using './start-database.sh'");
  }

  if (packages?.prisma.inUse || packages?.drizzle.inUse) {
    if (["npm", "bun"].includes(pkgManager)) {
      logger.info(`  ${pkgManager} run db:push`);
    } else {
      logger.info(`  ${pkgManager} db:push`);
    }
  }

  if (packages?.nextAuth.inUse) {
    logger.info(
      `  Fill in your .env with necessary values. See https://create.t3.gg/en/usage/first-steps for more info.`
    );
  }

  if (["npm", "bun"].includes(pkgManager)) {
    logger.info(`  ${pkgManager} run dev`);
  } else {
    logger.info(`  ${pkgManager} dev`);
  }

  if (!(await isInsideGitRepo(projectDir)) && !isRootGitRepo(projectDir)) {
    logger.info(`  git init`);
  }
  logger.info(`  git commit -m "initial commit"`);
};


================================================
FILE: cli/src/helpers/scaffoldProject.ts
================================================
import path from "path";
import * as p from "@clack/prompts";
import chalk from "chalk";
import fs from "fs-extra";
import ora from "ora";

import { PKG_ROOT } from "~/consts.js";
import { type InstallerOptions } from "~/installers/index.js";
import { logger } from "~/utils/logger.js";

// This bootstraps the base Next.js application
export const scaffoldProject = async ({
  projectName,
  projectDir,
  pkgManager,
  noInstall,
}: InstallerOptions) => {
  const srcDir = path.join(PKG_ROOT, "template/base");

  if (!noInstall) {
    logger.info(`\nUsing: ${chalk.cyan.bold(pkgManager)}\n`);
  } else {
    logger.info("");
  }

  const spinner = ora(`Scaffolding in: ${projectDir}...\n`).start();

  if (fs.existsSync(projectDir)) {
    if (fs.readdirSync(projectDir).length === 0) {
      if (projectName !== ".")
        spinner.info(
          `${chalk.cyan.bold(projectName)} exists but is empty, continuing...\n`
        );
    } else {
      spinner.stopAndPersist();
      const overwriteDir = await p.select({
        message: `${chalk.redBright.bold("Warning:")} ${chalk.cyan.bold(
          projectName
        )} already exists and isn't empty. How would you like to proceed?`,
        options: [
          {
            label: "Abort installation (recommended)",
            value: "abort",
          },
          {
            label: "Clear the directory and continue installation",
            value: "clear",
          },
          {
            label: "Continue installation and overwrite conflicting files",
            value: "overwrite",
          },
        ],
        initialValue: "abort",
      });

      if (p.isCancel(overwriteDir) || overwriteDir === "abort") {
        spinner.fail("Aborting installation...");
        process.exit(1);
      }

      const confirmOverwriteDir = await p.confirm({
        message: `Are you sure you want to ${
          overwriteDir === "clear"
            ? "clear the directory"
            : "overwrite conflicting files"
        }?`,
        initialValue: false,
      });

      if (p.isCancel(confirmOverwriteDir) || !confirmOverwriteDir) {
        spinner.fail("Aborting installation...");
        process.exit(1);
      }

      if (overwriteDir === "clear") {
        spinner.info(
          `Emptying ${chalk.cyan.bold(projectName)} and creating t3 app..\n`
        );
        fs.emptyDirSync(projectDir);
      }
    }
  }

  spinner.start();

  fs.copySync(srcDir, projectDir);
  fs.renameSync(
    path.join(projectDir, "_gitignore"),
    path.join(projectDir, ".gitignore")
  );

  const scaffoldedName =
    projectName === "." ? "App" : chalk.cyan.bold(projectName);

  spinner.succeed(
    `${scaffoldedName} ${chalk.green("scaffolded successfully!")}\n`
  );
};


================================================
FILE: cli/src/helpers/selectBoilerplate.ts
================================================
import path from "path";
import fs from "fs-extra";

import { PKG_ROOT } from "~/consts.js";
import { type InstallerOptions } from "~/installers/index.js";

type SelectBoilerplateProps = Required<
  Pick<InstallerOptions, "packages" | "projectDir">
>;
// This generates the _app.tsx file that is used to render the app
export const selectAppFile = ({
  projectDir,
  packages,
}: SelectBoilerplateProps) => {
  const appFileDir = path.join(PKG_ROOT, "template/extras/src/pages/_app");

  const usingTw = packages.tailwind.inUse;
  const usingTRPC = packages.trpc.inUse;
  const usingAuth = packages?.nextAuth.inUse ?? packages?.betterAuth.inUse;
  const usingBetterAuth = packages?.betterAuth.inUse;

  let appFile = "base.tsx";
  if (usingTRPC && usingTw && usingBetterAuth) {
    appFile = "with-better-auth-trpc-tw.tsx";
  } else if (usingTRPC && !usingTw && usingBetterAuth) {
    appFile = "with-better-auth-trpc.tsx";
  } else if (usingTRPC && usingTw && usingAuth) {
    appFile = "with-auth-trpc-tw.tsx";
  } else if (usingTRPC && !usingTw && usingAuth) {
    appFile = "with-auth-trpc.tsx";
  } else if (usingTRPC && usingTw) {
    appFile = "with-trpc-tw.tsx";
  } else if (usingTRPC && !usingTw) {
    appFile = "with-trpc.tsx";
  } else if (!usingTRPC && usingTw) {
    appFile = "with-tw.tsx";
  } else if (usingAuth && usingTw) {
    appFile = "with-auth-tw.tsx";
  } else if (usingAuth && !usingTw) {
    appFile = "with-auth.tsx";
  }

  const appSrc = path.join(appFileDir, appFile);
  const appDest = path.join(projectDir, "src/pages/_app.tsx");
  fs.copySync(appSrc, appDest);
};

// Similar to _app, but for app router
export const selectLayoutFile = ({
  projectDir,
  packages,
}: SelectBoilerplateProps) => {
  const layoutFileDir = path.join(PKG_ROOT, "template/extras/src/app/layout");

  const usingTw = packages.tailwind.inUse;
  const usingTRPC = packages.trpc.inUse;
  let layoutFile = "base.tsx";
  if (usingTRPC && usingTw) {
    layoutFile = "with-trpc-tw.tsx";
  } else if (usingTRPC && !usingTw) {
    layoutFile = "with-trpc.tsx";
  } else if (!usingTRPC && usingTw) {
    layoutFile = "with-tw.tsx";
  }

  const appSrc = path.join(layoutFileDir, layoutFile);
  const appDest = path.join(projectDir, "src/app/layout.tsx");
  fs.copySync(appSrc, appDest);
};

// This selects the proper index.tsx to be used that showcases the chosen tech
export const selectIndexFile = ({
  projectDir,
  packages,
}: SelectBoilerplateProps) => {
  const indexFileDir = path.join(PKG_ROOT, "template/extras/src/pages/index");

  const usingTRPC = packages.trpc.inUse;
  const usingTw = packages.tailwind.inUse;
  const usingBetterAuth = packages?.betterAuth.inUse;
  const usingNextAuth = packages?.nextAuth.inUse;
  const usingAuth = usingNextAuth || usingBetterAuth;

  let indexFile = "base.tsx";
  if (usingTRPC && usingTw && usingBetterAuth) {
    indexFile = "with-better-auth-trpc-tw.tsx";
  } else if (usingTRPC && !usingTw && usingBetterAuth) {
    indexFile = "with-better-auth-trpc.tsx";
  } else if (!usingTRPC && usingTw && usingBetterAuth) {
    indexFile = "with-better-auth-tw.tsx";
  } else if (!usingTRPC && !usingTw && usingBetterAuth) {
    indexFile = "with-better-auth.tsx";
  } else if (usingTRPC && usingTw && usingAuth) {
    indexFile = "with-auth-trpc-tw.tsx";
  } else if (usingTRPC && !usingTw && usingAuth) {
    indexFile = "with-auth-trpc.tsx";
  } else if (usingTRPC && usingTw) {
    indexFile = "with-trpc-tw.tsx";
  } else if (usingTRPC && !usingTw) {
    indexFile = "with-trpc.tsx";
  } else if (!usingTRPC && usingTw) {
    indexFile = "with-tw.tsx";
  }

  const indexSrc = path.join(indexFileDir, indexFile);
  const indexDest = path.join(projectDir, "src/pages/index.tsx");
  fs.copySync(indexSrc, indexDest);
};

// Similar to index, but for app router
export const selectPageFile = ({
  projectDir,
  packages,
}: SelectBoilerplateProps) => {
  const indexFileDir = path.join(PKG_ROOT, "template/extras/src/app/page");

  const usingTRPC = packages.trpc.inUse;
  const usingTw = packages.tailwind.inUse;
  const usingAuth = packages?.nextAuth.inUse;
  const usingBetterAuth = packages?.betterAuth.inUse;

  let indexFile = "base.tsx";
  if (usingTRPC && usingTw && usingBetterAuth) {
    indexFile = "with-better-auth-trpc-tw.tsx";
  } else if (usingTRPC && !usingTw && usingBetterAuth) {
    indexFile = "with-better-auth-trpc.tsx";
  } else if (!usingTRPC && usingTw && usingBetterAuth) {
    indexFile = "with-better-auth-tw.tsx";
  } else if (!usingTRPC && !usingTw && usingBetterAuth) {
    indexFile = "with-better-auth.tsx";
  } else if (usingTRPC && usingTw && usingAuth) {
    indexFile = "with-auth-trpc-tw.tsx";
  } else if (usingTRPC && !usingTw && usingAuth) {
    indexFile = "with-auth-trpc.tsx";
  } else if (usingTRPC && usingTw) {
    indexFile = "with-trpc-tw.tsx";
  } else if (usingTRPC && !usingTw) {
    indexFile = "with-trpc.tsx";
  } else if (!usingTRPC && usingTw) {
    indexFile = "with-tw.tsx";
  }

  const indexSrc = path.join(indexFileDir, indexFile);
  const indexDest = path.join(projectDir, "src/app/page.tsx");
  fs.copySync(indexSrc, indexDest);
};


================================================
FILE: cli/src/helpers/setImportAlias.ts
================================================
import fs from "fs";
import path from "path";

function replaceTextInFiles(
  directoryPath: string,
  search: string,
  replacement: string
): void {
  const files = fs.readdirSync(directoryPath);

  files.forEach((file) => {
    const filePath = path.join(directoryPath, file);
    if (fs.statSync(filePath).isDirectory()) {
      replaceTextInFiles(filePath, search, replacement);
    } else {
      const data = fs.readFileSync(filePath, "utf8");
      const updatedData = data.replace(new RegExp(search, "g"), replacement);
      fs.writeFileSync(filePath, updatedData, "utf8");
    }
  });
}

export const setImportAlias = (projectDir: string, importAlias: string) => {
  const normalizedImportAlias = importAlias
    .replace(/\*/g, "") // remove any wildcards (~/* -> ~/)
    .replace(/[^/]$/, "$&/"); // ensure trailing slash (@ -> ~/)

  // update import alias in any files if not using the default
  replaceTextInFiles(projectDir, `~/`, normalizedImportAlias);
};


================================================
FILE: cli/src/index.ts
================================================
#!/usr/bin/env node
import path from "path";
import { execa } from "execa";
import fs from "fs-extra";
import { type PackageJson } from "type-fest";

import { runCli } from "~/cli/index.js";
import { createProject } from "~/helpers/createProject.js";
import { initializeGit } from "~/helpers/git.js";
import { logNextSteps } from "~/helpers/logNextSteps.js";
import { setImportAlias } from "~/helpers/setImportAlias.js";
import { buildPkgInstallerMap } from "~/installers/index.js";
import { getUserPkgManager } from "~/utils/getUserPkgManager.js";
import { logger } from "~/utils/logger.js";
import { parseNameAndPath } from "~/utils/parseNameAndPath.js";
import { renderTitle } from "~/utils/renderTitle.js";
import { formatProject } from "./helpers/format.js";
import { installDependencies } from "./helpers/installDependencies.js";
import { getVersion } from "./utils/getT3Version.js";
import {
  getNpmVersion,
  renderVersionWarning,
} from "./utils/renderVersionWarning.js";

type CT3APackageJSON = PackageJson & {
  ct3aMetadata?: {
    initVersion: string;
  };
};

const main = async () => {
  const npmVersion = await getNpmVersion();
  const pkgManager = getUserPkgManager();
  renderTitle();
  if (npmVersion) {
    renderVersionWarning(npmVersion);
  }

  const {
    appName,
    packages,
    flags: { noGit, noInstall, importAlias, appRouter },
    databaseProvider,
  } = await runCli();

  const usePackages = buildPkgInstallerMap(packages, databaseProvider);

  // e.g. dir/@mono/app returns ["@mono/app", "dir/app"]
  const [scopedAppName, appDir] = parseNameAndPath(appName);

  const projectDir = await createProject({
    projectName: appDir,
    scopedAppName,
    packages: usePackages,
    databaseProvider,
    importAlias,
    noInstall,
    appRouter,
  });

  // Write name to package.json
  const pkgJson = fs.readJSONSync(
    path.join(projectDir, "package.json")
  ) as CT3APackageJSON;
  pkgJson.name = scopedAppName;
  pkgJson.ct3aMetadata = { initVersion: getVersion() };

  // ? Bun doesn't support this field (yet)
  if (pkgManager !== "bun") {
    const { stdout } = await execa(pkgManager, ["-v"], {
      cwd: projectDir,
    });
    pkgJson.packageManager = `${pkgManager}@${stdout.trim()}`;
  }

  fs.writeJSONSync(path.join(projectDir, "package.json"), pkgJson, {
    spaces: 2,
  });

  // update import alias in any generated files if not using the default
  if (importAlias !== "~/") {
    setImportAlias(projectDir, importAlias);
  }

  if (!noInstall) {
    await installDependencies({ projectDir });

    if (usePackages.prisma.inUse) {
      logger.info("Generating Prisma client...");
      await execa("npx", ["prisma", "generate"], { cwd: projectDir });
      logger.info("Successfully generated Prisma client!");
    }

    await formatProject({
      pkgManager,
      projectDir,
      eslint: packages.includes("eslint"),
      biome: packages.includes("biome"),
    });
  }

  if (!noGit) {
    await initializeGit(projectDir);
  }

  await logNextSteps({
    projectName: appDir,
    packages: usePackages,
    appRouter,
    noInstall,
    projectDir,
    databaseProvider,
  });

  process.exit(0);
};

main().catch((err) => {
  logger.error("Aborting installation...");
  if (err instanceof Error) {
    logger.error(err);
  } else {
    logger.error(
      "An unknown error has occurred. Please open an issue on github with the below:"
    );
    console.log(err);
  }
  process.exit(1);
});


================================================
FILE: cli/src/installers/betterAuth.ts
================================================
import path from "path";
import fs from "fs-extra";

import { PKG_ROOT } from "~/consts.js";
import { type AvailableDependencies } from "~/installers/dependencyVersionMap.js";
import { type Installer } from "~/installers/index.js";
import { addPackageDependency } from "~/utils/addPackageDependency.js";

export const betterAuthInstaller: Installer = ({
  projectDir,
  packages,
  databaseProvider,
  appRouter,
}) => {
  const usingPrisma = packages?.prisma.inUse;
  const usingDrizzle = packages?.drizzle.inUse;

  const deps: AvailableDependencies[] = ["better-auth"];
  if (usingPrisma) deps.push("@auth/prisma-adapter");
  if (usingDrizzle) deps.push("@auth/drizzle-adapter");

  addPackageDependency({
    projectDir,
    dependencies: deps,
    devMode: false,
  });

  const extrasDir = path.join(PKG_ROOT, "template/extras");

  const isAppRouter = appRouter ?? true; // Default to app router if not specified

  const apiHandlerFile = isAppRouter
    ? "src/app/api/auth/[...all]/route.ts"
    : "src/pages/api/auth/[...all].ts";

  const apiHandlerSrc = path.join(extrasDir, apiHandlerFile);
  const apiHandlerDest = path.join(projectDir, apiHandlerFile);

  const authConfigSrc = path.join(
    extrasDir,
    "src/server/better-auth/config",
    usingPrisma
      ? "with-prisma.ts"
      : usingDrizzle
        ? "with-drizzle.ts"
        : "base.ts"
  );
  const authConfigDest = path.join(
    projectDir,
    "src/server/better-auth/config.ts"
  );

  const authIndexSrc = path.join(extrasDir, "src/server/better-auth/index.ts");
  const authIndexDest = path.join(
    projectDir,
    "src/server/better-auth/index.ts"
  );

  // Better Auth client and server helpers
  const betterAuthClientSrc = path.join(
    extrasDir,
    "src/server/better-auth/client.ts"
  );
  const betterAuthClientDest = path.join(
    projectDir,
    "src/server/better-auth/client.ts"
  );
  const betterAuthServerSrc = path.join(
    extrasDir,
    "src/server/better-auth/server.ts"
  );
  const betterAuthServerDest = path.join(
    projectDir,
    "src/server/better-auth/server.ts"
  );

  fs.copySync(apiHandlerSrc, apiHandlerDest);
  fs.copySync(authConfigSrc, authConfigDest);
  fs.copySync(authIndexSrc, authIndexDest);
  fs.copySync(betterAuthClientSrc, betterAuthClientDest);
  fs.copySync(betterAuthServerSrc, betterAuthServerDest);

  // Update Better Auth adapter provider according to selected DB
  try {
    if (fs.pathExistsSync(authConfigDest)) {
      const content = fs.readFileSync(authConfigDest, "utf8");

      // Map CLI database provider to adapter provider strings
      const providerForDrizzle = (db: string) => {
        switch (db) {
          case "postgres":
            return "pg";
          case "mysql":
          case "planetscale":
            return "mysql";
          case "sqlite":
            return "sqlite";
          default:
            return "pg";
        }
      };

      const providerForPrisma = (db: string) => {
        switch (db) {
          case "postgres":
            return "postgresql";
          case "mysql":
          case "planetscale":
            return "mysql";
          case "sqlite":
            return "sqlite";
          default:
            return "postgresql";
        }
      };

      const providerValue = usingPrisma
        ? providerForPrisma(databaseProvider)
        : usingDrizzle
          ? providerForDrizzle(databaseProvider)
          : undefined;

      if (providerValue) {
        const updated = content.replace(
          /(provider:\s*")[^"]+("\s*,?)/,
          `$1${providerValue}$2`
        );
        fs.writeFileSync(authConfigDest, updated, "utf8");
      }
    }
  } catch {
    // Non-fatal: leave default provider from template
  }
};


================================================
FILE: cli/src/installers/biome.ts
================================================
import path from "path";
import fs from "fs-extra";

import { PKG_ROOT } from "~/consts.js";
import { type Installer } from "~/installers/index.js";
import { addPackageDependency } from "~/utils/addPackageDependency.js";
import { addPackageScript } from "~/utils/addPackageScript.js";

export const biomeInstaller: Installer = ({ projectDir }) => {
  addPackageDependency({
    projectDir,
    dependencies: ["@biomejs/biome"],
    devMode: true,
  });

  const extrasDir = path.join(PKG_ROOT, "template/extras");
  const biomeConfigSrc = path.join(extrasDir, "config/biome.jsonc");
  const biomeConfigDest = path.join(projectDir, "biome.jsonc");

  fs.copySync(biomeConfigSrc, biomeConfigDest);

  addPackageScript({
    projectDir,
    scripts: {
      "check:unsafe": "biome check --write --unsafe .",
      "check:write": "biome check --write .",
      check: "biome check .",
    },
  });
};


================================================
FILE: cli/src/installers/dbContainer.ts
================================================
import fs from "fs";
import path from "path";

import { PKG_ROOT } from "~/consts.js";
import { type Installer } from "~/installers/index.js";
import { parseNameAndPath } from "~/utils/parseNameAndPath.js";

// Sanitizes a project name to ensure it adheres to Docker container naming conventions.
const sanitizeName = (name: string): string => {
  return name
    .replace(/[^a-zA-Z0-9_.-]/g, "_") // Replace invalid characters with underscores
    .toLowerCase(); // Convert to lowercase for consistency
};

export const dbContainerInstaller: Installer = ({
  projectDir,
  databaseProvider,
  projectName,
}) => {
  const scriptSrc = path.join(
    PKG_ROOT,
    `template/extras/start-database/${databaseProvider}.sh`
  );
  const scriptText = fs.readFileSync(scriptSrc, "utf-8");
  const scriptDest = path.join(projectDir, "start-database.sh");
  // for configuration with postgresql and mysql when project is created with '.' project name
  const [projectNameParsed] =
    projectName === "." ? parseNameAndPath(projectDir) : [projectName];

  // Sanitize the project name for Docker container usage
  const sanitizedProjectName = sanitizeName(projectNameParsed);

  fs.writeFileSync(
    scriptDest,
    scriptText.replaceAll("project1", sanitizedProjectName)
  );
  fs.chmodSync(scriptDest, "755");
};


================================================
FILE: cli/src/installers/dependencyVersionMap.ts
================================================
/*
 * This maps the necessary packages to a version.
 * This improves performance significantly over fetching it from the npm registry.
 */
export const dependencyVersionMap = {
  // NextAuth.js
  "next-auth": "5.0.0-beta.25",
  "@auth/prisma-adapter": "^2.7.2",
  "@auth/drizzle-adapter": "^1.7.2",

  // Better-Auth
  "better-auth": "^1.3",

  // Prisma
  prisma: "^6.6.0",
  "@prisma/client": "^6.6.0",
  "@prisma/adapter-planetscale": "^6.6.0",

  // Drizzle
  "drizzle-kit": "^0.30.5",
  "drizzle-orm": "^0.41.0",
  mysql2: "^3.11.0",
  "@planetscale/database": "^1.19.0",
  postgres: "^3.4.4",
  "@libsql/client": "^0.14.0",

  // TailwindCSS
  tailwindcss: "^4.0.15",
  postcss: "^8.5.3",
  "@tailwindcss/postcss": "^4.0.15",

  // tRPC
  "@trpc/client": "^11.0.0",
  "@trpc/server": "^11.0.0",
  "@trpc/react-query": "^11.0.0",
  "@trpc/next": "^11.0.0",
  "@tanstack/react-query": "^5.69.0",
  superjson: "^2.2.1",
  "server-only": "^0.0.1",

  // biome
  "@biomejs/biome": "^2.2.5",

  // eslint / prettier
  prettier: "^3.5.3",
  "@eslint/eslintrc": "^3.3.1",
  "prettier-plugin-tailwindcss": "^0.6.11",
  eslint: "^9.23.0",
  "eslint-config-next": "^15.2.3",
  "eslint-plugin-drizzle": "^0.2.3",
  "typescript-eslint": "^8.27.0",
} as const;
export type AvailableDependencies = keyof typeof dependencyVersionMap;


================================================
FILE: cli/src/installers/drizzle.ts
================================================
import path from "path";
import fs from "fs-extra";

import { PKG_ROOT } from "~/consts.js";
import { type Installer } from "~/installers/index.js";
import { addPackageDependency } from "~/utils/addPackageDependency.js";
import { addPackageScript } from "~/utils/addPackageScript.js";

export const drizzleInstaller: Installer = ({
  projectDir,
  packages,
  scopedAppName,
  databaseProvider,
}) => {
  addPackageDependency({
    projectDir,
    dependencies: ["drizzle-kit"],
    devMode: true,
  });
  addPackageDependency({
    projectDir,
    dependencies: [
      "drizzle-orm",
      (
        {
          planetscale: "@planetscale/database",
          mysql: "mysql2",
          postgres: "postgres",
          sqlite: "@libsql/client",
        } as const
      )[databaseProvider],
    ],
    devMode: false,
  });

  const extrasDir = path.join(PKG_ROOT, "template/extras");

  const configFile = path.join(
    extrasDir,
    `config/drizzle-config-${
      databaseProvider === "planetscale" ? "mysql" : databaseProvider
    }.ts`
  );
  const configDest = path.join(projectDir, "drizzle.config.ts");

  const schemaBaseName = packages?.betterAuth.inUse
    ? "with-better-auth"
    : packages?.nextAuth.inUse
      ? "with-auth"
      : "base";
  const schemaSrc = path.join(
    extrasDir,
    "src/server/db/schema-drizzle",
    `${schemaBaseName}-${databaseProvider}.ts`
  );
  const schemaDest = path.join(projectDir, "src/server/db/schema.ts");

  // Replace placeholder table prefix with project name
  let schemaContent = fs.readFileSync(schemaSrc, "utf-8");
  schemaContent = schemaContent.replace(
    "project1_${name}",
    `${scopedAppName}_\${name}`
  );

  let configContent = fs.readFileSync(configFile, "utf-8");

  configContent = configContent.replace("project1_*", `${scopedAppName}_*`);

  const clientSrc = path.join(
    extrasDir,
    `src/server/db/index-drizzle/with-${databaseProvider}.ts`
  );
  const clientDest = path.join(projectDir, "src/server/db/index.ts");

  addPackageScript({
    projectDir,
    scripts: {
      "db:push": "drizzle-kit push",
      "db:studio": "drizzle-kit studio",
      "db:generate": "drizzle-kit generate",
      "db:migrate": "drizzle-kit migrate",
    },
  });

  fs.copySync(configFile, configDest);
  fs.mkdirSync(path.dirname(schemaDest), { recursive: true });
  fs.writeFileSync(schemaDest, schemaContent);
  fs.writeFileSync(configDest, configContent);
  fs.copySync(clientSrc, clientDest);
};


================================================
FILE: cli/src/installers/envVars.ts
================================================
import crypto from "node:crypto";
import path from "path";
import fs from "fs-extra";

import { PKG_ROOT } from "~/consts.js";
import { type DatabaseProvider, type Installer } from "~/installers/index.js";

export const envVariablesInstaller: Installer = ({
  projectDir,
  packages,
  databaseProvider,
  scopedAppName,
}) => {
  const usingNextAuth = packages?.nextAuth.inUse;
  const usingBetterAuth = packages?.betterAuth.inUse;
  const usingPrisma = packages?.prisma.inUse;
  const usingDrizzle = packages?.drizzle.inUse;

  const usingDb = usingPrisma === true || usingDrizzle === true;
  const usingPlanetScale = databaseProvider === "planetscale";

  const envContent = getEnvContent(
    !!usingNextAuth,
    !!usingBetterAuth,
    !!usingPrisma,
    !!usingDrizzle,
    databaseProvider,
    scopedAppName
  );

  let envFile = "";
  if (usingDb) {
    if (usingPlanetScale) {
      if (usingBetterAuth) envFile = "with-better-auth-db-planetscale.js";
      else if (usingNextAuth) envFile = "with-auth-db-planetscale.js";
      else envFile = "with-db-planetscale.js";
    } else {
      if (usingBetterAuth) envFile = "with-better-auth-db.js";
      else if (usingNextAuth) envFile = "with-auth-db.js";
      else envFile = "with-db.js";
    }
  } else {
    if (usingBetterAuth) envFile = "with-better-auth.js";
    else if (usingNextAuth) envFile = "with-auth.js";
  }

  if (envFile !== "") {
    const envSchemaSrc = path.join(
      PKG_ROOT,
      "template/extras/src/env",
      envFile
    );
    const envSchemaDest = path.join(projectDir, "src/env.js");
    fs.copyFileSync(envSchemaSrc, envSchemaDest);
  }

  const envDest = path.join(projectDir, ".env");
  const envExampleDest = path.join(projectDir, ".env.example");

  const _exampleEnvContent = exampleEnvContent + envContent;

  // Generate an auth secret and put in .env, not .env.example
  const secret = Buffer.from(
    crypto.getRandomValues(new Uint8Array(32))
  ).toString("base64");
  const _envContent = envContent
    .replace(
      'AUTH_SECRET=""',
      `AUTH_SECRET="${secret}" # Generated by create-t3-app.`
    )
    .replace(
      'BETTER_AUTH_SECRET=""',
      `BETTER_AUTH_SECRET="${secret}" # Generated by create-t3-app.`
    );

  fs.writeFileSync(envDest, _envContent, "utf-8");
  fs.writeFileSync(envExampleDest, _exampleEnvContent, "utf-8");
};

const getEnvContent = (
  usingNextAuth: boolean,
  usingBetterAuth: boolean,
  usingPrisma: boolean,
  usingDrizzle: boolean,
  databaseProvider: DatabaseProvider,
  scopedAppName: string
) => {
  let content = `
# When adding additional environment variables, the schema in "/src/env.js"
# should be updated accordingly.
`
    .trim()
    .concat("\n");

  if (usingNextAuth)
    content += `
# Next Auth
# You can generate a new secret on the command line with:
# npx auth secret
# https://next-auth.js.org/configuration/options#secret
AUTH_SECRET=""

# Next Auth Discord Provider
AUTH_DISCORD_ID=""
AUTH_DISCORD_SECRET=""
`;

  if (usingBetterAuth)
    content += `
# Better Auth
# Secret used by Better Auth
BETTER_AUTH_SECRET=""

# Better Auth GitHub OAuth
BETTER_AUTH_GITHUB_CLIENT_ID=""
BETTER_AUTH_GITHUB_CLIENT_SECRET=""
`;

  if (usingPrisma)
    content += `
# Prisma
# https://www.prisma.io/docs/reference/database-reference/connection-urls#env
`;

  if (usingDrizzle) content += "\n# Drizzle\n";

  if (usingPrisma || usingDrizzle) {
    if (databaseProvider === "planetscale") {
      if (usingDrizzle) {
        content += `# Get the Database URL from the "prisma" dropdown selector in PlanetScale.
# Change the query params at the end of the URL to "?ssl={"rejectUnauthorized":true}"
DATABASE_URL='mysql://YOUR_MYSQL_URL_HERE?ssl={"rejectUnauthorized":true}'`;
      } else {
        content += `# Get the Database URL from the "prisma" dropdown selector in PlanetScale.
DATABASE_URL='mysql://YOUR_MYSQL_URL_HERE?sslaccept=strict'`;
      }
    } else if (databaseProvider === "mysql") {
      content += `DATABASE_URL="mysql://root:password@localhost:3306/${scopedAppName}"`;
    } else if (databaseProvider === "postgres") {
      content += `DATABASE_URL="postgresql://postgres:password@localhost:5432/${scopedAppName}"`;
    } else if (databaseProvider === "sqlite") {
      content += 'DATABASE_URL="file:./db.sqlite"';
    }
    content += "\n";
  }

  if (!usingNextAuth && !usingBetterAuth && !usingPrisma && !usingDrizzle)
    content += `
# Example:
# SERVERVAR="foo"
# NEXT_PUBLIC_CLIENTVAR="bar"
`;

  return content;
};

const exampleEnvContent = `
# Since the ".env" file is gitignored, you can use the ".env.example" file to
# build a new ".env" file when you clone the repo. Keep this file up-to-date
# when you add new variables to \`.env\`.

# This file will be committed to version control, so make sure not to have any
# secrets in it. If you are cloning this repo, create a copy of this file named
# ".env" and populate it with your secrets.
`
  .trim()
  .concat("\n\n");


================================================
FILE: cli/src/installers/eslint.ts
================================================
import path from "path";
import fs from "fs-extra";

import { PKG_ROOT } from "~/consts.js";
import { type Installer } from "~/installers/index.js";
import { addPackageDependency } from "~/utils/addPackageDependency.js";
import { addPackageScript } from "~/utils/addPackageScript.js";
import { getUserPkgManager } from "~/utils/getUserPkgManager.js";
import { type AvailableDependencies } from "./dependencyVersionMap.js";

// Also installs prettier
export const dynamicEslintInstaller: Installer = ({ projectDir, packages }) => {
  const devPackages: AvailableDependencies[] = [
    "prettier",
    "eslint",
    "eslint-config-next",
    "typescript-eslint",
    "@eslint/eslintrc",
  ];

  if (packages?.tailwind.inUse) {
    devPackages.push("prettier-plugin-tailwindcss");
  }
  if (packages?.drizzle.inUse) {
    devPackages.push("eslint-plugin-drizzle");
  }

  addPackageDependency({
    projectDir,
    dependencies: devPackages,
    devMode: true,
  });
  const extrasDir = path.join(PKG_ROOT, "template/extras");

  // Prettier
  let prettierSrc: string;
  if (packages?.tailwind.inUse) {
    prettierSrc = path.join(extrasDir, "config/_tailwind.prettier.config.js");
  } else {
    prettierSrc = path.join(extrasDir, "config/_prettier.config.js");
  }
  const prettierDest = path.join(projectDir, "prettier.config.js");

  fs.copySync(prettierSrc, prettierDest);

  // pnpm
  const pkgManager = getUserPkgManager();
  if (pkgManager === "pnpm") {
    const pnpmSrc = path.join(extrasDir, "pnpm/_npmrc");
    fs.copySync(pnpmSrc, path.join(projectDir, ".npmrc"));
  }

  addPackageScript({
    projectDir,
    scripts: {
      lint: "next lint",
      "lint:fix": "next lint --fix",
      check: "next lint && tsc --noEmit",
      "format:write": 'prettier --write "**/*.{ts,tsx,js,jsx,mdx}" --cache',
      "format:check": 'prettier --check "**/*.{ts,tsx,js,jsx,mdx}" --cache',
    },
  });

  // eslint
  const usingDrizzle = !!packages?.drizzle?.inUse;
  const eslintConfigSrc = path.join(
    extrasDir,
    usingDrizzle ? "config/_eslint.drizzle.js" : "config/_eslint.base.js"
  );
  const eslintConfigDest = path.join(projectDir, "eslint.config.js");

  fs.copySync(eslintConfigSrc, eslintConfigDest);
};


================================================
FILE: cli/src/installers/index.ts
================================================
import { envVariablesInstaller } from "~/installers/envVars.js";
import { nextAuthInstaller } from "~/installers/nextAuth.js";
import { prismaInstaller } from "~/installers/prisma.js";
import { tailwindInstaller } from "~/installers/tailwind.js";
import { trpcInstaller } from "~/installers/trpc.js";
import { type PackageManager } from "~/utils/getUserPkgManager.js";
import { betterAuthInstaller } from "./betterAuth.js";
import { biomeInstaller } from "./biome.js";
import { dbContainerInstaller } from "./dbContainer.js";
import { drizzleInstaller } from "./drizzle.js";
import { dynamicEslintInstaller } from "./eslint.js";

// Turning this into a const allows the list to be iterated over for programmatically creating prompt options
// Should increase extensibility in the future
export const availablePackages = [
  "nextAuth",
  "betterAuth",
  "prisma",
  "drizzle",
  "tailwind",
  "trpc",
  "envVariables",
  "eslint",
  "biome",
  "dbContainer",
] as const;
export type AvailablePackages = (typeof availablePackages)[number];

export const databaseProviders = [
  "mysql",
  "postgres",
  "sqlite",
  "planetscale",
] as const;
export type DatabaseProvider = (typeof databaseProviders)[number];

export interface InstallerOptions {
  projectDir: string;
  pkgManager: PackageManager;
  noInstall: boolean;
  packages?: PkgInstallerMap;
  appRouter?: boolean;
  projectName: string;
  scopedAppName: string;
  databaseProvider: DatabaseProvider;
}

export type Installer = (opts: InstallerOptions) => void;

export type PkgInstallerMap = Record<
  AvailablePackages,
  {
    inUse: boolean;
    installer: Installer;
  }
>;

export const buildPkgInstallerMap = (
  packages: AvailablePackages[],
  databaseProvider: DatabaseProvider
): PkgInstallerMap => ({
  nextAuth: {
    inUse: packages.includes("nextAuth"),
    installer: nextAuthInstaller,
  },
  betterAuth: {
    inUse: packages.includes("betterAuth"),
    installer: betterAuthInstaller,
  },
  prisma: {
    inUse: packages.includes("prisma"),
    installer: prismaInstaller,
  },
  drizzle: {
    inUse: packages.includes("drizzle"),
    installer: drizzleInstaller,
  },
  tailwind: {
    inUse: packages.includes("tailwind"),
    installer: tailwindInstaller,
  },
  trpc: {
    inUse: packages.includes("trpc"),
    installer: trpcInstaller,
  },
  dbContainer: {
    inUse: ["mysql", "postgres"].includes(databaseProvider),
    installer: dbContainerInstaller,
  },
  envVariables: {
    inUse: true,
    installer: envVariablesInstaller,
  },
  eslint: {
    inUse: packages.includes("eslint"),
    installer: dynamicEslintInstaller,
  },
  biome: {
    inUse: packages.includes("biome"),
    installer: biomeInstaller,
  },
});


================================================
FILE: cli/src/installers/nextAuth.ts
================================================
import path from "path";
import fs from "fs-extra";

import { PKG_ROOT } from "~/consts.js";
import { type AvailableDependencies } from "~/installers/dependencyVersionMap.js";
import { type Installer } from "~/installers/index.js";
import { addPackageDependency } from "~/utils/addPackageDependency.js";

export const nextAuthInstaller: Installer = ({ projectDir, packages }) => {
  const usingPrisma = packages?.prisma.inUse;
  const usingDrizzle = packages?.drizzle.inUse;

  const deps: AvailableDependencies[] = ["next-auth"];
  if (usingPrisma) deps.push("@auth/prisma-adapter");
  if (usingDrizzle) deps.push("@auth/drizzle-adapter");

  addPackageDependency({
    projectDir,
    dependencies: deps,
    devMode: false,
  });

  const extrasDir = path.join(PKG_ROOT, "template/extras");

  const apiHandlerFile = "src/app/api/auth/[...nextauth]/route.ts";

  const apiHandlerSrc = path.join(extrasDir, apiHandlerFile);
  const apiHandlerDest = path.join(projectDir, apiHandlerFile);

  const authConfigSrc = path.join(
    extrasDir,
    "src/server/auth/config",
    usingPrisma
      ? "with-prisma.ts"
      : usingDrizzle
        ? "with-drizzle.ts"
        : "base.ts"
  );
  const authConfigDest = path.join(projectDir, "src/server/auth/config.ts");

  const authIndexSrc = path.join(extrasDir, "src/server/auth/index.ts");
  const authIndexDest = path.join(projectDir, "src/server/auth/index.ts");

  fs.copySync(apiHandlerSrc, apiHandlerDest);
  fs.copySync(authConfigSrc, authConfigDest);
  fs.copySync(authIndexSrc, authIndexDest);
};


================================================
FILE: cli/src/installers/prisma.ts
================================================
import path from "path";
import fs from "fs-extra";

import { PKG_ROOT } from "~/consts.js";
import { type Installer } from "~/installers/index.js";
import { addPackageDependency } from "~/utils/addPackageDependency.js";
import { addPackageScript } from "~/utils/addPackageScript.js";

export const prismaInstaller: Installer = ({
  projectDir,
  packages,
  databaseProvider,
}) => {
  addPackageDependency({
    projectDir,
    dependencies: ["prisma"],
    devMode: true,
  });
  addPackageDependency({
    projectDir,
    dependencies: ["@prisma/client"],
    devMode: false,
  });
  if (databaseProvider === "planetscale")
    addPackageDependency({
      projectDir,
      dependencies: ["@prisma/adapter-planetscale", "@planetscale/database"],
      devMode: false,
    });

  const extrasDir = path.join(PKG_ROOT, "template/extras");

  const schemaBaseName = packages?.betterAuth.inUse
    ? "with-better-auth"
    : packages?.nextAuth.inUse
      ? "with-auth"
      : "base";
  const schemaSrc = path.join(
    extrasDir,
    "prisma/schema",
    `${schemaBaseName}${
      databaseProvider === "planetscale" ? "-planetscale" : ""
    }.prisma`
  );
  let schemaText = fs.readFileSync(schemaSrc, "utf-8");
  if (databaseProvider !== "sqlite") {
    schemaText = schemaText.replace(
      'provider = "sqlite"',
      `provider = "${
        {
          mysql: "mysql",
          postgres: "postgresql",
          planetscale: "mysql",
        }[databaseProvider]
      }"`
    );
    if (["mysql", "planetscale"].includes(databaseProvider)) {
      schemaText = schemaText.replace("// @db.Text", "@db.Text");
    }
  }
  const schemaDest = path.join(projectDir, "prisma/schema.prisma");
  fs.mkdirSync(path.dirname(schemaDest), { recursive: true });
  fs.writeFileSync(schemaDest, schemaText);

  const clientSrc = path.join(
    extrasDir,
    databaseProvider === "planetscale"
      ? "src/server/db/db-prisma-planetscale.ts"
      : "src/server/db/db-prisma.ts"
  );
  const clientDest = path.join(projectDir, "src/server/db.ts");

  addPackageScript({
    projectDir,
    scripts: {
      postinstall: "prisma generate",
      "db:push": "prisma db push",
      "db:studio": "prisma studio",
      "db:generate": "prisma migrate dev",
      "db:migrate": "prisma migrate deploy",
    },
  });

  fs.copySync(clientSrc, clientDest);
};


================================================
FILE: cli/src/installers/tailwind.ts
================================================
import path from "path";
import fs from "fs-extra";

import { PKG_ROOT } from "~/consts.js";
import { type Installer } from "~/installers/index.js";
import { addPackageDependency } from "~/utils/addPackageDependency.js";

export const tailwindInstaller: Installer = ({ projectDir }) => {
  addPackageDependency({
    projectDir,
    dependencies: ["tailwindcss", "postcss", "@tailwindcss/postcss"],
    devMode: true,
  });

  const extrasDir = path.join(PKG_ROOT, "template/extras");

  const postcssCfgSrc = path.join(extrasDir, "config/postcss.config.js");
  const postcssCfgDest = path.join(projectDir, "postcss.config.js");

  const cssSrc = path.join(extrasDir, "src/styles/globals.css");
  const cssDest = path.join(projectDir, "src/styles/globals.css");

  fs.copySync(postcssCfgSrc, postcssCfgDest);
  fs.copySync(cssSrc, cssDest);
};


================================================
FILE: cli/src/installers/trpc.ts
================================================
import path from "path";
import fs from "fs-extra";

import { PKG_ROOT } from "~/consts.js";
import { type Installer } from "~/installers/index.js";
import { addPackageDependency } from "~/utils/addPackageDependency.js";

export const trpcInstaller: Installer = ({
  projectDir,
  packages,
  appRouter,
}) => {
  addPackageDependency({
    projectDir,
    dependencies: [
      "@tanstack/react-query",
      "superjson",
      "@trpc/server",
      "@trpc/client",
      "@trpc/react-query",
    ],
    devMode: false,
  });

  const usingAuth = packages?.nextAuth.inUse;
  const usingBetterAuth = packages?.betterAuth.inUse;
  const usingPrisma = packages?.prisma.inUse;
  const usingDrizzle = packages?.drizzle.inUse;
  const usingDb = usingPrisma === true || usingDrizzle === true;

  const extrasDir = path.join(PKG_ROOT, "template/extras");

  const apiHandlerFile = "src/pages/api/trpc/[trpc].
Download .txt
gitextract_17kc1cit/

├── .changeset/
│   ├── README.md
│   ├── beige-clouds-behave.md
│   ├── config.json
│   ├── curly-zoos-add.md
│   ├── quick-snakes-give.md
│   └── tender-humans-hide.md
├── .codesandbox/
│   └── tasks.json
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── actions/
│   │   └── setup/
│   │       └── action.yml
│   ├── changeset-version.js
│   ├── labeler.yml
│   ├── pull_request_template.md
│   ├── scripts/
│   │   └── generate-matrix.js
│   ├── version-script-beta.js
│   ├── version-script-next.js
│   └── workflows/
│       ├── ci.yml
│       ├── e2e.yml
│       ├── pr-labeler.yml
│       ├── prerelease-comment.yml
│       ├── prerelease.yml
│       ├── release.yml
│       └── translations.yml
├── .gitignore
├── .gitpod.yml
├── .vscode/
│   ├── extensions.json
│   └── settings.json
├── CONTRIBUTING.md
├── LICENSE
├── cli/
│   ├── .yarnrc.yml
│   ├── CHANGELOG.md
│   ├── README.md
│   ├── eslint.config.js
│   ├── package.json
│   ├── prettier.config.mjs
│   ├── src/
│   │   ├── cli/
│   │   │   └── index.ts
│   │   ├── consts.ts
│   │   ├── helpers/
│   │   │   ├── createProject.ts
│   │   │   ├── format.ts
│   │   │   ├── git.ts
│   │   │   ├── installDependencies.ts
│   │   │   ├── installPackages.ts
│   │   │   ├── logNextSteps.ts
│   │   │   ├── scaffoldProject.ts
│   │   │   ├── selectBoilerplate.ts
│   │   │   └── setImportAlias.ts
│   │   ├── index.ts
│   │   ├── installers/
│   │   │   ├── betterAuth.ts
│   │   │   ├── biome.ts
│   │   │   ├── dbContainer.ts
│   │   │   ├── dependencyVersionMap.ts
│   │   │   ├── drizzle.ts
│   │   │   ├── envVars.ts
│   │   │   ├── eslint.ts
│   │   │   ├── index.ts
│   │   │   ├── nextAuth.ts
│   │   │   ├── prisma.ts
│   │   │   ├── tailwind.ts
│   │   │   └── trpc.ts
│   │   └── utils/
│   │       ├── addPackageDependency.ts
│   │       ├── addPackageScript.ts
│   │       ├── getT3Version.ts
│   │       ├── getUserPkgManager.ts
│   │       ├── isTTYError.ts
│   │       ├── logger.ts
│   │       ├── parseNameAndPath.ts
│   │       ├── removeTrailingSlash.ts
│   │       ├── renderTitle.ts
│   │       ├── renderVersionWarning.ts
│   │       ├── validateAppName.ts
│   │       └── validateImportAlias.ts
│   ├── template/
│   │   ├── base/
│   │   │   ├── README.md
│   │   │   ├── _gitignore
│   │   │   ├── next.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── env.js
│   │   │   │   └── styles/
│   │   │   │       └── globals.css
│   │   │   └── tsconfig.json
│   │   └── extras/
│   │       ├── config/
│   │       │   ├── _eslint.base.js
│   │       │   ├── _eslint.drizzle.js
│   │       │   ├── _prettier.config.js
│   │       │   ├── _tailwind.prettier.config.js
│   │       │   ├── biome.jsonc
│   │       │   ├── drizzle-config-mysql.ts
│   │       │   ├── drizzle-config-postgres.ts
│   │       │   ├── drizzle-config-sqlite.ts
│   │       │   ├── next-config-appdir.js
│   │       │   └── postcss.config.js
│   │       ├── pnpm/
│   │       │   └── _npmrc
│   │       ├── prisma/
│   │       │   └── schema/
│   │       │       ├── base-planetscale.prisma
│   │       │       ├── base.prisma
│   │       │       ├── with-auth-planetscale.prisma
│   │       │       ├── with-auth.prisma
│   │       │       ├── with-better-auth-planetscale.prisma
│   │       │       └── with-better-auth.prisma
│   │       ├── src/
│   │       │   ├── app/
│   │       │   │   ├── _components/
│   │       │   │   │   ├── post-tw.tsx
│   │       │   │   │   └── post.tsx
│   │       │   │   ├── api/
│   │       │   │   │   ├── auth/
│   │       │   │   │   │   ├── [...all]/
│   │       │   │   │   │   │   └── route.ts
│   │       │   │   │   │   └── [...nextauth]/
│   │       │   │   │   │       └── route.ts
│   │       │   │   │   └── trpc/
│   │       │   │   │       └── [trpc]/
│   │       │   │   │           └── route.ts
│   │       │   │   ├── layout/
│   │       │   │   │   ├── base.tsx
│   │       │   │   │   ├── with-trpc-tw.tsx
│   │       │   │   │   ├── with-trpc.tsx
│   │       │   │   │   └── with-tw.tsx
│   │       │   │   └── page/
│   │       │   │       ├── base.tsx
│   │       │   │       ├── with-auth-trpc-tw.tsx
│   │       │   │       ├── with-auth-trpc.tsx
│   │       │   │       ├── with-better-auth-trpc-tw.tsx
│   │       │   │       ├── with-better-auth-trpc.tsx
│   │       │   │       ├── with-better-auth-tw.tsx
│   │       │   │       ├── with-better-auth.tsx
│   │       │   │       ├── with-trpc-tw.tsx
│   │       │   │       ├── with-trpc.tsx
│   │       │   │       └── with-tw.tsx
│   │       │   ├── env/
│   │       │   │   ├── with-auth-db-planetscale.js
│   │       │   │   ├── with-auth-db.js
│   │       │   │   ├── with-auth.js
│   │       │   │   ├── with-better-auth-db-planetscale.js
│   │       │   │   ├── with-better-auth-db.js
│   │       │   │   ├── with-better-auth.js
│   │       │   │   ├── with-db-planetscale.js
│   │       │   │   └── with-db.js
│   │       │   ├── index.module.css
│   │       │   ├── pages/
│   │       │   │   ├── _app/
│   │       │   │   │   ├── base.tsx
│   │       │   │   │   ├── with-auth-trpc-tw.tsx
│   │       │   │   │   ├── with-auth-trpc.tsx
│   │       │   │   │   ├── with-auth-tw.tsx
│   │       │   │   │   ├── with-auth.tsx
│   │       │   │   │   ├── with-better-auth-trpc-tw.tsx
│   │       │   │   │   ├── with-better-auth-trpc.tsx
│   │       │   │   │   ├── with-trpc-tw.tsx
│   │       │   │   │   ├── with-trpc.tsx
│   │       │   │   │   └── with-tw.tsx
│   │       │   │   ├── api/
│   │       │   │   │   ├── auth/
│   │       │   │   │   │   └── [...all].ts
│   │       │   │   │   └── trpc/
│   │       │   │   │       └── [trpc].ts
│   │       │   │   └── index/
│   │       │   │       ├── base.tsx
│   │       │   │       ├── with-auth-trpc-tw.tsx
│   │       │   │       ├── with-auth-trpc.tsx
│   │       │   │       ├── with-better-auth-trpc-tw.tsx
│   │       │   │       ├── with-better-auth-trpc.tsx
│   │       │   │       ├── with-better-auth-tw.tsx
│   │       │   │       ├── with-better-auth.tsx
│   │       │   │       ├── with-trpc-tw.tsx
│   │       │   │       ├── with-trpc.tsx
│   │       │   │       └── with-tw.tsx
│   │       │   ├── server/
│   │       │   │   ├── api/
│   │       │   │   │   ├── root.ts
│   │       │   │   │   ├── routers/
│   │       │   │   │   │   └── post/
│   │       │   │   │   │       ├── base.ts
│   │       │   │   │   │       ├── with-auth-drizzle.ts
│   │       │   │   │   │       ├── with-auth-prisma.ts
│   │       │   │   │   │       ├── with-auth.ts
│   │       │   │   │   │       ├── with-drizzle.ts
│   │       │   │   │   │       └── with-prisma.ts
│   │       │   │   │   ├── trpc-app/
│   │       │   │   │   │   ├── base.ts
│   │       │   │   │   │   ├── with-auth-db.ts
│   │       │   │   │   │   ├── with-auth.ts
│   │       │   │   │   │   ├── with-better-auth-db.ts
│   │       │   │   │   │   ├── with-better-auth.ts
│   │       │   │   │   │   └── with-db.ts
│   │       │   │   │   └── trpc-pages/
│   │       │   │   │       ├── base.ts
│   │       │   │   │       ├── with-auth-db.ts
│   │       │   │   │       ├── with-auth.ts
│   │       │   │   │       ├── with-better-auth-db.ts
│   │       │   │   │       ├── with-better-auth.ts
│   │       │   │   │       └── with-db.ts
│   │       │   │   ├── auth/
│   │       │   │   │   ├── config/
│   │       │   │   │   │   ├── base.ts
│   │       │   │   │   │   ├── with-drizzle.ts
│   │       │   │   │   │   └── with-prisma.ts
│   │       │   │   │   └── index.ts
│   │       │   │   ├── better-auth/
│   │       │   │   │   ├── client.ts
│   │       │   │   │   ├── config/
│   │       │   │   │   │   ├── base.ts
│   │       │   │   │   │   ├── with-drizzle.ts
│   │       │   │   │   │   └── with-prisma.ts
│   │       │   │   │   ├── index.ts
│   │       │   │   │   └── server.ts
│   │       │   │   └── db/
│   │       │   │       ├── db-prisma-planetscale.ts
│   │       │   │       ├── db-prisma.ts
│   │       │   │       ├── index-drizzle/
│   │       │   │       │   ├── with-mysql.ts
│   │       │   │       │   ├── with-planetscale.ts
│   │       │   │       │   ├── with-postgres.ts
│   │       │   │       │   └── with-sqlite.ts
│   │       │   │       └── schema-drizzle/
│   │       │   │           ├── base-mysql.ts
│   │       │   │           ├── base-planetscale.ts
│   │       │   │           ├── base-postgres.ts
│   │       │   │           ├── base-sqlite.ts
│   │       │   │           ├── with-auth-mysql.ts
│   │       │   │           ├── with-auth-planetscale.ts
│   │       │   │           ├── with-auth-postgres.ts
│   │       │   │           ├── with-auth-sqlite.ts
│   │       │   │           ├── with-better-auth-mysql.ts
│   │       │   │           ├── with-better-auth-planetscale.ts
│   │       │   │           ├── with-better-auth-postgres.ts
│   │       │   │           └── with-better-auth-sqlite.ts
│   │       │   ├── styles/
│   │       │   │   └── globals.css
│   │       │   ├── trpc/
│   │       │   │   ├── query-client.ts
│   │       │   │   ├── react.tsx
│   │       │   │   └── server.ts
│   │       │   └── utils/
│   │       │       └── api.ts
│   │       └── start-database/
│   │           ├── mysql.sh
│   │           └── postgres.sh
│   ├── tsconfig.eslint.json
│   ├── tsconfig.json
│   └── tsup.config.ts
├── package.json
├── pnpm-workspace.yaml
├── prettier.config.mjs
├── reset.d.ts
├── tsconfig.json
├── turbo.json
└── www/
    ├── .env.example
    ├── .gitignore
    ├── README.md
    ├── TRANSLATIONS.md
    ├── astro.config.mjs
    ├── package.json
    ├── postcss.config.cjs
    ├── prettier.config.mjs
    ├── public/
    │   ├── makeScrollableCodeFocusable.js
    │   └── robots.txt
    ├── src/
    │   ├── .vscode/
    │   │   └── settings.json
    │   ├── components/
    │   │   ├── accessibility/
    │   │   │   └── jumpToContent.astro
    │   │   ├── branding/
    │   │   │   └── Asset.astro
    │   │   ├── docs/
    │   │   │   ├── avatarList.astro
    │   │   │   ├── breadCrumbs.tsx
    │   │   │   ├── callout.tsx
    │   │   │   ├── companyList.tsx
    │   │   │   ├── exampleOptionForm.astro
    │   │   │   ├── folderStructureDiagramApp.astro
    │   │   │   ├── folderStructureDiagramPages.astro
    │   │   │   ├── folderStructureForm.astro
    │   │   │   ├── indexPage.astro
    │   │   │   ├── introductionTab.tsx
    │   │   │   ├── openSourceAppList.tsx
    │   │   │   ├── outdatedDocsBanner.astro
    │   │   │   ├── pageContent.astro
    │   │   │   ├── pagination.astro
    │   │   │   └── tabs.astro
    │   │   ├── footer/
    │   │   │   └── footer.astro
    │   │   ├── headCommon.astro
    │   │   ├── headSeo.astro
    │   │   ├── icons/
    │   │   │   ├── leftArrow.astro
    │   │   │   └── rightArrow.astro
    │   │   ├── landingPage/
    │   │   │   ├── ClipboardSelect.tsx
    │   │   │   ├── about.astro
    │   │   │   ├── banner.astro
    │   │   │   ├── button.astro
    │   │   │   ├── cli.tsx
    │   │   │   ├── community/
    │   │   │   │   ├── community.astro
    │   │   │   │   └── communityCard.astro
    │   │   │   ├── pageSection.astro
    │   │   │   ├── stack/
    │   │   │   │   ├── card.astro
    │   │   │   │   └── stack.astro
    │   │   │   └── tweets/
    │   │   │       ├── featuredTweets.ts
    │   │   │       ├── tweetCard.astro
    │   │   │       ├── tweetSlider.astro
    │   │   │       └── tweets.astro
    │   │   ├── navigation/
    │   │   │   ├── LanguageSelect.tsx
    │   │   │   ├── OnThisPageLinks.tsx
    │   │   │   ├── Search.tsx
    │   │   │   ├── githubIcon.astro
    │   │   │   ├── leftSidebar.astro
    │   │   │   ├── moreMenu.astro
    │   │   │   ├── navbar.astro
    │   │   │   ├── rightSidebar.astro
    │   │   │   ├── sidebarToggle.astro
    │   │   │   ├── tableOfContents.astro
    │   │   │   └── themeToggleButton.astro
    │   │   └── openGraph.tsx
    │   ├── config.ts
    │   ├── env.d.ts
    │   ├── languages.ts
    │   ├── layouts/
    │   │   ├── docs.astro
    │   │   └── landingPage.astro
    │   ├── pages/
    │   │   ├── 404.astro
    │   │   ├── ar/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.md
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.md
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── branding.astro
    │   │   ├── en/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.mdx
    │   │   │   │   └── vercel.md
    │   │   │   ├── examples.mdx
    │   │   │   ├── faq.mdx
    │   │   │   ├── folder-structure-app.mdx
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.mdx
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── _next-auth-app-router.mdx
    │   │   │   │   ├── _next-auth-pages.mdx
    │   │   │   │   ├── drizzle.mdx
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.mdx
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── es/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.md
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.md
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── fr/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.mdx
    │   │   │   │   └── vercel.md
    │   │   │   ├── examples.mdx
    │   │   │   ├── faq.mdx
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.mdx
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── index.astro
    │   │   ├── ja/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.mdx
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.mdx
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── no/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.md
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.md
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── og.ts
    │   │   ├── pl/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── examples.mdx
    │   │   │   ├── faq.md
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.md
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── pt/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.mdx
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.mdx
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── ru/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── faq.md
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.md
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   ├── themeTest.astro
    │   │   ├── uk/
    │   │   │   ├── deployment/
    │   │   │   │   ├── docker.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── netlify.md
    │   │   │   │   └── vercel.md
    │   │   │   ├── examples.mdx
    │   │   │   ├── faq.mdx
    │   │   │   ├── folder-structure-pages.mdx
    │   │   │   ├── installation.mdx
    │   │   │   ├── introduction.md
    │   │   │   ├── other-recs.md
    │   │   │   ├── t3-collection.mdx
    │   │   │   ├── usage/
    │   │   │   │   ├── drizzle.mdx
    │   │   │   │   ├── env-variables.mdx
    │   │   │   │   ├── first-steps.md
    │   │   │   │   ├── index.astro
    │   │   │   │   ├── next-auth.mdx
    │   │   │   │   ├── next-js.md
    │   │   │   │   ├── prisma.md
    │   │   │   │   ├── tailwind.md
    │   │   │   │   ├── trpc.md
    │   │   │   │   └── typescript.md
    │   │   │   └── why.md
    │   │   └── zh-hans/
    │   │       ├── deployment/
    │   │       │   ├── docker.md
    │   │       │   ├── index.astro
    │   │       │   ├── netlify.mdx
    │   │       │   └── vercel.md
    │   │       ├── faq.mdx
    │   │       ├── folder-structure-pages.mdx
    │   │       ├── installation.mdx
    │   │       ├── introduction.md
    │   │       ├── other-recs.md
    │   │       ├── t3-collection.mdx
    │   │       ├── usage/
    │   │       │   ├── drizzle.mdx
    │   │       │   ├── env-variables.mdx
    │   │       │   ├── first-steps.md
    │   │       │   ├── index.astro
    │   │       │   ├── next-auth.mdx
    │   │       │   ├── next-js.md
    │   │       │   ├── prisma.md
    │   │       │   ├── tailwind.md
    │   │       │   ├── trpc.md
    │   │       │   └── typescript.md
    │   │       └── why.md
    │   ├── styles/
    │   │   ├── accessibility.css
    │   │   ├── algolia/
    │   │   │   ├── button.css
    │   │   │   ├── modal.css
    │   │   │   └── style.css
    │   │   ├── global.css
    │   │   └── swiper.css
    │   └── utils/
    │       ├── fetchGithub.ts
    │       ├── ogFont.ts
    │       ├── pagination.ts
    │       └── siteUrl.ts
    ├── tailwind.config.ts
    ├── tsconfig.json
    └── vercel.json
Download .txt
SYMBOL INDEX (136 symbols across 81 files)

FILE: .github/scripts/generate-matrix.js
  function generateCombinations (line 14) | function generateCombinations(opts) {
  function isValid (line 36) | function isValid(combo) {

FILE: cli/src/cli/index.ts
  type CliFlags (line 18) | interface CliFlags {
  type CliResults (line 48) | interface CliResults {
  method onCancel (line 380) | onCancel() {

FILE: cli/src/consts.ts
  constant PKG_ROOT (line 8) | const PKG_ROOT = path.join(distPath, "../");
  constant TITLE_TEXT (line 12) | const TITLE_TEXT = `   ___ ___ ___   __ _____ ___   _____ ____    __   _...
  constant DEFAULT_APP_NAME (line 17) | const DEFAULT_APP_NAME = "my-t3-app";
  constant CREATE_T3_APP (line 18) | const CREATE_T3_APP = "create-t3-app";

FILE: cli/src/helpers/createProject.ts
  type CreateProjectOptions (line 19) | interface CreateProjectOptions {

FILE: cli/src/helpers/installPackages.ts
  type InstallPackagesOptions (line 10) | type InstallPackagesOptions = InstallerOptions & {

FILE: cli/src/helpers/selectBoilerplate.ts
  type SelectBoilerplateProps (line 7) | type SelectBoilerplateProps = Required<

FILE: cli/src/helpers/setImportAlias.ts
  function replaceTextInFiles (line 4) | function replaceTextInFiles(

FILE: cli/src/index.ts
  type CT3APackageJSON (line 25) | type CT3APackageJSON = PackageJson & {

FILE: cli/src/installers/dependencyVersionMap.ts
  type AvailableDependencies (line 53) | type AvailableDependencies = keyof typeof dependencyVersionMap;

FILE: cli/src/installers/index.ts
  type AvailablePackages (line 27) | type AvailablePackages = (typeof availablePackages)[number];
  type DatabaseProvider (line 35) | type DatabaseProvider = (typeof databaseProviders)[number];
  type InstallerOptions (line 37) | interface InstallerOptions {
  type Installer (line 48) | type Installer = (opts: InstallerOptions) => void;
  type PkgInstallerMap (line 50) | type PkgInstallerMap = Record<

FILE: cli/src/utils/getUserPkgManager.ts
  type PackageManager (line 1) | type PackageManager = "npm" | "pnpm" | "yarn" | "bun";

FILE: cli/src/utils/isTTYError.ts
  class IsTTYError (line 1) | class IsTTYError extends Error {
    method constructor (line 2) | constructor(msg: string) {

FILE: cli/src/utils/logger.ts
  method error (line 4) | error(...args: unknown[]) {
  method warn (line 7) | warn(...args: unknown[]) {
  method info (line 10) | info(...args: unknown[]) {
  method success (line 13) | success(...args: unknown[]) {

FILE: cli/src/utils/renderVersionWarning.ts
  type DistTagsBody (line 41) | interface DistTagsBody {
  function checkForLatestVersion (line 45) | function checkForLatestVersion(): Promise<string> {

FILE: cli/template/extras/src/app/_components/post-tw.tsx
  function LatestPost (line 7) | function LatestPost() {

FILE: cli/template/extras/src/app/_components/post.tsx
  function LatestPost (line 8) | function LatestPost() {

FILE: cli/template/extras/src/app/layout/base.tsx
  function RootLayout (line 16) | function RootLayout({

FILE: cli/template/extras/src/app/layout/with-trpc-tw.tsx
  function RootLayout (line 19) | function RootLayout({

FILE: cli/template/extras/src/app/layout/with-trpc.tsx
  function RootLayout (line 18) | function RootLayout({

FILE: cli/template/extras/src/app/layout/with-tw.tsx
  function RootLayout (line 17) | function RootLayout({

FILE: cli/template/extras/src/app/page/base.tsx
  function Home (line 5) | function Home() {

FILE: cli/template/extras/src/app/page/with-auth-trpc-tw.tsx
  function Home (line 7) | async function Home() {

FILE: cli/template/extras/src/app/page/with-auth-trpc.tsx
  function Home (line 8) | async function Home() {

FILE: cli/template/extras/src/app/page/with-better-auth-trpc-tw.tsx
  function Home (line 10) | async function Home() {

FILE: cli/template/extras/src/app/page/with-better-auth-trpc.tsx
  function Home (line 11) | async function Home() {

FILE: cli/template/extras/src/app/page/with-better-auth-tw.tsx
  function Home (line 8) | async function Home() {

FILE: cli/template/extras/src/app/page/with-better-auth.tsx
  function Home (line 9) | async function Home() {

FILE: cli/template/extras/src/app/page/with-trpc-tw.tsx
  function Home (line 6) | async function Home() {

FILE: cli/template/extras/src/app/page/with-trpc.tsx
  function Home (line 7) | async function Home() {

FILE: cli/template/extras/src/app/page/with-tw.tsx
  function HomePage (line 3) | function HomePage() {

FILE: cli/template/extras/src/pages/index/base.tsx
  function Home (line 6) | function Home() {

FILE: cli/template/extras/src/pages/index/with-auth-trpc-tw.tsx
  function Home (line 7) | function Home() {
  function AuthShowcase (line 58) | function AuthShowcase() {

FILE: cli/template/extras/src/pages/index/with-auth-trpc.tsx
  function Home (line 8) | function Home() {
  function AuthShowcase (line 59) | function AuthShowcase() {

FILE: cli/template/extras/src/pages/index/with-better-auth-trpc-tw.tsx
  function Home (line 7) | function Home() {
  function AuthShowcase (line 58) | function AuthShowcase() {

FILE: cli/template/extras/src/pages/index/with-better-auth-trpc.tsx
  function Home (line 8) | function Home() {
  function AuthShowcase (line 59) | function AuthShowcase() {

FILE: cli/template/extras/src/pages/index/with-better-auth-tw.tsx
  function Home (line 6) | function Home() {
  function AuthShowcase (line 52) | function AuthShowcase() {

FILE: cli/template/extras/src/pages/index/with-better-auth.tsx
  function Home (line 7) | function Home() {
  function AuthShowcase (line 53) | function AuthShowcase() {

FILE: cli/template/extras/src/pages/index/with-trpc-tw.tsx
  function Home (line 6) | function Home() {

FILE: cli/template/extras/src/pages/index/with-trpc.tsx
  function Home (line 7) | function Home() {

FILE: cli/template/extras/src/pages/index/with-tw.tsx
  function Home (line 4) | function Home() {

FILE: cli/template/extras/src/server/api/root.ts
  type AppRouter (line 14) | type AppRouter = typeof appRouter;

FILE: cli/template/extras/src/server/api/routers/post/base.ts
  type Post (line 6) | interface Post {

FILE: cli/template/extras/src/server/api/trpc-app/base.ts
  method errorFormatter (line 40) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/api/trpc-app/with-auth-db.ts
  method errorFormatter (line 48) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/api/trpc-app/with-auth.ts
  method errorFormatter (line 45) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/api/trpc-app/with-better-auth-db.ts
  method errorFormatter (line 49) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/api/trpc-app/with-better-auth.ts
  method errorFormatter (line 46) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/api/trpc-app/with-db.ts
  method errorFormatter (line 43) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/api/trpc-pages/base.ts
  type CreateContextOptions (line 23) | type CreateContextOptions = Record<string, never>;
  method errorFormatter (line 59) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/api/trpc-pages/with-auth-db.ts
  type CreateContextOptions (line 27) | interface CreateContextOptions {
  method errorFormatter (line 75) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/api/trpc-pages/with-auth.ts
  type CreateContextOptions (line 25) | interface CreateContextOptions {
  method errorFormatter (line 73) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/api/trpc-pages/with-better-auth-db.ts
  type CreateContextOptions (line 27) | interface CreateContextOptions {
  method errorFormatter (line 83) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/api/trpc-pages/with-better-auth.ts
  type CreateContextOptions (line 26) | interface CreateContextOptions {
  method errorFormatter (line 81) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/api/trpc-pages/with-db.ts
  type CreateContextOptions (line 24) | type CreateContextOptions = Record<string, never>;
  method errorFormatter (line 62) | errorFormatter({ shape, error }) {

FILE: cli/template/extras/src/server/auth/config/base.ts
  type Session (line 11) | interface Session extends DefaultSession {

FILE: cli/template/extras/src/server/auth/config/with-drizzle.ts
  type Session (line 20) | interface Session extends DefaultSession {

FILE: cli/template/extras/src/server/auth/config/with-prisma.ts
  type Session (line 14) | interface Session extends DefaultSession {

FILE: cli/template/extras/src/server/better-auth/client.ts
  type Session (line 5) | type Session = typeof authClient.$Infer.Session;

FILE: cli/template/extras/src/server/better-auth/config/base.ts
  type Session (line 12) | type Session = typeof auth.$Infer.Session;

FILE: cli/template/extras/src/server/better-auth/config/with-drizzle.ts
  type Session (line 26) | type Session = typeof auth.$Infer.Session;

FILE: cli/template/extras/src/server/better-auth/config/with-prisma.ts
  type Session (line 26) | type Session = typeof auth.$Infer.Session;

FILE: cli/template/extras/src/trpc/react.tsx
  type RouterInputs (line 32) | type RouterInputs = inferRouterInputs<AppRouter>;
  type RouterOutputs (line 39) | type RouterOutputs = inferRouterOutputs<AppRouter>;
  function TRPCReactProvider (line 41) | function TRPCReactProvider(props: { children: React.ReactNode }) {
  function getBaseUrl (line 74) | function getBaseUrl() {

FILE: cli/template/extras/src/utils/api.ts
  method config (line 22) | config() {
  type RouterInputs (line 61) | type RouterInputs = inferRouterInputs<AppRouter>;
  type RouterOutputs (line 68) | type RouterOutputs = inferRouterOutputs<AppRouter>;

FILE: www/src/components/docs/breadCrumbs.tsx
  type SlugType (line 6) | type SlugType = "" | "deployment" | "usage";
  function BreadCrumbs (line 8) | function BreadCrumbs() {
  function BreadCrumbsArrow (line 103) | function BreadCrumbsArrow(props: { isRtl: boolean }) {

FILE: www/src/components/docs/callout.tsx
  function Callout (line 3) | function Callout({

FILE: www/src/components/docs/companyList.tsx
  type Company (line 1) | interface Company {
  function CompanyList (line 70) | function CompanyList({

FILE: www/src/components/docs/introductionTab.tsx
  function IntroductionTab (line 3) | function IntroductionTab() {

FILE: www/src/components/docs/openSourceAppList.tsx
  type App (line 1) | interface App {
  function OpenSourceAppList (line 349) | function OpenSourceAppList({

FILE: www/src/components/landingPage/ClipboardSelect.tsx
  function ClipboardSelect (line 24) | function ClipboardSelect() {

FILE: www/src/components/landingPage/cli.tsx
  function CodeCard (line 4) | function CodeCard() {

FILE: www/src/components/landingPage/tweets/featuredTweets.ts
  type Tweet (line 1) | interface Tweet {

FILE: www/src/components/navigation/LanguageSelect.tsx
  type LanguageSelectProps (line 8) | interface LanguageSelectProps {
  function LanguageSelect (line 12) | function LanguageSelect({ language }: LanguageSelectProps) {

FILE: www/src/components/navigation/OnThisPageLinks.tsx
  type OnThisPageLinksProps (line 6) | interface OnThisPageLinksProps {
  function OnThisPageLinks (line 12) | function OnThisPageLinks({

FILE: www/src/components/navigation/Search.tsx
  function Search (line 23) | function Search({ isLanding }: { isLanding: boolean }) {

FILE: www/src/components/openGraph.tsx
  type OpenGraphProps (line 1) | interface OpenGraphProps {
  function OpenGraph (line 9) | function OpenGraph({

FILE: www/src/config.ts
  constant SITE (line 1) | const SITE = {
  constant OPEN_GRAPH (line 7) | const OPEN_GRAPH = {
  type Frontmatter (line 16) | interface Frontmatter {
  constant KNOWN_LANGUAGES (line 27) | const KNOWN_LANGUAGES = {
  type KnownLanguageCode (line 42) | type KnownLanguageCode = keyof typeof KNOWN_LANGUAGES;
  constant GITHUB_EDIT_URL (line 44) | const GITHUB_EDIT_URL = `https://github.com/t3-oss/create-t3-app/tree/ma...
  constant COMMUNITY_INVITE_URL (line 46) | const COMMUNITY_INVITE_URL = `https://t3.gg/discord`;
  constant ALGOLIA (line 49) | const ALGOLIA = {
  type OuterHeaders (line 55) | type OuterHeaders = "Create T3 App" | "Deployment" | "Usage";
  type SidebarItem (line 57) | interface SidebarItem<
  type SidebarItemLink (line 64) | type SidebarItemLink = SidebarItem["link"];
  type Sidebar (line 66) | type Sidebar = {
  constant SIDEBAR (line 71) | const SIDEBAR: Sidebar = {
  constant SIDEBAR_HEADER_MAP (line 418) | const SIDEBAR_HEADER_MAP: Record<

FILE: www/src/languages.ts
  function getLanguageFromURL (line 7) | function getLanguageFromURL(pathname: string) {
  function getIsRtlFromUrl (line 29) | function getIsRtlFromUrl(pathname: string) {
  function getIsRtlFromLangCode (line 34) | function getIsRtlFromLangCode(language: KnownLanguageCode) {

FILE: www/src/utils/fetchGithub.ts
  type Options (line 3) | interface Options<T extends "commits" | "repo"> {
  type Commit (line 27) | type Commit = z.infer<typeof commitsSchema>[number];

FILE: www/src/utils/ogFont.ts
  function getFont (line 3) | async function getFont<TWeights extends readonly number[]>({

FILE: www/src/utils/pagination.ts
  function paginate (line 8) | function paginate(lang: keyof Sidebar, path: SidebarItemLink) {

FILE: www/src/utils/siteUrl.ts
  constant SITE_URL (line 1) | const SITE_URL = import.meta.env.VERCEL_URL
Condensed preview — 520 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,787K chars).
[
  {
    "path": ".changeset/README.md",
    "chars": 510,
    "preview": "# Changesets\n\nHello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that wo"
  },
  {
    "path": ".changeset/beige-clouds-behave.md",
    "chars": 54,
    "preview": "---\n\"create-t3-app\": patch\n---\n\nfix #1903 #2157 #2163\n"
  },
  {
    "path": ".changeset/config.json",
    "chars": 387,
    "preview": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@2.1.1/schema.json\",\n  \"changelog\": [\n    \"@changesets/changelog-git"
  },
  {
    "path": ".changeset/curly-zoos-add.md",
    "chars": 94,
    "preview": "---\n\"create-t3-app\": minor\n---\n\nFixes Biome formatter during the initial installation process\n"
  },
  {
    "path": ".changeset/quick-snakes-give.md",
    "chars": 190,
    "preview": "---\n\"create-t3-app\": patch\n---\n\nfix(security): bump react and next ([BLOG](https://react.dev/blog/2025/12/03/critical-se"
  },
  {
    "path": ".changeset/tender-humans-hide.md",
    "chars": 152,
    "preview": "---\n\"create-t3-app\": patch\n---\n\nfix(security): bump react ([CVE-2025-55182](https://github.com/facebook/react/security/a"
  },
  {
    "path": ".codesandbox/tasks.json",
    "chars": 1607,
    "preview": "{\n  // These tasks will run in order when initializing your CodeSandbox project.\n  \"setupTasks\": [\n    {\n      \"name\": \""
  },
  {
    "path": ".gitattributes",
    "chars": 37,
    "preview": "# mdx\n*.mdx linguist-detectable=false"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 146,
    "preview": "# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners\n\n* @juliusmarminge @ne"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 1548,
    "preview": "name: 🐞 Bug Report\ndescription: Create a bug report to help us improve\ntitle: \"bug: \"\nlabels: [\"🐞❔ unconfirmed bug\"]\nbod"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 165,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Ask a question\n    url: https://t3.gg/discord\n    about: Ask questi"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 1038,
    "preview": "name: 🧑‍💻 Feature Request\ndescription: Suggest an idea for this project\ntitle: \"feat: \"\nlabels: [\"🌟 enhancement\"]\nbody:\n"
  },
  {
    "path": ".github/actions/setup/action.yml",
    "chars": 276,
    "preview": "name: \"Setup and install\"\ndescription: \"Common setup steps for Actions\"\n\nruns:\n  using: composite\n  steps:\n    - uses: p"
  },
  {
    "path": ".github/changeset-version.js",
    "chars": 630,
    "preview": "// ORIGINALLY FROM CLOUDFLARE WRANGLER:\n// https://github.com/cloudflare/wrangler2/blob/main/.github/changeset-version.j"
  },
  {
    "path": ".github/labeler.yml",
    "chars": 191,
    "preview": "\"📌 area: cli\":\n  - any: [\"cli/**/*\"]\n\n\"📌 area: t3-app\":\n  - any: [\"cli/template/**/*\"]\n\n\"📚 documentation\":\n  - any: [\"ww"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 468,
    "preview": "Closes #<issue>\n\n## ✅ Checklist\n\n- [ ] I have followed every step in the [contributing guide](https://github.com/t3-oss/"
  },
  {
    "path": ".github/scripts/generate-matrix.js",
    "chars": 1406,
    "preview": "// Define all possible values\nconst options = {\n  trpc: ['true', 'false'],\n  tailwind: ['true', 'false'],\n  nextAuth: ['"
  },
  {
    "path": ".github/version-script-beta.js",
    "chars": 693,
    "preview": "// ORIGINALLY FROM CLOUDFLARE WRANGLER:\n// https://github.com/cloudflare/wrangler2/blob/main/.github/version-script.js\ni"
  },
  {
    "path": ".github/version-script-next.js",
    "chars": 693,
    "preview": "// ORIGINALLY FROM CLOUDFLARE WRANGLER:\n// https://github.com/cloudflare/wrangler2/blob/main/.github/version-script.js\ni"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 2163,
    "preview": "# this workflow will run on every pr to make sure the project is following the guidelines\n\n# after labeler, run other ac"
  },
  {
    "path": ".github/workflows/e2e.yml",
    "chars": 6130,
    "preview": "# this workflow will run on every pr to make sure the project is following the guidelines\n\n# after labeler, run other ac"
  },
  {
    "path": ".github/workflows/pr-labeler.yml",
    "chars": 733,
    "preview": "# this workflow will run on every pr to make sure the project is following the guidelines\n\n# run labeler with elevated p"
  },
  {
    "path": ".github/workflows/prerelease-comment.yml",
    "chars": 2163,
    "preview": "name: Write Beta Release comment\n\non:\n  workflow_run:\n    workflows: [\"Release - Beta\"]\n    types:\n      - completed\n\njo"
  },
  {
    "path": ".github/workflows/prerelease.yml",
    "chars": 1379,
    "preview": "# Originally inspired by Cloudflare Wrangler\n# https://github.com/cloudflare/wrangler2/blob/main/.github/workflows/prere"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1289,
    "preview": "# Originally inspired by Cloudflare Wrangler\n# https://github.com/cloudflare/wrangler2/blob/main/.github/workflows/relea"
  },
  {
    "path": ".github/workflows/translations.yml",
    "chars": 2496,
    "preview": "name: \"Notify codeowners about changes in docs\"\n\non:\n  pull_request_target:\n    types: [opened, edited, synchronize]\n   "
  },
  {
    "path": ".gitignore",
    "chars": 548,
    "preview": "### STANDARD GIT IGNORE FILE ###\n\n# DEPENDENCIES\nnode_modules/\n/.pnp\n.pnp.js\npackage-lock.json\nyarn.lock\n\n# TESTING\n/cov"
  },
  {
    "path": ".gitpod.yml",
    "chars": 114,
    "preview": "tasks:\n  - init: pnpm install\nvscode:\n  extensions:\n    - astro-build.astro-vscode\n    - bradlc.vscode-tailwindcss"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 215,
    "preview": "{\n  \"recommendations\": [\n    \"esbenp.prettier-vscode\",\n    \"dbaeumer.vscode-eslint\",\n    \"astro-build.astro-vscode\",\n   "
  },
  {
    "path": ".vscode/settings.json",
    "chars": 1328,
    "preview": "{\n  \"workbench.colorCustomizations\": {\n    \"titleBar.activeBackground\": \"#1f0d49\",\n    \"titleBar.activeForeground\": \"#e2"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 4556,
    "preview": "# Contribution Guidelines\n\nWhen contributing to `create-t3-app`, whether on GitHub or in other community spaces:\n\n- Be r"
  },
  {
    "path": "LICENSE",
    "chars": 1070,
    "preview": "MIT License\n\nCopyright (c) 2022 Shoubhit Dash\n\nPermission is hereby granted, free of charge, to any person obtaining a c"
  },
  {
    "path": "cli/.yarnrc.yml",
    "chars": 146,
    "preview": "packageExtensions:\n  chalk@5.0.1:\n    dependencies:\n      \"#ansi-styles\": npm:ansi-styles@6.1.0\n      \"#supports-color\":"
  },
  {
    "path": "cli/CHANGELOG.md",
    "chars": 78599,
    "preview": "# Changelog\n\n## 7.38.1\n\n### Patch Changes\n\n- [#2010](https://github.com/t3-oss/create-t3-app/pull/2010) [`12fccae15d08bc"
  },
  {
    "path": "cli/README.md",
    "chars": 6276,
    "preview": "<p align=\"center\">\n  <picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/"
  },
  {
    "path": "cli/eslint.config.js",
    "chars": 2113,
    "preview": "// @ts-check\nimport tseslint from \"typescript-eslint\";\n// import isaacscript from \"eslint-plugin-isaacscript\";\nimport im"
  },
  {
    "path": "cli/package.json",
    "chars": 2817,
    "preview": "{\n  \"name\": \"create-t3-app\",\n  \"version\": \"7.40.0\",\n  \"description\": \"Create web application with the t3 stack\",\n  \"lice"
  },
  {
    "path": "cli/prettier.config.mjs",
    "chars": 677,
    "preview": "import baseConfig from \"../prettier.config.mjs\";\n\n/**\n * @type {import('prettier').Config & import('prettier-plugin-tail"
  },
  {
    "path": "cli/src/cli/index.ts",
    "chars": 15441,
    "preview": "import * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { CREATE_T3"
  },
  {
    "path": "cli/src/consts.ts",
    "chars": 840,
    "preview": "import path from \"path\";\nimport { fileURLToPath } from \"url\";\n\n// With the move to TSUP as a build tool, this keeps path"
  },
  {
    "path": "cli/src/helpers/createProject.ts",
    "chars": 2233,
    "preview": "import fs from \"fs\";\nimport path from \"path\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { installPackages } from \""
  },
  {
    "path": "cli/src/helpers/format.ts",
    "chars": 891,
    "preview": "import chalk from \"chalk\";\nimport { execa } from \"execa\";\nimport ora from \"ora\";\n\nimport { type PackageManager } from \"~"
  },
  {
    "path": "cli/src/helpers/git.ts",
    "chars": 4286,
    "preview": "import { execSync } from \"child_process\";\nimport path from \"path\";\nimport * as p from \"@clack/prompts\";\nimport chalk fro"
  },
  {
    "path": "cli/src/helpers/installDependencies.ts",
    "chars": 2583,
    "preview": "import chalk from \"chalk\";\nimport { execa, type StdioOption } from \"execa\";\nimport ora, { type Ora } from \"ora\";\n\nimport"
  },
  {
    "path": "cli/src/helpers/installPackages.ts",
    "chars": 838,
    "preview": "import chalk from \"chalk\";\nimport ora from \"ora\";\n\nimport {\n  type InstallerOptions,\n  type PkgInstallerMap,\n} from \"~/i"
  },
  {
    "path": "cli/src/helpers/logNextSteps.ts",
    "chars": 1898,
    "preview": "import { DEFAULT_APP_NAME } from \"~/consts.js\";\nimport { type InstallerOptions } from \"~/installers/index.js\";\nimport { "
  },
  {
    "path": "cli/src/helpers/scaffoldProject.ts",
    "chars": 2746,
    "preview": "import path from \"path\";\nimport * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimpo"
  },
  {
    "path": "cli/src/helpers/selectBoilerplate.ts",
    "chars": 5150,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { type InstallerOpti"
  },
  {
    "path": "cli/src/helpers/setImportAlias.ts",
    "chars": 975,
    "preview": "import fs from \"fs\";\nimport path from \"path\";\n\nfunction replaceTextInFiles(\n  directoryPath: string,\n  search: string,\n "
  },
  {
    "path": "cli/src/index.ts",
    "chars": 3459,
    "preview": "#!/usr/bin/env node\nimport path from \"path\";\nimport { execa } from \"execa\";\nimport fs from \"fs-extra\";\nimport { type Pac"
  },
  {
    "path": "cli/src/installers/betterAuth.ts",
    "chars": 3738,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { type AvailableDepe"
  },
  {
    "path": "cli/src/installers/biome.ts",
    "chars": 897,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { type Installer } f"
  },
  {
    "path": "cli/src/installers/dbContainer.ts",
    "chars": 1309,
    "preview": "import fs from \"fs\";\nimport path from \"path\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { type Installer } from \"~"
  },
  {
    "path": "cli/src/installers/dependencyVersionMap.ts",
    "chars": 1325,
    "preview": "/*\n * This maps the necessary packages to a version.\n * This improves performance significantly over fetching it from th"
  },
  {
    "path": "cli/src/installers/drizzle.ts",
    "chars": 2476,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { type Installer } f"
  },
  {
    "path": "cli/src/installers/envVars.ts",
    "chars": 4964,
    "preview": "import crypto from \"node:crypto\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/const"
  },
  {
    "path": "cli/src/installers/eslint.ts",
    "chars": 2222,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { type Installer } f"
  },
  {
    "path": "cli/src/installers/index.ts",
    "chars": 2709,
    "preview": "import { envVariablesInstaller } from \"~/installers/envVars.js\";\nimport { nextAuthInstaller } from \"~/installers/nextAut"
  },
  {
    "path": "cli/src/installers/nextAuth.ts",
    "chars": 1552,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { type AvailableDepe"
  },
  {
    "path": "cli/src/installers/prisma.ts",
    "chars": 2351,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { type Installer } f"
  },
  {
    "path": "cli/src/installers/tailwind.ts",
    "chars": 844,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { type Installer } f"
  },
  {
    "path": "cli/src/installers/trpc.ts",
    "chars": 3800,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { type Installer } f"
  },
  {
    "path": "cli/src/utils/addPackageDependency.ts",
    "chars": 982,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\nimport sortPackageJson from \"sort-package-json\";\nimport { type Packa"
  },
  {
    "path": "cli/src/utils/addPackageScript.ts",
    "chars": 668,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\nimport sortPackageJson from \"sort-package-json\";\nimport { type Packa"
  },
  {
    "path": "cli/src/utils/getT3Version.ts",
    "chars": 368,
    "preview": "import path from \"path\";\nimport fs from \"fs-extra\";\nimport { type PackageJson } from \"type-fest\";\n\nimport { PKG_ROOT } f"
  },
  {
    "path": "cli/src/utils/getUserPkgManager.ts",
    "chars": 599,
    "preview": "export type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\nexport const getUserPkgManager: () => PackageManager = ()"
  },
  {
    "path": "cli/src/utils/isTTYError.ts",
    "chars": 91,
    "preview": "export class IsTTYError extends Error {\n  constructor(msg: string) {\n    super(msg);\n  }\n}\n"
  },
  {
    "path": "cli/src/utils/logger.ts",
    "chars": 349,
    "preview": "import chalk from \"chalk\";\n\nexport const logger = {\n  error(...args: unknown[]) {\n    console.log(chalk.red(...args));\n "
  },
  {
    "path": "cli/src/utils/parseNameAndPath.ts",
    "chars": 1428,
    "preview": "import pathModule from \"path\";\n\nimport { removeTrailingSlash } from \"./removeTrailingSlash.js\";\n\n/**\n * Parses the appNa"
  },
  {
    "path": "cli/src/utils/removeTrailingSlash.ts",
    "chars": 161,
    "preview": "export const removeTrailingSlash = (input: string) => {\n  if (input.length > 1 && input.endsWith(\"/\")) {\n    input = inp"
  },
  {
    "path": "cli/src/utils/renderTitle.ts",
    "chars": 678,
    "preview": "import gradient from \"gradient-string\";\n\nimport { TITLE_TEXT } from \"~/consts.js\";\nimport { getUserPkgManager } from \"~/"
  },
  {
    "path": "cli/src/utils/renderVersionWarning.ts",
    "chars": 2527,
    "preview": "import { execSync } from \"child_process\";\nimport https from \"https\";\n\nimport { getVersion } from \"./getT3Version.js\";\nim"
  },
  {
    "path": "cli/src/utils/validateAppName.ts",
    "chars": 815,
    "preview": "import { removeTrailingSlash } from \"./removeTrailingSlash.js\";\n\nconst validationRegExp =\n  /^(?:@[a-z0-9-*~][a-z0-9-*._"
  },
  {
    "path": "cli/src/utils/validateImportAlias.ts",
    "chars": 184,
    "preview": "export const validateImportAlias = (input: string) => {\n  if (input.startsWith(\".\") || input.startsWith(\"/\")) {\n    retu"
  },
  {
    "path": "cli/template/base/README.md",
    "chars": 1434,
    "preview": "# Create T3 App\n\nThis is a [T3 Stack](https://create.t3.gg/) project bootstrapped with `create-t3-app`.\n\n## What's next?"
  },
  {
    "path": "cli/template/base/_gitignore",
    "chars": 632,
    "preview": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pn"
  },
  {
    "path": "cli/template/base/next.config.js",
    "chars": 483,
    "preview": "/**\n * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially useful\n * for Docker b"
  },
  {
    "path": "cli/template/base/package.json",
    "chars": 576,
    "preview": "{\n  \"name\": \"template\",\n  \"version\": \"0.1.0\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"next dev"
  },
  {
    "path": "cli/template/base/src/env.js",
    "chars": 1272,
    "preview": "import { createEnv } from \"@t3-oss/env-nextjs\";\nimport { z } from \"zod\";\n\nexport const env = createEnv({\n  /**\n   * Spec"
  },
  {
    "path": "cli/template/base/src/styles/globals.css",
    "chars": 275,
    "preview": "html,\nbody {\n  padding: 0;\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,\n    "
  },
  {
    "path": "cli/template/base/tsconfig.json",
    "chars": 883,
    "preview": "{\n  \"compilerOptions\": {\n    /* Base Options: */\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"target\": \"e"
  },
  {
    "path": "cli/template/extras/config/_eslint.base.js",
    "chars": 1121,
    "preview": "import { FlatCompat } from \"@eslint/eslintrc\";\nimport tseslint from 'typescript-eslint';\n\nconst compat = new FlatCompat("
  },
  {
    "path": "cli/template/extras/config/_eslint.drizzle.js",
    "chars": 1469,
    "preview": "import { FlatCompat } from \"@eslint/eslintrc\";\nimport tseslint from 'typescript-eslint';\n// @ts-ignore -- no types for t"
  },
  {
    "path": "cli/template/extras/config/_prettier.config.js",
    "chars": 60,
    "preview": "/** @type {import('prettier').Config} */\nexport default {};\n"
  },
  {
    "path": "cli/template/extras/config/_tailwind.prettier.config.js",
    "chars": 159,
    "preview": "/** @type {import('prettier').Config & import('prettier-plugin-tailwindcss').PluginOptions} */\nexport default {\n  plugin"
  },
  {
    "path": "cli/template/extras/config/biome.jsonc",
    "chars": 1205,
    "preview": "{\n  \"$schema\": \"./node_modules/@biomejs/biome/configuration_schema.json\",\n  \"root\": true,\n  \"vcs\": {\n    \"enabled\": true"
  },
  {
    "path": "cli/template/extras/config/drizzle-config-mysql.ts",
    "chars": 253,
    "preview": "import { type Config } from \"drizzle-kit\";\n\nimport { env } from \"~/env\";\n\nexport default {\n  schema: \"./src/server/db/sc"
  },
  {
    "path": "cli/template/extras/config/drizzle-config-postgres.ts",
    "chars": 258,
    "preview": "import { type Config } from \"drizzle-kit\";\n\nimport { env } from \"~/env\";\n\nexport default {\n  schema: \"./src/server/db/sc"
  },
  {
    "path": "cli/template/extras/config/drizzle-config-sqlite.ts",
    "chars": 254,
    "preview": "import { type Config } from \"drizzle-kit\";\n\nimport { env } from \"~/env\";\n\nexport default {\n  schema: \"./src/server/db/sc"
  },
  {
    "path": "cli/template/extras/config/next-config-appdir.js",
    "chars": 239,
    "preview": "/**\n * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially useful\n * for Docker b"
  },
  {
    "path": "cli/template/extras/config/postcss.config.js",
    "chars": 70,
    "preview": "export default {\n  plugins: {\n    \"@tailwindcss/postcss\": {},\n  },\n};\n"
  },
  {
    "path": "cli/template/extras/pnpm/_npmrc",
    "chars": 65,
    "preview": "public-hoist-pattern[]=*eslint*\npublic-hoist-pattern[]=*prettier*"
  },
  {
    "path": "cli/template/extras/prisma/schema/base-planetscale.prisma",
    "chars": 630,
    "preview": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator clien"
  },
  {
    "path": "cli/template/extras/prisma/schema/base.prisma",
    "chars": 459,
    "preview": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator clien"
  },
  {
    "path": "cli/template/extras/prisma/schema/with-auth-planetscale.prisma",
    "chars": 2019,
    "preview": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator clien"
  },
  {
    "path": "cli/template/extras/prisma/schema/with-auth.prisma",
    "chars": 2211,
    "preview": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator clien"
  },
  {
    "path": "cli/template/extras/prisma/schema/with-better-auth-planetscale.prisma",
    "chars": 2418,
    "preview": "// Prisma schema for Better Auth\n// learn more: https://better-auth.com/docs/concepts/database\n\ngenerator client {\n  pro"
  },
  {
    "path": "cli/template/extras/prisma/schema/with-better-auth.prisma",
    "chars": 2385,
    "preview": "// Prisma schema for Better Auth\n// learn more: https://better-auth.com/docs/concepts/database\n\ngenerator client {\n  pro"
  },
  {
    "path": "cli/template/extras/src/app/_components/post-tw.tsx",
    "chars": 1310,
    "preview": "\"use client\";\n\nimport { useState } from \"react\";\n\nimport { api } from \"~/trpc/react\";\n\nexport function LatestPost() {\n  "
  },
  {
    "path": "cli/template/extras/src/app/_components/post.tsx",
    "chars": 1318,
    "preview": "\"use client\";\n\nimport { useState } from \"react\";\n\nimport { api } from \"~/trpc/react\";\nimport styles from \"../index.modul"
  },
  {
    "path": "cli/template/extras/src/app/api/auth/[...all]/route.ts",
    "chars": 162,
    "preview": "import { toNextJsHandler } from \"better-auth/next-js\";\n\nimport { auth } from \"~/server/better-auth\";\n\nexport const { GET"
  },
  {
    "path": "cli/template/extras/src/app/api/auth/[...nextauth]/route.ts",
    "chars": 82,
    "preview": "import { handlers } from \"~/server/auth\";\n\nexport const { GET, POST } = handlers;\n"
  },
  {
    "path": "cli/template/extras/src/app/api/trpc/[trpc]/route.ts",
    "chars": 1004,
    "preview": "import { fetchRequestHandler } from \"@trpc/server/adapters/fetch\";\nimport { type NextRequest } from \"next/server\";\n\nimpo"
  },
  {
    "path": "cli/template/extras/src/app/layout/base.tsx",
    "chars": 526,
    "preview": "import \"~/styles/globals.css\";\n\nimport { type Metadata } from \"next\";\nimport { Geist } from \"next/font/google\";\n\nexport "
  },
  {
    "path": "cli/template/extras/src/app/layout/with-trpc-tw.tsx",
    "chars": 669,
    "preview": "import \"~/styles/globals.css\";\n\nimport { type Metadata } from \"next\";\nimport { Geist } from \"next/font/google\";\n\nimport "
  },
  {
    "path": "cli/template/extras/src/app/layout/with-trpc.tsx",
    "chars": 632,
    "preview": "import \"~/styles/globals.css\";\n\nimport { type Metadata } from \"next\";\nimport { Geist } from \"next/font/google\";\n\nimport "
  },
  {
    "path": "cli/template/extras/src/app/layout/with-tw.tsx",
    "chars": 563,
    "preview": "import \"~/styles/globals.css\";\n\nimport { type Metadata } from \"next\";\nimport { Geist } from \"next/font/google\";\n\nexport "
  },
  {
    "path": "cli/template/extras/src/app/page/base.tsx",
    "chars": 1218,
    "preview": "import Link from \"next/link\";\n\nimport styles from \"./index.module.css\";\n\nexport default function Home() {\n  return (\n   "
  },
  {
    "path": "cli/template/extras/src/app/page/with-auth-trpc-tw.tsx",
    "chars": 2748,
    "preview": "import Link from \"next/link\";\n\nimport { LatestPost } from \"~/app/_components/post\";\nimport { auth } from \"~/server/auth\""
  },
  {
    "path": "cli/template/extras/src/app/page/with-auth-trpc.tsx",
    "chars": 2323,
    "preview": "import Link from \"next/link\";\n\nimport { LatestPost } from \"~/app/_components/post\";\nimport { auth } from \"~/server/auth\""
  },
  {
    "path": "cli/template/extras/src/app/page/with-better-auth-trpc-tw.tsx",
    "chars": 4076,
    "preview": "import { headers } from \"next/headers\";\nimport Link from \"next/link\";\nimport { redirect } from \"next/navigation\";\n\nimpor"
  },
  {
    "path": "cli/template/extras/src/app/page/with-better-auth-trpc.tsx",
    "chars": 3511,
    "preview": "import { headers } from \"next/headers\";\nimport Link from \"next/link\";\nimport { redirect } from \"next/navigation\";\n\nimpor"
  },
  {
    "path": "cli/template/extras/src/app/page/with-better-auth-tw.tsx",
    "chars": 3477,
    "preview": "import { headers } from \"next/headers\";\nimport Link from \"next/link\";\nimport { redirect } from \"next/navigation\";\n\nimpor"
  },
  {
    "path": "cli/template/extras/src/app/page/with-better-auth.tsx",
    "chars": 2912,
    "preview": "import { headers } from \"next/headers\";\nimport Link from \"next/link\";\nimport { redirect } from \"next/navigation\";\n\nimpor"
  },
  {
    "path": "cli/template/extras/src/app/page/with-trpc-tw.tsx",
    "chars": 2072,
    "preview": "import Link from \"next/link\";\n\nimport { LatestPost } from \"~/app/_components/post\";\nimport { api, HydrateClient } from \""
  },
  {
    "path": "cli/template/extras/src/app/page/with-trpc.tsx",
    "chars": 1759,
    "preview": "import Link from \"next/link\";\n\nimport { LatestPost } from \"~/app/_components/post\";\nimport { api, HydrateClient } from \""
  },
  {
    "path": "cli/template/extras/src/app/page/with-tw.tsx",
    "chars": 1559,
    "preview": "import Link from \"next/link\";\n\nexport default function HomePage() {\n  return (\n    <main className=\"flex min-h-screen fl"
  },
  {
    "path": "cli/template/extras/src/env/with-auth-db-planetscale.js",
    "chars": 1798,
    "preview": "import { createEnv } from \"@t3-oss/env-nextjs\";\nimport { z } from \"zod\";\n\nexport const env = createEnv({\n  /**\n   * Spec"
  },
  {
    "path": "cli/template/extras/src/env/with-auth-db.js",
    "chars": 1659,
    "preview": "import { createEnv } from \"@t3-oss/env-nextjs\";\nimport { z } from \"zod\";\n\nexport const env = createEnv({\n  /**\n   * Spec"
  },
  {
    "path": "cli/template/extras/src/env/with-auth.js",
    "chars": 1644,
    "preview": "import { createEnv } from \"@t3-oss/env-nextjs\";\nimport { z } from \"zod\";\n\nexport const env = createEnv({\n  /**\n   * Spec"
  },
  {
    "path": "cli/template/extras/src/env/with-better-auth-db-planetscale.js",
    "chars": 1897,
    "preview": "import { createEnv } from \"@t3-oss/env-nextjs\";\nimport { z } from \"zod\";\n\nexport const env = createEnv({\n  /**\n   * Spec"
  },
  {
    "path": "cli/template/extras/src/env/with-better-auth-db.js",
    "chars": 1743,
    "preview": "import { createEnv } from \"@t3-oss/env-nextjs\";\nimport { z } from \"zod\";\n\nexport const env = createEnv({\n  /**\n   * Spec"
  },
  {
    "path": "cli/template/extras/src/env/with-better-auth.js",
    "chars": 1728,
    "preview": "import { createEnv } from \"@t3-oss/env-nextjs\";\nimport { z } from \"zod\";\n\nexport const env = createEnv({\n  /**\n   * Spec"
  },
  {
    "path": "cli/template/extras/src/env/with-db-planetscale.js",
    "chars": 1528,
    "preview": "import { createEnv } from \"@t3-oss/env-nextjs\";\nimport { z } from \"zod\";\n\nexport const env = createEnv({\n  /**\n   * Spec"
  },
  {
    "path": "cli/template/extras/src/env/with-db.js",
    "chars": 1389,
    "preview": "import { createEnv } from \"@t3-oss/env-nextjs\";\nimport { z } from \"zod\";\n\nexport const env = createEnv({\n  /**\n   * Spec"
  },
  {
    "path": "cli/template/extras/src/index.module.css",
    "chars": 2812,
    "preview": ".main {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  min-height: 100vh"
  },
  {
    "path": "cli/template/extras/src/pages/_app/base.tsx",
    "chars": 364,
    "preview": "import { type AppType } from \"next/dist/shared/lib/utils\";\nimport { Geist } from \"next/font/google\";\n\nimport \"~/styles/g"
  },
  {
    "path": "cli/template/extras/src/pages/_app/with-auth-trpc-tw.tsx",
    "chars": 619,
    "preview": "import { type Session } from \"next-auth\";\nimport { SessionProvider } from \"next-auth/react\";\nimport { type AppType } fro"
  },
  {
    "path": "cli/template/extras/src/pages/_app/with-auth-trpc.tsx",
    "chars": 619,
    "preview": "import { type Session } from \"next-auth\";\nimport { SessionProvider } from \"next-auth/react\";\nimport { type AppType } fro"
  },
  {
    "path": "cli/template/extras/src/pages/_app/with-auth-tw.tsx",
    "chars": 569,
    "preview": "import { type Session } from \"next-auth\";\nimport { SessionProvider } from \"next-auth/react\";\nimport { type AppType } fro"
  },
  {
    "path": "cli/template/extras/src/pages/_app/with-auth.tsx",
    "chars": 569,
    "preview": "import { type Session } from \"next-auth\";\nimport { SessionProvider } from \"next-auth/react\";\nimport { type AppType } fro"
  },
  {
    "path": "cli/template/extras/src/pages/_app/with-better-auth-trpc-tw.tsx",
    "chars": 396,
    "preview": "import { type AppType } from \"next/app\";\nimport { Geist } from \"next/font/google\";\n\nimport { api } from \"~/utils/api\";\n\n"
  },
  {
    "path": "cli/template/extras/src/pages/_app/with-better-auth-trpc.tsx",
    "chars": 396,
    "preview": "import { type AppType } from \"next/app\";\nimport { Geist } from \"next/font/google\";\n\nimport { api } from \"~/utils/api\";\n\n"
  },
  {
    "path": "cli/template/extras/src/pages/_app/with-trpc-tw.tsx",
    "chars": 396,
    "preview": "import { type AppType } from \"next/app\";\nimport { Geist } from \"next/font/google\";\n\nimport { api } from \"~/utils/api\";\n\n"
  },
  {
    "path": "cli/template/extras/src/pages/_app/with-trpc.tsx",
    "chars": 396,
    "preview": "import { type AppType } from \"next/app\";\nimport { Geist } from \"next/font/google\";\n\nimport { api } from \"~/utils/api\";\n\n"
  },
  {
    "path": "cli/template/extras/src/pages/_app/with-tw.tsx",
    "chars": 346,
    "preview": "import { type AppType } from \"next/app\";\nimport { Geist } from \"next/font/google\";\n\nimport \"~/styles/globals.css\";\n\ncons"
  },
  {
    "path": "cli/template/extras/src/pages/api/auth/[...all].ts",
    "chars": 248,
    "preview": "import { toNodeHandler } from \"better-auth/node\";\n\nimport { auth } from \"~/server/better-auth\";\n\n// Disallow body parsin"
  },
  {
    "path": "cli/template/extras/src/pages/api/trpc/[trpc].ts",
    "chars": 537,
    "preview": "import { createNextApiHandler } from \"@trpc/server/adapters/next\";\n\nimport { env } from \"~/env\";\nimport { appRouter } fr"
  },
  {
    "path": "cli/template/extras/src/pages/index/base.tsx",
    "chars": 1510,
    "preview": "import Head from \"next/head\";\nimport Link from \"next/link\";\n\nimport styles from \"./index.module.css\";\n\nexport default fu"
  },
  {
    "path": "cli/template/extras/src/pages/index/with-auth-trpc-tw.tsx",
    "chars": 3077,
    "preview": "import { signIn, signOut, useSession } from \"next-auth/react\";\nimport Head from \"next/head\";\nimport Link from \"next/link"
  },
  {
    "path": "cli/template/extras/src/pages/index/with-auth-trpc.tsx",
    "chars": 2619,
    "preview": "import { signIn, signOut, useSession } from \"next-auth/react\";\nimport Head from \"next/head\";\nimport Link from \"next/link"
  },
  {
    "path": "cli/template/extras/src/pages/index/with-better-auth-trpc-tw.tsx",
    "chars": 3554,
    "preview": "import Head from \"next/head\";\nimport Link from \"next/link\";\n\nimport { authClient } from \"~/server/better-auth/client\";\ni"
  },
  {
    "path": "cli/template/extras/src/pages/index/with-better-auth-trpc.tsx",
    "chars": 3012,
    "preview": "import Head from \"next/head\";\nimport Link from \"next/link\";\n\nimport { authClient } from \"~/server/better-auth/client\";\ni"
  },
  {
    "path": "cli/template/extras/src/pages/index/with-better-auth-tw.tsx",
    "chars": 3103,
    "preview": "import Head from \"next/head\";\nimport Link from \"next/link\";\n\nimport { authClient } from \"~/server/better-auth/client\";\n\n"
  },
  {
    "path": "cli/template/extras/src/pages/index/with-better-auth.tsx",
    "chars": 2561,
    "preview": "import Head from \"next/head\";\nimport Link from \"next/link\";\n\nimport { authClient } from \"~/server/better-auth/client\";\ni"
  },
  {
    "path": "cli/template/extras/src/pages/index/with-trpc-tw.tsx",
    "chars": 2071,
    "preview": "import Head from \"next/head\";\nimport Link from \"next/link\";\n\nimport { api } from \"~/utils/api\";\n\nexport default function"
  },
  {
    "path": "cli/template/extras/src/pages/index/with-trpc.tsx",
    "chars": 1744,
    "preview": "import Head from \"next/head\";\nimport Link from \"next/link\";\n\nimport { api } from \"~/utils/api\";\nimport styles from \"./in"
  },
  {
    "path": "cli/template/extras/src/pages/index/with-tw.tsx",
    "chars": 1836,
    "preview": "import Head from \"next/head\";\nimport Link from \"next/link\";\n\nexport default function Home() {\n  return (\n    <>\n      <H"
  },
  {
    "path": "cli/template/extras/src/server/api/root.ts",
    "chars": 634,
    "preview": "import { postRouter } from \"~/server/api/routers/post\";\nimport { createCallerFactory, createTRPCRouter } from \"~/server/"
  },
  {
    "path": "cli/template/extras/src/server/api/routers/post/base.ts",
    "chars": 791,
    "preview": "import { z } from \"zod\";\n\nimport { createTRPCRouter, publicProcedure } from \"~/server/api/trpc\";\n\n// Mocked DB\ninterface"
  },
  {
    "path": "cli/template/extras/src/server/api/routers/post/with-auth-drizzle.ts",
    "chars": 963,
    "preview": "import { z } from \"zod\";\n\nimport {\n  createTRPCRouter,\n  protectedProcedure,\n  publicProcedure,\n} from \"~/server/api/trp"
  },
  {
    "path": "cli/template/extras/src/server/api/routers/post/with-auth-prisma.ts",
    "chars": 988,
    "preview": "import { z } from \"zod\";\n\nimport {\n  createTRPCRouter,\n  protectedProcedure,\n  publicProcedure,\n} from \"~/server/api/trp"
  },
  {
    "path": "cli/template/extras/src/server/api/routers/post/with-auth.ts",
    "chars": 769,
    "preview": "import { z } from \"zod\";\n\nimport {\n  createTRPCRouter,\n  protectedProcedure,\n  publicProcedure,\n} from \"~/server/api/trp"
  },
  {
    "path": "cli/template/extras/src/server/api/routers/post/with-drizzle.ts",
    "chars": 777,
    "preview": "import { z } from \"zod\";\n\nimport { createTRPCRouter, publicProcedure } from \"~/server/api/trpc\";\nimport { posts } from \""
  },
  {
    "path": "cli/template/extras/src/server/api/routers/post/with-prisma.ts",
    "chars": 724,
    "preview": "import { z } from \"zod\";\n\nimport { createTRPCRouter, publicProcedure } from \"~/server/api/trpc\";\n\nexport const postRoute"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-app/base.ts",
    "chars": 3085,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-app/with-auth-db.ts",
    "chars": 3839,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-app/with-auth.ts",
    "chars": 3796,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-app/with-better-auth-db.ts",
    "chars": 3892,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-app/with-better-auth.ts",
    "chars": 3849,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-app/with-db.ts",
    "chars": 3128,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-pages/base.ts",
    "chars": 3648,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-pages/with-auth-db.ts",
    "chars": 4610,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-pages/with-auth.ts",
    "chars": 4543,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-pages/with-better-auth-db.ts",
    "chars": 4848,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-pages/with-better-auth.ts",
    "chars": 4831,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/api/trpc-pages/with-db.ts",
    "chars": 3693,
    "preview": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. Y"
  },
  {
    "path": "cli/template/extras/src/server/auth/config/base.ts",
    "chars": 1433,
    "preview": "import { type DefaultSession, type NextAuthConfig } from \"next-auth\";\nimport DiscordProvider from \"next-auth/providers/d"
  },
  {
    "path": "cli/template/extras/src/server/auth/config/with-drizzle.ts",
    "chars": 1782,
    "preview": "import { DrizzleAdapter } from \"@auth/drizzle-adapter\";\nimport { type DefaultSession, type NextAuthConfig } from \"next-a"
  },
  {
    "path": "cli/template/extras/src/server/auth/config/with-prisma.ts",
    "chars": 1549,
    "preview": "import { PrismaAdapter } from \"@auth/prisma-adapter\";\nimport { type DefaultSession, type NextAuthConfig } from \"next-aut"
  },
  {
    "path": "cli/template/extras/src/server/auth/index.ts",
    "chars": 266,
    "preview": "import NextAuth from \"next-auth\";\nimport { cache } from \"react\";\n\nimport { authConfig } from \"./config\";\n\nconst { auth: "
  },
  {
    "path": "cli/template/extras/src/server/better-auth/client.ts",
    "chars": 158,
    "preview": "import { createAuthClient } from \"better-auth/react\";\n\nexport const authClient = createAuthClient();\n\nexport type Sessio"
  },
  {
    "path": "cli/template/extras/src/server/better-auth/config/base.ts",
    "chars": 317,
    "preview": "import { betterAuth } from \"better-auth\";\nimport { nextCookies } from \"better-auth/next-js\";\n\nexport const auth = better"
  },
  {
    "path": "cli/template/extras/src/server/better-auth/config/with-drizzle.ts",
    "chars": 749,
    "preview": "import { betterAuth } from \"better-auth\";\nimport { drizzleAdapter } from \"better-auth/adapters/drizzle\";\nimport { nextCo"
  },
  {
    "path": "cli/template/extras/src/server/better-auth/config/with-prisma.ts",
    "chars": 758,
    "preview": "import { betterAuth } from \"better-auth\";\nimport { prismaAdapter } from \"better-auth/adapters/prisma\";\nimport { nextCook"
  },
  {
    "path": "cli/template/extras/src/server/better-auth/index.ts",
    "chars": 33,
    "preview": "export { auth } from \"./config\";\n"
  },
  {
    "path": "cli/template/extras/src/server/better-auth/server.ts",
    "chars": 197,
    "preview": "import { auth } from \".\";\nimport { headers } from \"next/headers\";\nimport { cache } from \"react\";\n\nexport const getSessio"
  },
  {
    "path": "cli/template/extras/src/server/db/db-prisma-planetscale.ts",
    "chars": 610,
    "preview": "import { PrismaPlanetScale } from \"@prisma/adapter-planetscale\";\n\nimport { env } from \"~/env\";\nimport { PrismaClient } f"
  },
  {
    "path": "cli/template/extras/src/server/db/db-prisma.ts",
    "chars": 481,
    "preview": "import { env } from \"~/env\";\nimport { PrismaClient } from \"../../generated/prisma\";\n\nconst createPrismaClient = () =>\n  "
  },
  {
    "path": "cli/template/extras/src/server/db/index-drizzle/with-mysql.ts",
    "chars": 560,
    "preview": "import { drizzle } from \"drizzle-orm/mysql2\";\nimport { createPool, type Pool } from \"mysql2/promise\";\n\nimport { env } fr"
  },
  {
    "path": "cli/template/extras/src/server/db/index-drizzle/with-planetscale.ts",
    "chars": 255,
    "preview": "import { Client } from \"@planetscale/database\";\nimport { drizzle } from \"drizzle-orm/planetscale-serverless\";\n\nimport { "
  },
  {
    "path": "cli/template/extras/src/server/db/index-drizzle/with-postgres.ts",
    "chars": 522,
    "preview": "import { drizzle } from \"drizzle-orm/postgres-js\";\nimport postgres from \"postgres\";\n\nimport { env } from \"~/env\";\nimport"
  },
  {
    "path": "cli/template/extras/src/server/db/index-drizzle/with-sqlite.ts",
    "chars": 572,
    "preview": "import { createClient, type Client } from \"@libsql/client\";\nimport { drizzle } from \"drizzle-orm/libsql\";\n\nimport { env "
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/base-mysql.ts",
    "chars": 828,
    "preview": "// Example model schema from the Drizzle docs\n// https://orm.drizzle.team/docs/sql-schema-declaration\n\nimport { index, m"
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/base-planetscale.ts",
    "chars": 828,
    "preview": "// Example model schema from the Drizzle docs\n// https://orm.drizzle.team/docs/sql-schema-declaration\n\nimport { index, m"
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/base-postgres.ts",
    "chars": 875,
    "preview": "// Example model schema from the Drizzle docs\n// https://orm.drizzle.team/docs/sql-schema-declaration\n\nimport { index, p"
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/base-sqlite.ts",
    "chars": 906,
    "preview": "// Example model schema from the Drizzle docs\n// https://orm.drizzle.team/docs/sql-schema-declaration\n\nimport { sql } fr"
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/with-auth-mysql.ts",
    "chars": 3228,
    "preview": "import { relations, sql } from \"drizzle-orm\";\nimport { index, mysqlTableCreator, primaryKey } from \"drizzle-orm/mysql-co"
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/with-auth-planetscale.ts",
    "chars": 3113,
    "preview": "import { relations, sql } from \"drizzle-orm\";\nimport { index, mysqlTableCreator, primaryKey } from \"drizzle-orm/mysql-co"
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/with-auth-postgres.ts",
    "chars": 3291,
    "preview": "import { relations } from \"drizzle-orm\";\nimport { index, pgTableCreator, primaryKey } from \"drizzle-orm/pg-core\";\nimport"
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/with-auth-sqlite.ts",
    "chars": 3165,
    "preview": "import { relations, sql } from \"drizzle-orm\";\nimport { index, primaryKey, sqliteTableCreator } from \"drizzle-orm/sqlite-"
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/with-better-auth-mysql.ts",
    "chars": 3290,
    "preview": "import { relations } from \"drizzle-orm\";\nimport {\n  boolean,\n  index,\n  mysqlTable,\n  mysqlTableCreator,\n  text,\n  times"
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/with-better-auth-planetscale.ts",
    "chars": 3290,
    "preview": "import { relations } from \"drizzle-orm\";\nimport {\n  boolean,\n  index,\n  mysqlTable,\n  mysqlTableCreator,\n  text,\n  times"
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/with-better-auth-postgres.ts",
    "chars": 3138,
    "preview": "import { relations } from \"drizzle-orm\";\nimport {\n  boolean,\n  index,\n  pgTable,\n  pgTableCreator,\n  text,\n  timestamp,\n"
  },
  {
    "path": "cli/template/extras/src/server/db/schema-drizzle/with-better-auth-sqlite.ts",
    "chars": 3911,
    "preview": "import { relations, sql } from \"drizzle-orm\";\nimport { index, sqliteTable } from \"drizzle-orm/sqlite-core\";\n\n/**\n * Mult"
  },
  {
    "path": "cli/template/extras/src/styles/globals.css",
    "chars": 194,
    "preview": "@import \"tailwindcss\";\n\n@theme {\n  --font-sans: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif,\n    \"Apple"
  },
  {
    "path": "cli/template/extras/src/trpc/query-client.ts",
    "chars": 684,
    "preview": "import {\n  defaultShouldDehydrateQuery,\n  QueryClient,\n} from \"@tanstack/react-query\";\nimport SuperJSON from \"superjson\""
  },
  {
    "path": "cli/template/extras/src/trpc/react.tsx",
    "chars": 2348,
    "preview": "\"use client\";\n\nimport { QueryClientProvider, type QueryClient } from \"@tanstack/react-query\";\nimport { httpBatchStreamLi"
  },
  {
    "path": "cli/template/extras/src/trpc/server.ts",
    "chars": 886,
    "preview": "import \"server-only\";\n\nimport { createHydrationHelpers } from \"@trpc/react-query/rsc\";\nimport { headers } from \"next/hea"
  },
  {
    "path": "cli/template/extras/src/utils/api.ts",
    "chars": 2152,
    "preview": "/**\n * This is the client-side entrypoint for your tRPC API. It is used to create the `api` object which\n * contains the"
  }
]

// ... and 320 more files (download for full content)

About this extraction

This page contains the full source code of the t3-oss/create-t3-app GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 520 files (1.6 MB), approximately 489.9k tokens, and a symbol index with 136 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!