wari.pro — Project Overview
Pitch
wari.pro — l'index officiel et action-able du commerce ouest-africain, formel et informel.
Marketplace SaaS B2B2C pour le Burkina Faso et l'Afrique de l'Ouest. Modèle business : abonnements vendus aux prestataires (gérants) qui gèrent leur vitrine et servent leurs clients finaux via le web ou l'app mobile.
3 piliers de la promesse produit :
- Découverte garantie — sortir du bouche-à-oreille Snapchat / WhatsApp.
- Action garantie — réservation ferme, commande livrée avec suivi.
- Notifications qui convertissent — Stories vitrines + push abonnés.
Repository structure
Monorepo logique (mais sans tool monorepo : pas de workspaces npm, pas de Turbo). Deux parts indépendantes au build :
| Part | Path | Type | Stack |
|---|---|---|---|
backend | app/ | web (full-stack Next.js) | Next.js 16.2 + Prisma 7.6 + PostgreSQL 15 + Redis + MinIO |
mobile | mobile-staging/ | mobile (Expo) | Expo SDK 54 + RN 0.81 + Expo Router v6 |
⚠️
mobile-staging/sur le VPS est un miroir de la source de vérité dev~/DEVELOPPEMENT/sur la machine fabrice (192.168.1.152, accessible via reverse SSH tunnel port 2222). Les commits mobile (wari-mobileGitHub repo) partent de cette machine.
À la racine cohabitent aussi :
docker-compose.yml— orchestration prod/staging (postgres + redis + minio + nextjs + typesense)_bmad/+_bmad-output/— framework agile BMAD (44 skills.claude/skills/bmad-*)tests-pratiques/— fixtures sessions QA TestFlight (ex.cils-et-or/)Captures/— screenshots / artifacts visuelsdocs/— la documentation projet (ce dossier)
Tech stack résumée
Backend (app/)
| Couche | Choix |
|---|---|
| Framework | Next.js 16.2.2 — App Router, Turbopack |
| Langage | TypeScript strict |
| ORM | Prisma 7.6 + PostgreSQL 15 |
| Auth | JWT custom avec jose — PAS NextAuth (le pkg next-auth@5.0.0-beta.30 est listé mais non utilisé pour les flows auth) |
| Cache | Redis 7 |
| Stockage médias | MinIO self-hosted, proxié via Nginx sur /medias/ |
| Resend | |
| SMS | Vonage (partiel) |
| Push | expo-server-sdk + FCM |
| Search | Typesense 0.25.2 (Docker) + embeddings CLIP (HuggingFace) |
| AI | Google Generative AI (@google/generative-ai Gemini) + Anthropic Vision (recherche image V1) |
| Analytics | PostHog Cloud |
| Monitoring | Sentry (@sentry/nextjs) |
| State builder | Zustand 5 + Immer |
| Drag & drop | @dnd-kit |
| Validation | Zod 4 |
| Tests | Vitest 3 |
| Infra | Docker Compose, Nginx, VPS Debian 13 |
Mobile (mobile-staging/)
| Couche | Choix |
|---|---|
| Plateformes | iOS + Android (jsEngine Hermes, mobile-only — pas de cible web) |
| SDK | Expo 54 |
| RN | 0.81.5 |
| Router | expo-router v6 (file-based) |
| State | Zustand 5 (16 stores) |
| Data | @tanstack/react-query 5 |
| Tests | Jest 29 + jest-expo 55 + @testing-library/react-native 13 |
| Push | expo-notifications (FCM Android, APNs iOS) |
| Camera | expo-camera (scan code-barres + recherche image) |
| Storage | @react-native-async-storage + expo-secure-store |
| i18n | i18next + react-i18next + expo-localization |
| Icons | phosphor-react-native (lib unique, voir DEC-133/134) |
| Monitoring | Sentry RN |
| Builds | EAS Build (channels development/preview/production) |
| Bundle ID | iOS pro.wari.mobile, slug Expo wari-mobile |
Architecture type
| Aspect | Pattern |
|---|---|
| Multi-tenancy | Backend : tous les modèles portent tenantId. Production = sous-domaine *.wari.pro → tenant résolu via host. Dev = ?tenant=<slug>. |
| Auth | Cookie superapp_session httpOnly (web) ET Bearer JWT (mobile) — même secret NEXTAUTH_SECRET, même payload { userId, role, tenantId? }. Helper unique getSessionFromRequest(req). |
| Builder vitrine | Snapshots JSONB en DB. isDirty calculé via fast-deep-equal. Pages publiques = snapshot PUBLISHED ; preview = DB live via ?preview=live. Pages applicatives (Boutique, Services) = type APPLICATIVE non persistées. |
| API mobile | 186 routes sous /api/mobile/* — séparées des routes web admin pour ne pas casser le contrat web en touchant le mobile (DEC-107). |
| Notif Engine V1 | Polymorphic abonnement (NotifEvent + NotifDelivery + NotifCanal enum). Dispatch Push/Email/SMS/WhatsApp lien. Broadcast gérant + Suivre client. |
| Modules tenant | TenantModule.nom libre : catalogue, services, rdv, restaurant, evenements. La TabBar mobile gérant change selon les modules actifs. |
| Niveaux d'accès vitrine | 4 valeurs : PUBLIC / CONNEXION / SUR_DEMANDE / INVITATION (DEC-211/212/214/215). Seul INVITATION est strictement invisible en LIST. |
| Stories | Model VitrineStory (V1 ImageStory) + cron expiration + push abonnés. Bandeau client + viewer ; composer gérant. |
Volumétrie code
| Métrique | Valeur |
|---|---|
| Modèles Prisma | 72 |
| Enums Prisma | 36 |
| Migrations Prisma | 73 |
| Routes API totales | 280 |
| Routes /api/mobile/* | 186 |
| Components backend (.tsx) | 33 (src/components/) |
| Components mobile (.tsx) | 239 (components/) |
| Stores Zustand mobile | 16 (store/) |
| Hooks mobile | ~60 (hooks/) |
| Écrans mobile (incl. nested) | ≥ 50 routes file-based |
| Features livrées | WP-001 → WP-232 |
| Bugs résolus | BUG-001 → BUG-134 |
| Décisions techniques | DEC-001 → DEC-223 |
État actuel (Mai 2026)
- iOS TestFlight : build natif 4 publié, ~17 OTA prod livrées depuis ce build.
- VPS prod :
51.91.57.176(Debian 13). Nginx + Docker Compose. Containers postgres, redis, minio, nextjs, typesense. - Domaine :
wari.pro+*.wari.pro(catch-all wildcard pour vitrines tenant). - Repos :
github.com/ouattaradfabrice/superApp_V1(backend) +github.com/ouattaradfabrice/wari-mobile(mobile). - Audit complet 2026-05-20 (7 angles) : score consolidé 5.5/10. 10 P0 sécu+ops livrés dans sprint hardening (JWT fail-closed, Open Redirect, OTP rate-limit, MIME allowlist, 8 indexes Prisma, backups MinIO+Postgres, vitest v3 + 8 tests lib, Dockerfile prod multi-stage).
- BMAD installé : framework agile AI-driven (analyst→pm→architect→po→sm→dev→qa) à utiliser pour cadrer epics significatifs (rester sur méthode actuelle pour bugfix).
Liens vers la documentation détaillée
- Architecture backend
- Architecture mobile
- Source tree annotée
- API contracts (mobile)
- Modèles de données
- Inventaire composants backend
- Inventaire composants mobile
- Guide développement backend
- Guide développement mobile
- Déploiement (Docker + EAS)
- Intégration backend ↔ mobile
- Diagrammes Excalidraw :
app/Docs/architecture-gerant.excalidraw+architecture-client.excalidraw - Vision produit / runbook / IDs WP·BUG·DEC : voir
CLAUDE.mdracine +app/CLAUDE.md