mirror of
https://github.com/FranP-code/create-better-t-stack.git
synced 2025-10-12 23:52:15 +00:00
update readme
This commit is contained in:
5
.changeset/vast-trains-end.md
Normal file
5
.changeset/vast-trains-end.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"create-better-t-stack": patch
|
||||
---
|
||||
|
||||
update readme
|
||||
14
README.md
14
README.md
@@ -2,13 +2,7 @@
|
||||
|
||||
A modern CLI tool for scaffolding end-to-end type-safe TypeScript projects with best practices and customizable configurations
|
||||
|
||||

|
||||
|
||||
## Sponsors
|
||||
|
||||
<p align="center">
|
||||
<img src="https://cdn.jsdelivr.net/gh/amanvarshney01/sponsors@master/sponsorkit/sponsors.svg" alt="Sponsors" width="300">
|
||||
</p>
|
||||

|
||||
|
||||
## Quick Start
|
||||
|
||||
@@ -67,6 +61,12 @@ bun dev:web
|
||||
|
||||
Just fork the repository and submit a pull request!
|
||||
|
||||
## Sponsors
|
||||
|
||||
<p align="center">
|
||||
<img src="https://cdn.jsdelivr.net/gh/amanvarshney01/sponsors@master/sponsorkit/sponsors.svg" alt="Sponsors" width="300">
|
||||
</p>
|
||||
|
||||
## Star History
|
||||
|
||||
<a href="https://www.star-history.com/#AmanVarshney01/create-better-t-stack&Date">
|
||||
|
||||
@@ -2,11 +2,7 @@
|
||||
|
||||
A modern CLI tool for scaffolding end-to-end type-safe TypeScript projects with best practices and customizable configurations
|
||||
|
||||
## Sponsors
|
||||
|
||||
<p align="center">
|
||||
<img src="https://cdn.jsdelivr.net/gh/amanvarshney01/sponsors@master/sponsorkit/sponsors.svg" alt="Sponsors" width="300">
|
||||
</p>
|
||||

