# Stack Architecture Reference ## Technology Stack ### Core Framework - **Next.js 16** (App Router) - React framework with built-in routing, server components, and API routes - **React 19** - UI library with Server Components support - **TypeScript** - Type safety across the entire stack ### Styling - **Tailwind CSS v4** - Utility-first CSS framework - **shadcn/ui** - Accessible component system built on Radix UI - **CSS Variables** - For theming and dark mode support ### Backend & Database - **Supabase** - Auth provider + PostgreSQL hosting - **Prisma ORM** - Type-safe database client - **Server Actions** - Next.js server-side mutations ### Forms & Validation - **React Hook Form** - Performant form management - **Zod** - Runtime type validation and schema definition - **@hookform/resolvers** - Bridge between RHF and Zod ### Developer Experience - **ESLint v9** - Code linting with flat config - **Prettier** - Code formatting - **Husky** - Git hooks for pre-commit checks - **lint-staged** - Run linters on staged files only ### Testing - **Vitest** - Unit test runner - **React Testing Library** - Component testing - **Playwright** - E2E browser testing ### Utilities - **Sonner** - Toast notifications - **lucide-react** - Icon library - **clsx + tailwind-merge** - Conditional CSS class utilities ## Architecture Patterns ### App Router Structure #### Route Groups Use route groups to organize routes without affecting URL structure: ``` app/ (auth)/ # Public authentication routes login/ signup/ (protected)/ # Protected routes requiring authentication dashboard/ profile/ settings/ ``` #### Layouts - Root layout (`app/layout.tsx`) - Wraps entire app - Group layouts - Shared UI for route groups - Nested layouts - Inherited down the tree ### Server vs Client Components #### Server Components (Default) - Data fetching - Database queries - Server-side logic - No interactivity needed #### Client Components (`"use client"`) - Interactivity (onClick, onChange, etc.) - React hooks (useState, useEffect, etc.) - Browser APIs - Third-party libraries requiring client-side code ### Data Fetching Patterns #### Server Components ```typescript async function getData() { const data = await prisma.table.findMany() return data } export default async function Page() { const data = await getData() return
{/* render */}
} ``` #### Server Actions ```typescript 'use server' export async function createItem(formData: FormData) { const validated = schema.parse(formData) await prisma.item.create({ data: validated }) revalidatePath('/items') } ``` ### Authentication Flow #### Supabase SSR Setup 1. Create Supabase client for server (cookies-based) 2. Create Supabase client for client (storage-based) 3. Middleware to refresh tokens 4. Protected route groups #### Auth Flow 1. User submits login form 2. Server Action validates credentials 3. Supabase sets secure cookies 4. Middleware verifies on subsequent requests 5. Redirect to dashboard ### Database Layer #### Prisma Schema - Define models matching Supabase tables - Use `@db.Uuid` for UUID types - Add indexes for performance - Include relations #### Migrations ```bash npx prisma migrate dev --name init npx prisma generate npx prisma db push ``` ### Form Handling Pattern ```typescript const form = useForm({ resolver: zodResolver(schema), defaultValues: {...} }) async function onSubmit(data: FormData) { const result = await serverAction(data) if (result.success) { toast.success('Success!') } } ``` ### Testing Strategy #### Unit Tests - Utility functions - Validation schemas - Helper functions #### Integration Tests - Component behavior - Form submissions - User interactions #### E2E Tests - Critical user flows - Authentication - Data mutations ## File Naming Conventions - **Components**: PascalCase (`UserProfile.tsx`) - **Utilities**: camelCase (`formatDate.ts`) - **Server Actions**: camelCase (`createUser.ts`) - **Route Segments**: lowercase (`dashboard`, `profile`) - **API Routes**: lowercase (`route.ts`) ## Configuration Files ### TypeScript (`tsconfig.json`) - Strict mode enabled - Path aliases (`@/*`) - Next.js plugin ### ESLint (`eslint.config.mjs`) - Flat config format (v9) - Next.js rules - TypeScript rules - Custom rules for unused vars ### Tailwind (`tailwind.config.ts`) - CSS variables for theming - Dark mode support - Custom color palette - shadcn/ui compatible ### Prisma (`prisma/schema.prisma`) - PostgreSQL datasource - Shadow database for migrations - Supabase connection pooling ## Environment Variables Required variables: ``` NEXT_PUBLIC_SUPABASE_URL NEXT_PUBLIC_SUPABASE_ANON_KEY DATABASE_URL (connection pooling) DIRECT_URL (direct connection) ``` ## Deployment ### Vercel Setup 1. Connect GitHub repository 2. Set environment variables 3. Configure build settings (auto-detected) 4. Deploy ### Build Command ```bash npm run build ``` - Runs Prisma generate - Builds Next.js app - Type checks - Lint checks ## Best Practices ### Performance - Use Server Components by default - Minimize client-side JavaScript - Implement proper caching strategies - Use React Suspense for loading states ### Security - Validate all inputs with Zod - Use Server Actions for mutations - Implement Row Level Security in Supabase - Never expose secrets to client ### Accessibility - Use shadcn/ui components (built on Radix) - Include ARIA labels - Ensure keyboard navigation - Test with screen readers ### Type Safety - Define Zod schemas for all forms - Use Prisma for database queries - Type all API responses - Avoid `any` types