mwn

Merwan Laouini

Je construis des logiciels de bout en bout, du schéma de base de données à la mise en service.

Un système, en coupe.

Chaque produit éclaté en ses vraies couches, de l'interface à l'infrastructure. Les routes et les modèles ci-dessous sont lus dans le code des projets, pas dessinés pour l'occasion.

NODE_01

Reputap

Collecte d'avis Google par NFC, multi-établissements, avec anti-abus.

En production

Survoler l'interface pour suivre une donnée jusqu'à la base.

Lire l'étude de cas
L0 · Interface
Tableau de bord marchand Reputap : scans totaux, taux de conversion, clients fidèles, lots distribués et activité en temps réel d'une boulangerie de démonstration.
L1 · Routes et actions
  • GET/s/[publicToken]résout le tag, crée la session de scan
  • GET/r/[token]redirection courte imprimée sur la plaque
  • POST/api/session/[sessionToken]/review-linkenregistre l'intention d'avis, ouvre Google
  • POST/api/session/[sessionToken]/resulttirage serveur, émission du ticket
  • GET/win/[campaignId]roue de gains, animation du résultat
  • GET/api/merchant/dashboardchiffres de l'établissement
  • GET/admin/campaigns/[id]règles anti-abus, roue et lots par campagne
  • GET/admin/onboardingcréation du tenant et du premier établissement
  • GET/api/admin/billing/overviewabonnements, factures
  • GET/api/admin/system/healthlatence base, disque, journaux
L2 · Modèle de données
  • Tenantidnameslugstatus
  • EstablishmenttenantIdnamecitytimezonegoogleReviewUrl
  • NfcTagestablishmentIdcampaignIdpublicTokenlastRotatedAt
  • CampaignestablishmentIdtypestatusconfigJsonstartsAt
  • ScanSessionnfcTagIdsessionTokendeviceIdipHashstatusexpiresAt
  • ReviewIntentscanSessionIdprovidertargetUrl
  • PrizewheelIdnameweightdailyCaptotalCap
  • SpinscanSessionIdwheelIdprizeIdresultType
  • ClaimspinIdclaimCodestatusexpiresAtredeemedByMembershipIdrejectionReason
L3 · Infrastructure
  • Vercelhébergement, fonctions serveur
  • PostgreSQL · Supabasebase de données, isolation par tenant
  • Prismamodèle et migrations
  • Auth.jssessions, rôles super_admin / owner / user
  • Resendemails transactionnels
  • Stripefacturation
NODE_02

KastMe

Portfolio interactif en une adresse, pour artistes, mannequins et photographes.

En construction

Survoler l'interface pour suivre une donnée jusqu'à la base.

Lire l'étude de cas
L0 · Interface
Page publique de démonstration KastMe : les photos d'un photographe animalier fictif flottent dans une sphère autour de sa carte de profil et d'un bouton de réservation.
L1 · Routes et actions
  • GET/[slug]page publique, SSR + ISR, image OG générée
  • GET/p/[id]ancienne URL, redirection 301 vers le slug
  • GET/registerinscription Firebase Auth
  • GET/api/slug/checkdisponibilité et noms réservés
  • GET/editor/[[...id]]éditeur de la sphère et des médias
  • PATCH/api/portfolios/[id]sauvegarde, validée par Zod
  • POST/api/trackstatistiques de visite par jour
  • GET/api/account/exportexport des données du compte
L2 · Modèle de données
  • users/{uid}planrolecreatedAt
  • PortfoliouserIdslugpreviousSlugspublishedprofilegallerytheme
  • Profilenameprofessionscity
  • MediatypeurlthumbUrlposterUrlwidthheightalt
  • Linkidlabelurlfeatured
  • ThemepresetmonochromedensityrotationSpeedbackgroundColor
  • slugs/{slug}userId
  • stats/{day}viewsclicks
L3 · Infrastructure
  • Vercelhébergement, ISR, images OG
  • Firebase Authcomptes créateurs
  • Firestoredocuments, règles de sécurité testées
  • Cloud Storageimages 10 Mo, vidéos 50 Mo
  • Firebase Adminécritures serveur (plan, rôle)
NODE_03

Capsule Manufacturing

Du devis au suivi de production, pour un atelier textile en petites séries.

En construction

Survoler l'interface pour suivre une donnée jusqu'à la base.

Lire l'étude de cas
L0 · Interface
Fiche projet côté atelier : détails de fabrication, adresse de livraison et suivi de production en neuf étapes, l'étape courante surlignée.
L1 · Routes et actions
  • GET/vitrine et configurateur de devis en six étapes
  • POST/api/quotedossier technique en upload privé, devis persisté
  • GET/auth/signinmarque par lien magique, atelier par identifiants
  • GET/admin/quotes/[id]chiffrage : prix unitaire, frais techniques, délai
  • PATCH/api/admin/quotes/[id]PRICED crée le compte client, PAID crée le projet
  • POST/api/client/quotes/[id]/paypaiement (simulé) puis projet et expédition
  • PATCH/api/admin/projects/[id]passage à l'étape suivante
  • GET/client/projects/[id]même timeline côté marque
  • PATCH/api/client/projects/[id]/addressadresse modifiable tant que rien n'est expédié
  • GET/admin/projects/[id]/delivery-slipbon de livraison A4, impression navigateur
  • GET/admin/materialsréceptions de tissu, écran présent, saisie à venir
L2 · Modèle de données
  • UseremailbrandNameroleemailVerified
  • QuoteproductmaterialTypegrammagebrandingbrandingLocationsquantityunitPricesetupFeesleadTimeschemaFilestatus
  • ProjectreferencequoteIduserIdproductquantitystatus
  • MaterialprojectIdcarriertrackingNumberquantityMetersreceivedAt
  • ShipmentprojectIdtypecarrieraddressshippedAtdeliveredAt
  • SessionsessionTokenuserIdexpires
L3 · Infrastructure
  • Next.js 16App Router, React Compiler, proxy.ts
  • MySQL · Prisma 6modèle relationnel, huit tables
  • NextAuth 4JWT, lien magique et identifiants, rôles ADMIN / CLIENT
  • Stockage privédossiers techniques hors du dossier public
  • Impression A4bon de livraison sans librairie PDF