Codebase Structure
Overview
Understand the file structure and directory organization to maintain consistency when adding new features, components, or functionality.
Directory Structure
create-reodor-app/
├── app/ # Next.js App Router - Pages and routes
├── components/ # React components
├── docs/ # Project documentation
├── hooks/ # Custom React hooks
├── lib/ # External service configurations and utilities
├── providers/ # React context providers
├── public/ # Static assets (images, logos, manifests)
├── schemas/ # Generated Zod schemas (auto-generated)
├── scripts/ # Utility scripts (deployment, setup)
├── seed/ # Database seeding configuration
├── server/ # Server actions for data mutations
├── stores/ # Zustand state management stores
├── supabase/ # Supabase configuration and database
├── transactional/ # React Email templates
├── types/ # TypeScript type definitions
└── middleware.ts # Next.js middleware (auth, route protection)
Where to Place New Code
Pages & Routes (app/)
Structure: Next.js App Router with file-based routing
Place here:
- Page components (
page.tsx) - Layouts (
layout.tsx) - Error boundaries (
error.tsx,global-error.tsx) - Not found pages (
not-found.tsx) - API routes (
api/*/route.ts) - Route-specific loading states (
loading.tsx) - SEO metadata (
robots.ts,sitemap.ts,opengraph-image.png) - Favicons and app icons
Examples:
app/oppgaver/page.tsx- Todos feature pageapp/auth/sign-in/page.tsx- Sign in pageapp/api/cron/*/route.ts- Cron job endpointsapp/layout.tsx- Root layout with providers
Components (components/)
Structure: Feature-based organization + shared components
Place here:
- Feature directories (
components/[feature]/) - Feature-specific components- Example:
components/todos/,components/auth/,components/admin/
- Example:
- Shared components - Components used across features
- Example:
navbar.tsx,footer.tsx,error-boundary.tsx
- Example:
- UI library (
components/ui/) - shadcn/ui components - Specialized UI (
components/kibo-ui/) - Kibo UI components - Magic UI (
components/magicui/) - Magic UI components
Naming: Use kebab-case for directories, PascalCase for component files
Examples:
components/todos/todo-form.tsx- Todo form componentcomponents/todos/todo-dialog.tsx- Todo dialog wrappercomponents/auth/auth-form.tsx- Authentication formcomponents/ui/button.tsx- shadcn/ui button component
Server Actions (server/)
Purpose: Type-safe server-side data operations with authentication
Place here:
- Database CRUD operations
- Authenticated data mutations
- Server-side business logic
Naming: [feature].actions.ts
Examples:
server/todo.actions.ts- Todo CRUD operationsserver/profile.actions.ts- Profile managementserver/admin.actions.ts- Admin operations
Pattern: Individual exported async functions, not default exports
Custom Hooks (hooks/)
Purpose: Reusable React hooks for client-side logic
Place here:
- Data fetching hooks (TanStack Query)
- File upload hooks
- Authentication hooks
- Form state management hooks
- UI state hooks (media queries, scroll position, etc.)
Naming: use-[hook-name].ts
Examples:
hooks/use-auth.ts- Authentication statehooks/use-upload-todo-attachments.ts- File upload logichooks/use-media-query.ts- Responsive breakpoint detection
State Management (stores/)
Purpose: Global state with Zustand
Place here:
- Application-wide state
- Persisted state (localStorage, sessionStorage)
- Shared UI state
Naming: [feature]-store.ts or use-[feature]-store.ts
Examples:
stores/setup-steps-store.ts- Setup wizard state
Database (supabase/)
Structure:
supabase/
├── schemas/ # Declarative SQL schemas (source of truth)
├── migrations/ # Generated SQL migrations (auto-generated)
└── functions/ # Edge functions (Deno runtime)
Place here:
- schemas/ - Declarative database schemas, RLS policies, triggers
01-schema.sql- Tables, enums, indexes02-policies.sql- Row Level Security policies03-triggers.sql- Database triggers
- migrations/ - Generated from schemas (DO NOT edit manually)
- functions/ - Supabase Edge Functions for serverless operations
Workflow:
- Edit schema in
schemas/ - Run
bun db:diff <name>to generate migration - Review generated migration in
migrations/ - Run
bun migrate:upto apply
Type Definitions (types/)
Purpose: TypeScript types and interfaces
Place here:
- database.types.ts - Generated from Supabase (auto-generated, DO NOT edit)
- index.ts - Custom types, shared filter types, runtime-agnostic types
- Feature-specific type definitions
Examples:
types/database.types.ts- Auto-generated Supabase typestypes/index.ts- Custom types likeBookingFilters,ServiceFilters
Schemas (schemas/)
Purpose: Auto-generated Zod validation schemas
Content:
database.schema.ts- Generated from Supabase types (DO NOT edit manually)
Usage: Import schemas for validation in server actions and forms
Generation: Run bun gen:types to regenerate
External Services (lib/)
Purpose: Service configurations and utilities
Place here:
- Service clients (
resend.ts,lib/supabase/client.ts) - Service utilities (
resend-utils.ts,lib/supabase/storage.ts) - Configuration (
brand.ts,navigation.ts,permissions.ts) - Helper functions (
utils.ts- cn(), formatting, etc.)
Structure:
lib/
├── supabase/ # Supabase configuration
│ ├── client.ts # Browser client
│ ├── server.ts # Server client
│ └── storage.ts # Storage utilities
├── brand.ts # Brand configuration
├── navigation.ts # Navigation structure
├── utils.ts # Shared utilities
└── [service].ts # External service configs
React Providers (providers/)
Purpose: React Context providers for app-wide state
Place here:
- TanStack Query provider
- Theme providers
- Authentication providers
- Any context providers
Examples:
providers/tanstack-query-provider.tsx
Email Templates (transactional/emails)
Purpose: React Email templates for transactional emails
Place here:
- Email components built with React Email
- Email-specific utilities
Examples:
transactional/emails/welcome.tsxtransactional/emails/password-reset.tsx
Documentation (docs/)
Structure:
docs/
├── business/ # Business features and workflows
└── technical/ # Technical implementation details
Place here:
- business/ - Feature docs, user workflows, business logic
- technical/ - Architecture, API docs, deployment guides
Examples:
docs/technical/google-auth-setup.mddocs/technical/railway-deployment.md
Static Assets (public/)
Purpose: Static files served at root path
Place here:
- Logos and brand assets
- Web app manifest images
- Static images referenced by absolute paths
- Files that need specific public URLs
Structure:
public/
├── logos/ # Logo variations
├── web-app-manifest-192x192.png # PWA icons
└── web-app-manifest-512x512.png
Note: Favicons and app icons go in app/ directory, not public/
Utility Scripts (scripts/)
Purpose: Development and deployment automation
Place here:
- Deployment scripts
- Setup scripts
- Database utilities
- Build automation
Examples:
scripts/railway-setup.shscripts/ensure-transactional-deps-installed.sh
Database Seeding (seed/)
Purpose: Snaplet configuration for database seeding
Place here:
- Snaplet configuration
- Seed data scripts
Root-Level Files
- middleware.ts - Next.js middleware for auth and route protection
- next.config.ts - Next.js configuration
- tailwind.config.ts - Tailwind CSS configuration
- seed.config.ts - Database seeding configuration
- next-env.d.ts - Next.js TypeScript declarations (auto-generated)
Key Principles
- Feature-based organization - Group related files by feature (e.g.,
components/todos/,server/todo.actions.ts) - Separation of concerns - Keep server logic (
server/) separate from client components (components/) - Generated files - Never edit auto-generated files (
types/database.types.ts,schemas/database.schema.ts,migrations/) - Naming conventions - Use kebab-case for files, PascalCase for components, camelCase for functions
Common Workflows
Adding a New Feature
- Database: Update
supabase/schemas/01-schema.sqlwith new database schema state. Refer toskills/database-schema-extension/SKILL.mdfor guidance. - Server Actions: Create
server/[feature].actions.ts - Components: Create
components/[feature]/directory - Hooks: Add custom hooks to
hooks/use-[feature].tsif needed. - Page: Create
app/[path-to-feature]/page.tsx. It can be nested as needed. - Types: Custom types go in
types/index.ts
Adding a New UI Component
- Shared component:
components/[name].tsx - Feature component:
components/[feature]/[name].tsx - shadcn/ui: Run
bunx --bun shadcn@latest add [component](auto-adds tocomponents/ui/)
Adding Authentication
- Server action: Add to
server/auth.actions.ts - Middleware: Update route protection in
middleware.ts - Components: Add to
components/auth/ - Hooks: Update
hooks/use-auth.ts
Quick Reference
| Type | Location | Example |
| --------------- | ------------------------------------------ | --------------------------------- |
| Page | app/[route]/page.tsx | app/oppgaver/page.tsx |
| Server Action | server/[feature].actions.ts | server/todo.actions.ts |
| Component | components/[feature]/[name].tsx | components/todos/todo-form.tsx |
| Hook | hooks/use-[name].ts | hooks/use-auth.ts |
| Store | stores/[name]-store.ts | stores/setup-steps-store.ts |
| Database Schema | supabase/schemas/01-schema.sql | Table definitions |
| Email Template | transactional/[name]-email.tsx | transactional/welcome-email.tsx |
| Util Function | lib/utils.ts or lib/[service]-utils.ts | lib/resend-utils.ts |
| Type | types/index.ts | Custom types |
| API Route | app/api/[route]/route.ts | app/api/cron/demo/route.ts |
微信扫一扫