Skip to content

Code conventions

  • Interface: French only, labels hardcoded in components (no FR/EN translation layer — Paraglide was removed).
  • Code, comments and identifiers: English (camelCase) as in all TypeScript code; user-facing labels stay in French.
  • Formatter/linter: Biome (npm run check, npm run format). Run it before finishing a task.
  • Imports: canonical #/* alias (→ src/) and @/* (compat). Relative imports remain acceptable between nearby files of the same layer.
  • Strict TypeScript: noUnusedLocals, noUnusedParameters, verbatimModuleSyntax (use import type for type imports).
  • core/: generic foundation, no knowledge of business modules.
  • features/: business logic lives only here (see src/features/README.md).
  • routes/: glue — no business logic, no raw fetch, no direct TanStack Query calls (call feature/core hooks instead).
  • components/ui: generated shadcn components, do not duplicate; compose screens with components/layout + components/ui.
  • Generated types: never duplicate a DTO from the generated OpenAPI client; add derived types in features/<module>/models.
  • No useUtils(): import each hook/utility by name (useCurrentUser(), useCan(code), createQueryKeys(...)).
  • No useState for server state: all server state goes through TanStack Query (core/query).
  • No new dependency without justification: state it in the PR and document why.
  • ❌ Create catch-all src/hooks/ or src/lib/ folders (organization is by core/ / features/ layer).
  • ❌ Edit generated files (schema.ts, routeTree.gen.ts).
  • ❌ Invent endpoints, permissions or modules (see Authorization).