Next.js App Router with Convex backend. Feature-based design pattern.
- Frontend: Next.js, React, TypeScript, TailwindCSS, shadcn/ui
- Backend: Convex (real-time database, functions, auth)
- State: Jotai (feature state), Convex queries (server state)
src/
├── app/ # Next.js App Router (routes)
├── features/ # Feature modules (business domains)
├── components/ui/ # Shared UI primitives
├── lib/ # Utilities, error handling
└── hooks/ # Shared hooks
convex/
├── schema.ts # Database schema
├── http.ts # HTTP routes (webhooks)
├── crons.ts # Scheduled jobs
├── _helpers/ # Shared utilities
└── [entity].ts # Backend functions by entity
Each feature is a self-contained module:
features/[name]/
├── api/ # Data fetching hooks (use-get-*, use-create-*)
├── components/ # Feature-specific UI
├── hooks/ # Business logic hooks
├── store/ # State atoms (Jotai)
├── types.ts # TypeScript types
└── index.ts # Public exports
| Layer | Tool | Use |
|---|---|---|
| Component | useState |
Local UI state |
| Feature | Jotai atoms | Feature-wide UI state |
| Server | Convex queries | Database data (real-time) |
| URL | Search params | Filters, pagination |
- Backend: Typed error codes thrown via helper functions
- Frontend: Mutation hooks parse and surface typed errors
- UI: Toast notifications display user-friendly messages
- Files: kebab-case
- Components: PascalCase exports
- Hooks:
use-[name].ts→useHookName - Imports: Path aliases (
@/*), no deep relative imports - Components: Server Components by default, Client Components only when needed