| name | codebase-structure |
| description | Provides a high-level overview of the Next.js application's file structure and directory organization. Use when deciding where to place new files, components, server actions, database schemas, or when understanding the overall architecture of the codebase. Essential for maintaining consistent file organization and knowing where different types of code belong. |
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 |