|
||||
|
||||
## Quick Start
|
||||
|
||||
@@ -27,35 +23,21 @@ Follow the prompts to configure your project or use the `--yes` flag for default
|
||||
|
||||
## Features
|
||||
|
||||
- **TypeScript**: End-to-end type safety.
|
||||
- **Monorepo Structure**: Choose between Turborepo for optimized builds or standard pnpm/npm/bun workspaces.
|
||||
- **Frontend Options**:
|
||||
- React with Vite: TanStack Router, React Router, or TanStack Start.
|
||||
- Next.js (Full-stack or frontend-only).
|
||||
- Nuxt (Vue framework).
|
||||
- SvelteKit.
|
||||
- React Native with Expo for mobile apps.
|
||||
- None.
|
||||
- **UI**: Tailwind CSS with shadcn/ui components pre-configured.
|
||||
- **Backend Frameworks**: Choose between Hono, Express, Elysia, or use Next.js API routes.
|
||||
- **API Layer**: End-to-end type safety with tRPC or oRPC.
|
||||
- **Runtime Options**: Choose between Bun or Node.js for your server.
|
||||
- **Database Options**: SQLite, PostgreSQL, MySQL, MongoDB, or no database.
|
||||
- **ORM Selection**: Choose between Drizzle ORM (TypeScript-first), Prisma (feature-rich), or no ORM.
|
||||
- **Database Setup**: Optional automated setup for Turso (SQLite), Neon (Postgres), Prisma Postgres (Supabase), or MongoDB Atlas.
|
||||
- **Authentication**: Optional auth setup using Better-Auth (email/password, OAuth coming soon).
|
||||
- **Addons**:
|
||||
- **PWA**: Add Progressive Web App support.
|
||||
- **Tauri**: Build native desktop applications.
|
||||
- **Starlight**: Add an Astro-based documentation site.
|
||||
- **Biome**: Integrated linting and formatting.
|
||||
- **Husky**: Git hooks for code quality checks (lint-staged).
|
||||
- **Turborepo**: Optimized monorepo build system.
|
||||
- **Examples**: Include pre-built examples like a Todo app or an AI Chat interface (using Vercel AI SDK).
|
||||
- **Developer Experience**:
|
||||
- Automatic Git initialization.
|
||||
- Choice of package manager (npm, pnpm, bun).
|
||||
- Optional automatic dependency installation.
|
||||
| Category | Options |
|
||||
|----------|---------|
|
||||
| **TypeScript** | End-to-end type safety across all parts of your application |
|
||||
| **Frontend** | • React with TanStack Router<br>• React with React Router<br>• React with TanStack Start (SSR)<br>• Next.js<br>• SvelteKit<br>• Nuxt (Vue)<br>• SolidJS<br>• React Native with Expo<br>• None |
|
||||
| **Backend** | • Hono<br>• Express<br>• Elysia<br>• Next.js API routes<br>• Convex |
|
||||
| **API Layer** | • tRPC (type-safe APIs)<br>• oRPC (OpenAPI-compatible type-safe APIs) |
|
||||
| **Runtime** | • Bun<br>• Node.js |
|
||||
| **Database** | • SQLite<br>• PostgreSQL<br>• MySQL<br>• MongoDB<br>• None |
|
||||
| **ORM** | • Drizzle (TypeScript-first)<br>• Prisma (feature-rich)<br>• Mongoose (for MongoDB)<br>• None |
|
||||
| **Database Setup** | • Turso (SQLite)<br>• Neon (PostgreSQL)<br>• Prisma Postgres (via Prisma Accelerate)<br>• MongoDB Atlas<br>• None (manual setup) |
|
||||
| **Authentication** | Better-Auth (email/password, with more options coming soon) |
|
||||
| **Styling** | Tailwind CSS with shadcn/ui components |
|
||||
| **Addons** | • PWA support<br>• Tauri (desktop applications)<br>• Starlight (documentation site)<br>• Biome (linting and formatting)<br>• Husky (Git hooks)<br>• Turborepo (optimized builds) |
|
||||
| **Examples** | • Todo app<br>• AI Chat interface (using Vercel AI SDK) |
|
||||
| **Developer Experience** | • Automatic Git initialization<br>• Package manager choice (npm, pnpm, bun)<br>• Automatic dependency installation |
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -66,10 +48,10 @@ Options:
|
||||
-V, --version Output the version number
|
||||
-y, --yes Use default configuration
|
||||
--database <type> Database type (none, sqlite, postgres, mysql, mongodb)
|
||||
--orm <type> ORM type (none, drizzle, prisma)
|
||||
--orm <type> ORM type (none, drizzle, prisma, mongoose)
|
||||
--auth Include authentication
|
||||
--no-auth Exclude authentication
|
||||
--frontend <types...> Frontend types (tanstack-router, react-router, tanstack-start, next, nuxt, svelte, native, none)
|
||||
--frontend <types...> Frontend types (tanstack-router, react-router, tanstack-start, next, nuxt, svelte, solid, native, none)
|
||||
--addons <types...> Additional addons (pwa, tauri, starlight, biome, husky, turborepo, none)
|
||||
--examples <types...> Examples to include (todo, ai, none)
|
||||
--git Initialize git repository
|
||||
@@ -78,9 +60,9 @@ Options:
|
||||
--install Install dependencies
|
||||
--no-install Skip installing dependencies
|
||||
--db-setup <setup> Database setup (turso, neon, prisma-postgres, mongodb-atlas, none)
|
||||
--backend <framework> Backend framework (hono, express, elysia)
|
||||
--runtime <runtime> Runtime (bun, node)
|
||||
--api <type> API type (trpc, orpc)
|
||||
--backend <framework> Backend framework (hono, express, elysia, next, convex)
|
||||
--runtime <runtime> Runtime (bun, node, none)
|
||||
--api <type> API type (trpc, orpc, none)
|
||||
-h, --help Display help
|
||||
```
|
||||
|
||||
@@ -98,13 +80,13 @@ Create a project with specific options:
|
||||
npx create-better-t-stack my-app --database postgres --orm drizzle --auth --addons pwa biome
|
||||
```
|
||||
|
||||
Create a project with Elysia and Node.js runtime:
|
||||
Create a project with Elysia backend and Node.js runtime:
|
||||
|
||||
```bash
|
||||
npx create-better-t-stack my-app --backend elysia --runtime node
|
||||
```
|
||||
|
||||
Create a project with specific frontend options:
|
||||
Create a project with multiple frontend options:
|
||||
|
||||
```bash
|
||||
npx create-better-t-stack my-app --frontend tanstack-router native
|
||||
@@ -119,7 +101,13 @@ npx create-better-t-stack my-app --examples todo ai
|
||||
Create a project with Turso database setup:
|
||||
|
||||
```bash
|
||||
npx create-better-t-stack my-app --db-setup turso
|
||||
npx create-better-t-stack my-app --database sqlite --orm drizzle --db-setup turso
|
||||
```
|
||||
|
||||
Create a project with Convex backend:
|
||||
|
||||
```bash
|
||||
npx create-better-t-stack my-app --backend convex --frontend tanstack-router
|
||||
```
|
||||
|
||||
Create a project with documentation site:
|
||||
@@ -127,3 +115,34 @@ Create a project with documentation site:
|
||||
```bash
|
||||
npx create-better-t-stack my-app --addons starlight
|
||||
```
|
||||
|
||||
## Compatibility Notes
|
||||
|
||||
- **Convex backend**: Automatically disables authentication, database, ORM, and API options
|
||||
- **SvelteKit, Nuxt, and SolidJS** frontends are only compatible with oRPC API layer
|
||||
- **PWA support** requires React with TanStack Router, React Router, or SolidJS
|
||||
- **Tauri desktop app** requires React (TanStack Router/React Router), Nuxt, SvelteKit, or SolidJS
|
||||
- **AI example** is not compatible with Elysia backend or SolidJS frontend
|
||||
|
||||
## Project Structure
|
||||
|
||||
The created project follows a clean monorepo structure:
|
||||
|
||||
```
|
||||
my-better-t-app/
|
||||
├── apps/
|
||||
│ ├── web/ # Frontend application
|
||||
│ ├── server/ # Backend API
|
||||
│ ├── native/ # (optional) Mobile application
|
||||
│ └── docs/ # (optional) Documentation site
|
||||
├── packages/ # Shared packages
|
||||
└── README.md # Auto-generated project documentation
|
||||
```
|
||||
|
||||
After project creation, you'll receive detailed instructions for next steps and additional setup requirements.
|
||||
|
||||
## Sponsors
|
||||
|
||||
<p align="center">
|
||||
<img src="https://cdn.jsdelivr.net/gh/amanvarshney01/sponsors@master/sponsorkit/sponsors.svg" alt="Sponsors" width="300">
|
||||
</p>
|
||||
|
||||
@@ -3,6 +3,7 @@ import consola from "consola";
|
||||
import fs from "fs-extra";
|
||||
import type {
|
||||
ProjectAddons,
|
||||
ProjectApi,
|
||||
ProjectConfig,
|
||||
ProjectDatabase,
|
||||
ProjectFrontend,
|
||||
@@ -32,8 +33,10 @@ function generateReadmeContent(options: ProjectConfig): string {
|
||||
runtime = "bun",
|
||||
frontend = ["tanstack-router"],
|
||||
backend = "hono",
|
||||
api = "trpc",
|
||||
} = options;
|
||||
|
||||
const isConvex = backend === "convex";
|
||||
const hasReactRouter = frontend.includes("react-router");
|
||||
const hasTanstackRouter = frontend.includes("tanstack-router");
|
||||
const hasNative = frontend.includes("native");
|
||||
@@ -53,15 +56,15 @@ function generateReadmeContent(options: ProjectConfig): string {
|
||||
|
||||
return `# ${projectName}
|
||||
|
||||
This project was created with [Better-T-Stack](https://github.com/AmanVarshney01/create-better-t-stack), a modern TypeScript stack that combines React, ${
|
||||
This project was created with [Better-T-Stack](https://github.com/AmanVarshney01/create-better-t-stack), a modern TypeScript stack that combines ${
|
||||
hasTanstackRouter
|
||||
? "TanStack Router"
|
||||
? "React, TanStack Router"
|
||||
: hasReactRouter
|
||||
? "React Router"
|
||||
? "React, React Router"
|
||||
: hasNext
|
||||
? "Next.js"
|
||||
: hasTanstackStart
|
||||
? "TanStack Start"
|
||||
? "React, TanStack Start"
|
||||
: hasSvelte
|
||||
? "SvelteKit"
|
||||
: hasNuxt
|
||||
@@ -69,11 +72,13 @@ This project was created with [Better-T-Stack](https://github.com/AmanVarshney01
|
||||
: hasSolid
|
||||
? "SolidJS"
|
||||
: ""
|
||||
}, ${backend[0].toUpperCase() + backend.slice(1)}, tRPC, and more.
|
||||
}, ${backend[0].toUpperCase() + backend.slice(1)}${
|
||||
isConvex ? "" : `, ${api.toUpperCase()}`
|
||||
}, and more.
|
||||
|
||||
## Features
|
||||
|
||||
${generateFeaturesList(database, auth, addons, orm, runtime, frontend, backend)}
|
||||
${generateFeaturesList(database, auth, addons, orm, runtime, frontend, backend, api)}
|
||||
|
||||
## Getting Started
|
||||
|
||||
@@ -82,8 +87,20 @@ First, install the dependencies:
|
||||
\`\`\`bash
|
||||
${packageManager} install
|
||||
\`\`\`
|
||||
${
|
||||
isConvex
|
||||
? `
|
||||
## Convex Setup
|
||||
|
||||
${generateDatabaseSetup(database, auth, packageManagerRunCmd, orm)}
|
||||
This project uses Convex as a backend. You'll need to set up Convex before running the app:
|
||||
|
||||
\`\`\`bash
|
||||
${packageManagerRunCmd} dev:setup
|
||||
\`\`\`
|
||||
|
||||
Follow the prompts to create a new Convex project and connect it to your application.`
|
||||
: generateDatabaseSetup(database, auth, packageManagerRunCmd, orm)
|
||||
}
|
||||
|
||||
Then, run the development server:
|
||||
|
||||
@@ -103,7 +120,11 @@ ${
|
||||
: ""
|
||||
}
|
||||
${hasNative ? "Use the Expo Go app to run the mobile application.\n" : ""}
|
||||
The API is running at [http://localhost:3000](http://localhost:3000).
|
||||
${
|
||||
isConvex
|
||||
? "Your app will connect to the Convex cloud backend automatically."
|
||||
: "The API is running at [http://localhost:3000](http://localhost:3000)."
|
||||
}
|
||||
|
||||
${
|
||||
addons.includes("pwa") && hasReactRouter
|
||||
@@ -150,9 +171,13 @@ ${
|
||||
addons.includes("starlight")
|
||||
? "│ ├── docs/ # Documentation site (Astro Starlight)\n"
|
||||
: ""
|
||||
}│ └── server/ # Backend API (${
|
||||
}${
|
||||
isConvex
|
||||
? "├── packages/\n│ └── backend/ # Convex backend functions and schema\n"
|
||||
: `│ └── server/ # Backend API (${
|
||||
backend[0].toUpperCase() + backend.slice(1)
|
||||
}, tRPC)
|
||||
}, ${api.toUpperCase()})`
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
## Available Scripts
|
||||
@@ -177,7 +202,9 @@ function generateFeaturesList(
|
||||
runtime: ProjectRuntime,
|
||||
frontend: ProjectFrontend[],
|
||||
backend: string,
|
||||
api: ProjectApi,
|
||||
): string {
|
||||
const isConvex = backend === "convex";
|
||||
const hasTanstackRouter = frontend.includes("tanstack-router");
|
||||
const hasReactRouter = frontend.includes("react-router");
|
||||
const hasNative = frontend.includes("native");
|
||||
@@ -221,6 +248,9 @@ function generateFeaturesList(
|
||||
"- **shadcn/ui** - Reusable UI components",
|
||||
);
|
||||
|
||||
if (isConvex) {
|
||||
addonsList.push("- **Convex** - Reactive backend-as-a-service platform");
|
||||
} else {
|
||||
if (backend === "hono") {
|
||||
addonsList.push("- **Hono** - Lightweight, performant server framework");
|
||||
} else if (backend === "express") {
|
||||
@@ -231,15 +261,23 @@ function generateFeaturesList(
|
||||
addonsList.push("- **Next.js** - Full-stack React framework");
|
||||
}
|
||||
|
||||
if (api === "trpc") {
|
||||
addonsList.push("- **tRPC** - End-to-end type-safe APIs");
|
||||
} else if (api === "orpc") {
|
||||
addonsList.push(
|
||||
"- **oRPC** - End-to-end type-safe APIs with OpenAPI integration",
|
||||
);
|
||||
}
|
||||
|
||||
addonsList.push(
|
||||
"- **tRPC** - End-to-end type-safe APIs",
|
||||
`- **${runtime === "bun" ? "Bun" : "Node.js"}** - Runtime environment`,
|
||||
);
|
||||
}
|
||||
|
||||
if (database !== "none") {
|
||||
if (database !== "none" && !isConvex) {
|
||||
addonsList.push(
|
||||
`- **${
|
||||
orm === "drizzle" ? "Drizzle" : "Prisma"
|
||||
orm === "drizzle" ? "Drizzle" : orm === "prisma" ? "Prisma" : "Mongoose"
|
||||
}** - TypeScript-first ORM`,
|
||||
`- **${
|
||||
database === "sqlite"
|
||||
@@ -253,7 +291,7 @@ function generateFeaturesList(
|
||||
);
|
||||
}
|
||||
|
||||
if (auth) {
|
||||
if (auth && !isConvex) {
|
||||
addonsList.push(
|
||||
"- **Authentication** - Email & password authentication with Better Auth",
|
||||
);
|
||||
@@ -270,6 +308,8 @@ function generateFeaturesList(
|
||||
addonsList.push("- **Husky** - Git hooks for code quality");
|
||||
} else if (addon === "starlight") {
|
||||
addonsList.push("- **Starlight** - Documentation site with Astro");
|
||||
} else if (addon === "turborepo") {
|
||||
addonsList.push("- **Turborepo** - Optimized monorepo build system");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -317,7 +357,9 @@ cd apps/server && ${packageManagerRunCmd} db:local
|
||||
2. Update your \`apps/server/.env\` file with your MySQL connection details.
|
||||
`;
|
||||
} else if (database === "mongodb") {
|
||||
setup += `This project uses MongoDB with Prisma ORM.
|
||||
setup += `This project uses MongoDB ${
|
||||
orm === "mongoose" ? "with Mongoose" : "with Prisma ORM"
|
||||
}.
|
||||
|
||||
1. Make sure you have MongoDB set up.
|
||||
2. Update your \`apps/server/.env\` file with your MongoDB connection URI.
|
||||
@@ -330,6 +372,11 @@ ${auth ? "3" : "3"}. ${
|
||||
? `Generate the Prisma client and push the schema:
|
||||
\`\`\`bash
|
||||
${packageManagerRunCmd} db:push
|
||||
\`\`\``
|
||||
: orm === "drizzle"
|
||||
? `Apply the schema to your database:
|
||||
\`\`\`bash
|
||||
${packageManagerRunCmd} db:push
|
||||
\`\`\``
|
||||
: `Apply the schema to your database:
|
||||
\`\`\`bash
|
||||
@@ -350,10 +397,21 @@ function generateScriptsList(
|
||||
addons: ProjectAddons[],
|
||||
backend: string,
|
||||
): string {
|
||||
const isConvex = backend === "convex";
|
||||
|
||||
let scripts = `- \`${packageManagerRunCmd} dev\`: Start all applications in development mode
|
||||
- \`${packageManagerRunCmd} build\`: Build all applications
|
||||
- \`${packageManagerRunCmd} dev:web\`: Start only the web application
|
||||
- \`${packageManagerRunCmd} dev:server\`: Start only the server
|
||||
- \`${packageManagerRunCmd} dev:web\`: Start only the web application`;
|
||||
|
||||
if (isConvex) {
|
||||
scripts += `
|
||||
- \`${packageManagerRunCmd} dev:setup\`: Setup and configure your Convex project`;
|
||||
} else {
|
||||
scripts += `
|
||||
- \`${packageManagerRunCmd} dev:server\`: Start only the server`;
|
||||
}
|
||||
|
||||
scripts += `
|
||||
- \`${packageManagerRunCmd} check-types\`: Check TypeScript types across all apps`;
|
||||
|
||||
if (hasNative) {
|
||||
@@ -361,7 +419,7 @@ function generateScriptsList(
|
||||
- \`${packageManagerRunCmd} dev:native\`: Start the React Native/Expo development server`;
|
||||
}
|
||||
|
||||
if (database !== "none") {
|
||||
if (database !== "none" && !isConvex) {
|
||||
scripts += `
|
||||
- \`${packageManagerRunCmd} db:push\`: Push schema changes to database
|
||||
- \`${packageManagerRunCmd} db:studio\`: Open database studio UI`;
|
||||
|
||||
Reference in New Issue
Block a user