Assurelis
The brokerage collected auto, home, life and disability quote requests through long, hard-to-finish forms and followed leads by hand, so renewals and follow-ups slipped through the cracks.
Assurelis replaces this with a step-by-step conversational quote flow in French and English, and a role-based back office (admin, agent, client) where advisors manage clients and deals, see pipeline stats and get a list of upcoming and overdue policy renewals.
Architecture: a monorepo with a React 19 + Vite client and a NestJS 11 + MongoDB API. The server is split into feature modules (auth, auto/home/life forms, client, deal, CRM, email, stats), each following the controller → service → Mongoose schema pattern, with DTOs checked by a global ValidationPipe. Auth uses Passport JWT with a custom @Roles decorator and RolesGuard, and shared helpers (buildPagination, buildKeywordQuery, form-merge utils) keep the modules DRY. On the client: file-based TanStack Router, a Zustand auth store, Zod schemas, Context providers for form and advisor state, and a features/ folder layout for the CRM.
Best practices: Helmet, an explicit CORS allow-list and rate limiting (@nestjs/throttler); bcrypt password hashing; Swagger/OpenAPI docs; Jest unit tests next to each service plus API e2e specs; Playwright accessibility, responsive, security and visual tests on the client. CI runs lint, Prettier, type checks, pnpm audit and coverage, complexity and function-length limits are enforced, and Docker images ship with an nginx Content Security Policy, deployed on Railway.
Stack
- React 19
- TypeScript
- TanStack Router
- Zustand
- Zod
- NestJS 11
- MongoDB
- Docker
- Playwright