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