Next.js SaaS 启动器 — 上下文包
可复制的上下文包,适用于使用 App Router、Better Auth、Stripe 计费和 Postgres 的 Next.js SaaS 应用,确保你的 AI 代理从第一个提示开始就能正确工作。
CursorClaude CodeCodexWindsurf Next.jsPostgreSQLTypeScriptTailwind
在新任务的开头粘贴此内容,以便代理在编写任何代码之前了解 SaaS 项目的结构、约定和边界。
项目背景
A multi-tenant SaaS application built with Next.js 15 App Router.Authentication is handled by Better Auth with email/password and OAuth providers.Billing uses Stripe Checkout + webhooks. All persistent data lives in PostgreSQLaccessed via Drizzle ORM. The app is deployed to Vercel with a Neon Postgresdatabase.技术栈
Next.js 15 (App Router, React Server Components)TypeScript (strict mode, no implicit any)Tailwind CSS v4Better Auth v1 (session cookies, OAuth: Google + GitHub)Drizzle ORM + drizzle-kit migrationsNeon PostgreSQL (serverless driver @neondatabase/serverless)Stripe (Checkout sessions, Customer Portal, webhooks)Resend for transactional emailZod for all input validation目录结构
src/ app/ # App Router — every folder is a route segment (auth)/ # Sign-in / sign-up pages (unauthenticated layout) (dashboard)/ # Protected routes (authenticated layout) billing/ settings/ api/ auth/[...all]/ # Better Auth catch-all handler webhooks/stripe/ # Stripe webhook endpoint components/ ui/ # shadcn/ui primitives (do not edit generated files) app/ # Application-level components lib/ auth.ts # Better Auth server instance + config auth-client.ts # Better Auth browser client db/ schema.ts # Drizzle table definitions (single source of truth) index.ts # db client (Neon serverless) stripe.ts # Stripe SDK singleton validations/ # Zod schemas, one file per domain middleware.ts # Auth session check + route protectiondrizzle/ migrations/ # Auto-generated SQL — never hand-editdrizzle.config.ts编码约定
- Server Components by default. Add "use client" only when you need browser APIs, event handlers, or React hooks.- Data fetching happens in Server Components or Route Handlers — never fetch from a Client Component via useEffect.- Database access only inside lib/db or server actions; never import the db client into a Client Component.- All user input is validated with Zod before hitting the database.- Drizzle schema changes require a migration: `npx drizzle-kit generate` then `npx drizzle-kit migrate`. Never hand-edit files in drizzle/migrations/.- API routes live under app/api/ and export named HTTP-method handlers (GET, POST, etc.). Use NextResponse.json() for responses.- Environment variables accessed via process.env must also be declared in .env.example (no secrets in that file).- Stripe amounts are always in the smallest currency unit (cents).AI 任务边界
- Do not switch the ORM, auth library, or email provider without explicit instruction.- Do not edit files under src/components/ui/ — they are shadcn/ui generated and will be overwritten.- Do not hard-code secrets. Use process.env and add the key to .env.example.- Do not add a Pages Router file (pages/ directory). This is App Router only.- All schema changes must go through Drizzle migrations, not raw SQL ALTER.- Middleware (middleware.ts) must remain at the project root, not inside src/app.- Stripe webhook handler must verify the signature with stripe.webhooks.constructEvent before processing any event.llms.txt
该仓库在项目根目录公开了一个 /llms.txt 文件,列出了关键约定和文件用途,以便代理无需阅读每个文件即可定位。
# Next.js SaaS StarterFramework: Next.js 15 App RouterAuth: Better Auth (src/lib/auth.ts)DB: Drizzle ORM + Neon Postgres (src/lib/db/schema.ts)Billing: Stripe (src/lib/stripe.ts)Email: ResendValidation: Zod (src/lib/validations/)Protected routes: everything under src/app/(dashboard)/Public routes: src/app/(auth)/ and landing page