Project File Organization
When to use this skill
-
New Projects: Initial folder structure design
-
Project Growth: Refactoring when complexity increases
-
Team Standardization: Establish consistent structure
Instructions
Step 1: React/Next.js Project Structure
src/ ├── app/ # Next.js 13+ App Router │ ├── (auth)/ # Route groups │ │ ├── login/ │ │ └── signup/ │ ├── (dashboard)/ │ │ ├── layout.tsx │ │ ├── page.tsx │ │ └── settings/ │ ├── api/ # API routes │ │ ├── auth/ │ │ └── users/ │ └── layout.tsx │ ├── components/ # UI Components │ ├── ui/ # Reusable UI (Button, Input) │ │ ├── Button/ │ │ │ ├── Button.tsx │ │ │ ├── Button.test.tsx │ │ │ └── index.ts │ │ └── Input/ │ ├── layout/ # Layout components (Header, Footer) │ ├── features/ # Feature-specific components │ │ ├── auth/ │ │ └── dashboard/ │ └── shared/ # Shared across features │ ├── lib/ # Utilities & helpers │ ├── utils.ts │ ├── hooks/ │ │ ├── useAuth.ts │ │ └── useLocalStorage.ts │ └── api/ │ └── client.ts │ ├── store/ # State management │ ├── slices/ │ │ ├── authSlice.ts │ │ └── userSlice.ts │ └── index.ts │ ├── types/ # TypeScript types │ ├── api.ts │ ├── models.ts │ └── index.ts │ ├── config/ # Configuration │ ├── env.ts │ └── constants.ts │ └── styles/ # Global styles ├── globals.css └── theme.ts
Step 2: Node.js/Express Backend Structure
src/ ├── api/ # API layer │ ├── routes/ │ │ ├── auth.routes.ts │ │ ├── user.routes.ts │ │ └── index.ts │ ├── controllers/ │ │ ├── auth.controller.ts │ │ └── user.controller.ts │ └── middlewares/ │ ├── auth.middleware.ts │ ├── errorHandler.ts │ └── validation.ts │ ├── services/ # Business logic │ ├── auth.service.ts │ ├── user.service.ts │ └── email.service.ts │ ├── repositories/ # Data access layer │ ├── user.repository.ts │ └── session.repository.ts │ ├── models/ # Database models │ ├── User.ts │ └── Session.ts │ ├── database/ # Database setup │ ├── connection.ts │ ├── migrations/ │ └── seeds/ │ ├── utils/ # Utilities │ ├── logger.ts │ ├── crypto.ts │ └── validators.ts │ ├── config/ # Configuration │ ├── index.ts │ ├── database.ts │ └── env.ts │ ├── types/ # TypeScript types │ ├── express.d.ts │ └── models.ts │ ├── tests/ # Tests │ ├── unit/ │ ├── integration/ │ └── e2e/ │ └── index.ts # Entry point
Step 3: Feature-Based Structure (Large-Scale Apps)
src/ ├── features/ │ ├── auth/ │ │ ├── components/ │ │ │ ├── LoginForm.tsx │ │ │ └── SignupForm.tsx │ │ ├── hooks/ │ │ │ └── useAuth.ts │ │ ├── api/ │ │ │ └── authApi.ts │ │ ├── store/ │ │ │ └── authSlice.ts │ │ ├── types/ │ │ │ └── auth.types.ts │ │ └── index.ts │ │ │ ├── products/ │ │ ├── components/ │ │ ├── hooks/ │ │ ├── api/ │ │ └── types/ │ │ │ └── orders/ │ ├── shared/ # Shared across features │ ├── components/ │ ├── hooks/ │ ├── utils/ │ └── types/ │ └── core/ # App-wide ├── store/ ├── router/ └── config/
Step 4: Naming Conventions
File Names:
Components: PascalCase.tsx Hooks: camelCase.ts (useAuth.ts) Utils: camelCase.ts (formatDate.ts) Constants: UPPER_SNAKE_CASE.ts (API_ENDPOINTS.ts) Types: camelCase.types.ts (user.types.ts) Tests: *.test.ts, *.spec.ts
Folder Names:
kebab-case: user-profile/ camelCase: userProfile/ (optional: hooks/, utils/) PascalCase: UserProfile/ (optional: components/)
✅ Consistency is key (entire team uses the same rules)
Variable/Function Names:
// Components: PascalCase const UserProfile = () => {};
// Functions: camelCase function getUserById() {}
// Constants: UPPER_SNAKE_CASE const API_BASE_URL = 'https://api.example.com';
// Private: _prefix (optional) class User { private _id: string;
private _hashPassword() {} }
// Booleans: is/has/can prefix const isAuthenticated = true; const hasPermission = false; const canEdit = true;
Step 5: index.ts Barrel Files
components/ui/index.ts:
// ✅ Good example: Re-export named exports export { Button } from './Button/Button'; export { Input } from './Input/Input'; export { Modal } from './Modal/Modal';
// Usage: import { Button, Input } from '@/components/ui';
❌ Bad example:
// Re-export everything (impairs tree-shaking) export * from './Button'; export * from './Input';
Output format
Project Template
my-app/ ├── .github/ │ └── workflows/ ├── public/ ├── src/ │ ├── app/ │ ├── components/ │ ├── lib/ │ ├── types/ │ └── config/ ├── tests/ ├── docs/ ├── scripts/ ├── .env.example ├── .gitignore ├── .eslintrc.json ├── .prettierrc ├── tsconfig.json ├── package.json └── README.md
Constraints
Required Rules (MUST)
-
Consistency: Entire team uses the same rules
-
Clear Folder Names: Roles must be explicit
-
Max Depth: Recommend 5 levels or fewer
Prohibited (MUST NOT)
-
Excessive Nesting: Avoid 7+ levels of folder depth
-
Vague Names: Avoid utils2/, helpers/, misc/
-
Circular Dependencies: Prohibit A → B → A references
Best practices
-
Colocation: Keep related files close (component + styles + tests)
-
Feature-Based: Modularize by feature
-
Path Aliases: Simplify imports with @/
tsconfig.json:
{ "compilerOptions": { "baseUrl": ".", "paths": { "@/": ["./src/"], "@/components/": ["./src/components/"], "@/lib/": ["./src/lib/"] } } }
Usage:
// ❌ Bad example import { Button } from '../../../components/ui/Button';
// ✅ Good example import { Button } from '@/components/ui';
References
-
React File Structure
-
Node.js Best Practices
-
Clean Architecture
Metadata
Version
-
Current Version: 1.0.0
-
Last Updated: 2025-01-01
-
Compatible Platforms: Claude, ChatGPT, Gemini
Tags
#file-organization #project-structure #folder-structure #naming-conventions #utilities
Examples
Example 1: Basic usage
Example 2: Advanced usage