Modules
Feature modules keep domain logic isolated and removable. This page summarizes the rules and structure from modules/MODULES.md.
Goals
- Feature modules are self-contained and removable
- Clear separation between app routing, domain logic, and infrastructure
- Consistent structure across all modules
- Supabase migrations and seeders live inside each module
Core rules
- Module isolation. All feature code lives in modules/<module>. A module cannot import from another module.
- Thin routes. app/** is for routing and composition only. Business logic stays in modules.
- Public module API. Import via the module index.ts. Do not reach into internal files.
- Server-only code. Server logic lives in modules/<module>/server or lib/supabase/admin.ts.
Folder structure
Standard layout for every module. Keep module folders self-contained and consistent.
modules/ ├── MODULES.md ├── <module>/ │ ├── MODULE.md │ ├── components/ │ ├── lib/ │ ├── server/ │ ├── queries/ │ ├── services/ │ ├── supabase/ │ │ ├── migrations/ │ │ ├── seeders/ │ │ └── cleanup.sql │ ├── validators/ │ ├── types/ │ ├── constants.ts │ └── index.ts
Import rules
Allowed
- modules/* -> components/*
- modules/* -> lib/*
- modules/* -> same module
- app/* -> modules/* (via public API)
Forbidden
- modules/* -> other modules/*
- client components -> server/*
- external -> module internals
Removal checklist
- Run modules/<module>/supabase/cleanup.sql
- Remove the module directory
- Delete any app routes that import the module