Overview
AniDojo follows Next.js 15 App Router conventions with a clean, organized structure that separates concerns and makes the codebase easy to navigate.Root Directory Structure
Source Directory (src/)
Complete Structure
Directory Deep Dive
/app - Pages and Routes
Next.js 15 uses file-system based routing. Each folder with a
page.tsx becomes a route.Route Structure
| Route | File Path | Description |
|---|---|---|
/ | app/page.tsx | Home page with hero and featured anime |
/browse | app/browse/page.tsx | Browse all anime with filters |
/discover | app/discover/page.tsx | Discover personalized recommendations |
/search | app/search/page.tsx | Global search for anime |
/upcoming | app/upcoming/page.tsx | Upcoming seasonal anime |
/anime/[id] | app/anime/[id]/page.tsx | Anime detail page (dynamic) |
/anime/[id]/review | app/anime/[id]/review/page.tsx | Write/edit review |
/dashboard | app/dashboard/page.tsx | User dashboard with stats |
/my-lists | app/my-lists/page.tsx | User’s anime lists |
/my-reviews | app/my-reviews/page.tsx | User’s reviews |
/profile | app/profile/page.tsx | User profile page |
/settings | app/settings/page.tsx | Account settings |
/signin | app/signin/page.tsx | Sign in form |
/signup | app/signup/page.tsx | Sign up form |
Layout Files
Root Layout (app/layout.tsx)
Root Layout (app/layout.tsx)
The root layout wraps all pages and contains:
- HTML document structure
- Provider components (Auth, Theme)
- Global metadata
- Font definitions
- Navbar component (persists across pages)
Dynamic Routes
[id] - Dynamic Parameter
[id] - Dynamic Parameter
The URLs:
[id] folder creates a dynamic route segment.Example: /anime/[id]/page.tsx/anime/1→params.id = "1"/anime/mal-52991→params.id = "mal-52991"
/components - UI Components
Component Categories
Layout Components
Navbar.tsx, AuthNavbar.tsxModal Components
AddAnimeModal.tsx, GlobalSearch.tsxFeature Components
AnimeSearch.tsx, ThemeToggle.tsxVisual Components
HeroBackground.tsxComponent Patterns
Client Components ('use client'):
- All components in
/componentsare client components - Use React hooks (useState, useEffect, useContext)
- Handle user interactions
- Access browser APIs
/contexts - State Management
AuthContext.tsx
AuthContext.tsx
Purpose: Global authentication stateProvides:
user- Current user objectisAuthenticated- Boolean authentication statussignIn()- Sign in functionsignUp()- Sign up functionsignOut()- Sign out functionloading- Loading state
ThemeContext.tsx
ThemeContext.tsx
Purpose: Dark/light theme managementProvides:
theme- Current theme (‘dark’ | ‘light’)toggleTheme()- Switch theme
- Stores preference in localStorage
- Adds/removes ‘dark’ class on document
- Syncs across browser tabs
/hooks - Custom Hooks
useAnime.ts
useAnime.ts
Custom hook for fetching anime data with built-in state management.Usage:
/lib - Business Logic
/lib/supabase - Database Layer
client.ts
Browser-side Supabase client for client components
server.ts
Server-side Supabase client for server components and API routes
queries.ts
Database query functions (CRUD operations)
storage.ts
File upload and storage utilities
animeApi.ts - External API Integration
Rate Limiter Implementation
Rate Limiter Implementation
API Functions
API Functions
searchAnime(query, page, limit)- Search animegetTopAnime(page, limit, filter)- Get top animegetAnimeById(id)- Get anime detailsgetCurrentSeasonAnime(limit)- Get seasonal animeconvertJikanToAnime(jikanAnime)- Data transformation
utils.ts - Helper Functions
Common utility functions:
cn()- Merge Tailwind classes withclsxandtailwind-merge- Date formatting utilities
- String manipulation helpers
/types - Type Definitions
database.ts - Database Schema Types
database.ts - Database Schema Types
TypeScript interfaces matching Supabase database schema:
Configuration Files
next.config.ts
Next.js Configuration
Next.js Configuration
- Allow Next.js Image component to load images from external domains
- Optimize images from MyAnimeList and Supabase
tailwind.config.js
Tailwind Configuration
Tailwind Configuration
Content Paths:Custom Theme Extensions:
- Colors:
ink,cream,crimson,jade,gold - Animations:
slide-up,fade-in,ink-spread - Shadows:
ink,glow-crimson,glow-jade - Background patterns:
halftone,speed-lines
tsconfig.json
TypeScript Configuration
TypeScript Configuration
Path Aliases:Usage:
File Naming Conventions
Components
PascalCase:
Navbar.tsx, AddAnimeModal.tsxPages
lowercase:
page.tsx, layout.tsxUtilities
camelCase:
animeApi.ts, utils.tsTypes
camelCase:
database.tsImport Organization
Recommended import order:Code Organization Best Practices
Component Structure
Service Function Structure
Environment Variables
Create a
.env.local file in the root directory (not in git)NEXT_PUBLIC_*- Exposed to browser- Others - Server-side only
Related Documentation
Architecture
System design and architectural patterns
Tech Stack
Technologies and dependencies overview