Skip to content
- 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).