General Principles
- Clarity over Cleverness: Write code that is easy to read and understand.
- Consistency: Follow the established patterns in the codebase.
- DRY (Don’t Repeat Yourself): Extract shared logic into utilities or hooks.
- Single Responsibility: Each function or component should do one thing well.
Backend Standards
- Architecture: Always follow the 5-layer pattern (Routes -> Controllers -> Services -> Repositories -> Models).
- Naming:
- Files: camelCase (e.g.,
userController.js). - Variables/Functions: camelCase.
- Models: PascalCase (e.g.,
User).
- Files: camelCase (e.g.,
- Validation: Every POST/PATCH route must have a Zod validation middleware.
- Error Handling: Use the custom error classes (
NotFoundError, etc.) and thecatchAsyncwrapper. - Async/Await: Prefer
async/awaitover raw Promises or callbacks.
Frontend Standards
- Architecture: Follow the 3-file pattern for Studio components (.jsx, .view.jsx, .stories.jsx).
- Naming:
- Files: kebab-case (e.g.,
add-university-dialog.jsx). - Components: PascalCase (e.g.,
AddUniversityDialog).
- Files: kebab-case (e.g.,
- Styling: Use Tailwind CSS and the
cn()utility. Avoid arbitrary values where possible. - State: Use Server Components for data fetching and local state for UI interactivity.
- Hooks: Prefix custom hooks with
use(e.g.,useApi).
Tooling
- Formatting: Prettier is mandatory. Configure your editor to format on save.
- Linting: ESLint is used to catch common mistakes and enforce style rules.
- Package Manager: pnpm is the required package manager for all projects.
Documentation
- JSDoc: Use JSDoc for complex functions and all backend routes (for OpenAPI generation).
- Comments: Explain why something is done, not what is being done (the code should be self-explanatory).

