
Ragboost
Plateforme SaaS Multi-Tenant de Chatbots IA
Aperçu
Contexte
Le marché des chatbots IA est en croissance, mais les solutions entreprise sont chères pour les PME. Les entreprises font face à des coûts élevés par message et stockage, une complexité technique pour intégrer le RAG, des widgets génériques qui ne représentent pas la marque, un manque de collaboration en équipe, et des données isolées non exploitées. L'opportunité : créer une alternative accessible avec des fonctionnalités avancées pour les entreprises de toutes tailles.
Solution
Développement d'une plateforme SaaS complète qui démocratise l'accès aux chatbots IA avec des prix accessibles, simplifie la création d'assistants sans code, évolue avec une architecture multi-tenant robuste, et monétise avec des plans flexibles via Stripe. La plateforme permet aux entreprises de créer des assistants virtuels contextualisés avec leurs propres documents utilisant la technologie RAG (Retrieval-Augmented Generation), avec un système de collaboration en équipe avec RBAC complet et support de 4 langues.
Mon Rôle
En tant que fondateur et développeur full stack, j'ai conçu et implémenté toute l'architecture du système. Côté backend, j'ai développé Clean Architecture avec Either Monad, Use Case Pattern et Domain Events. Côté frontend, j'ai implémenté TanStack Query avec Optimistic Updates, système d'authentification cross-subdomain, et routage file-based avec TanStack Router. J'ai aussi réalisé tout le design UI/UX et les intégrations avec Stripe, service RAG open source, et système d'emails.
Stack Technique
Frontend
Backend
Projets
Backend API
API REST Multi-Tenant avec Clean Architecture
API REST robuste avec architecture clean, 10 modules de domaine, système de permissions granulaire (RBAC) avec 50+ permissions, intégration Stripe pour billing, et Domain Events pour la communication entre modules.
Fonctionnalités
Clean Architecture
Séparation en couches : routes → controllers → use-cases → repositories → entities
Either Monad
Gestion fonctionnelle des erreurs avec Either<Error, Success> dans tous les use cases
Multi-Tenancy
Isolation complète des données par tenant via subdomain avec middleware de contexte
RBAC Granulaire
50+ permissions sur 4 niveaux de rôles (owner, admin, curator, user)
Domain Events
Communication asynchrone entre modules pour découplage
Webhook Service
Handlers pour événements Stripe (checkout, subscription, invoice) avec vérification de signature
Factory Pattern
Injection de dépendances manuelle sans container, facile à tester et débugger
Zod + OpenAPI
Validation de schemas avec génération automatique de documentation Swagger
JWT Double
Access token (15min) + refresh token (7j) en cookie httpOnly
Rate Limiting
Protection des endpoints avec limites par IP et utilisateur
Intégration RAG
Connexion avec service open source pour traitement de documents et recherche sémantique
Système d'Invitations
Invitations par email avec tracking, expiration et rôles attribuables
Abonnement avec Addons
Système flexible de plans Stripe avec addons modulaires (sièges supplémentaires, stockage, appels API)
Billing Complet
Checkout sessions, portail client, factures, proration, périodes d'essai, annulation
Design Patterns
Stratégie de Tests
Tests Unitaires
Use cases complets60+ fichiers testant use cases et domain logic avec 18+ In-Memory Repositories et 7 In-Memory Providers (hash, token, email, ragflow, stripe, etc.)
Outils: Node.js Test Runner, In-Memory Repositories/Providers
Tests E2E
Toutes les routes40+ fichiers testant controllers avec Prisma Test Environment (base isolée), seed automatique des plans, helpers pour données uniques (generateUniqueEmail, generateUniqueSlug)
Outils: Node.js Test Runner, Prisma Test Environment, Supertest
Décisions Techniques
Fastify vs Express vs NestJS
2x plus rapide qu'Express, validation de schema native, système de plugins modulaire
Either Monad vs throw/catch
Erreurs type-safe, flux explicite, controller sait exactement quelles erreurs attendre
Factory Pattern vs DI Container
Zéro magie, tree-shakeable, TypeScript pur sans decorators, facile à tester
PostgreSQL + Prisma vs MongoDB
Conformité ACID, relations complexes, type-safety, migrations, RLS natif
Défis & Solutions
Isolation Multi-Tenant
Middleware injecte le contexte du tenant dans toutes les queries via header X-Tenant-Subdomain
50+ Permissions Granulaires
Matrice roles → permissions, CheckPermissionUseCase réutilisé dans tous les use cases
Webhook Stripe avec Raw Body
Middleware customisé pour préserver le raw body avant le bodyParser Fastify
Tests E2E Isolés
Prisma test environment avec base isolée, helpers pour générer des données uniques
Frontend Dashboard
SPA React 19 avec Multi-Tenant via Subdomain
Dashboard administratif SPA avec React 19 et TanStack Router. Système d'authentification cross-subdomain via cookies, cache sophistiqué avec TanStack Query, internationalisation en 4 langues, et 31 composants shadcn/ui.
Fonctionnalités
Multi-Tenant via Subdomain
Détection automatique du tenant via hostname (tenant1.ragboost.app)
Auth Cross-Subdomain
Cookies partagés entre subdomains via Domain=.ragboost.app
TanStack Query Cache
staleTime, gcTime, refetchOnMount/WindowFocus configurés par query
Optimistic Updates
onMutate → snapshot → rollback avec feedback instantané
File-Based Routing
TanStack Router avec type-safety complet et beforeLoad pour guards
Axios Interceptors
Refresh token automatique, retry avec exponential backoff, error handling i18n
RBAC Frontend
useCurrentUserRole() avec canManageTeam, canEditChatbots, etc.
Formulaires Validés
React Hook Form + Zod avec schemas partagés frontend/backend
Design System
31 composants shadcn/ui + Radix UI avec Tailwind CSS 4
i18n Complet
4 langues (PT, EN, FR, ES) avec namespaces lazy-loaded
Dashboard Analytics
Graphiques avec Recharts pour métriques d'utilisation
Team Management
Invitations, rôles, suppression de membres avec optimistic updates
Gestion d'Abonnement
Affichage du plan actuel, addons, utilisation, upgrade/downgrade avec Stripe Customer Portal
Sélecteur d'Addons
Interface pour ajouter/supprimer addons (sièges, stockage, appels API) avec aperçu du prix
Design Patterns
Décisions Techniques
React 19 SPA vs Next.js
Dashboard n'a pas besoin de SSR, Vite HMR instantané, builds 10x plus rapides
TanStack Query vs Redux
Cache automatique, mutations avec optimistic updates, moins de boilerplate
TanStack Router vs React Router
Type-safety complet, file-based routing, beforeLoad pour guards
Cookie Auth vs localStorage
Partage cross-subdomain impossible avec localStorage
Défis & Solutions
Auth Cross-Subdomain
Cookie avec Domain=.localhost (dev) / .ragboost.app (prod) partagé entre tenants
Refresh Token Transparent
Interceptor détecte 401, appelle /refresh-token, retente la requête originale
State Management Complexe
TanStack Query pour server state, useCurrentTenant() pour contexte, zéro Redux
Détection Subdomain Multi-Environnement
Support pour lvh.me (dev), localhost, et multisaas.app (prod) avec même logique