Aller au contenu
HL
DisponibleEN
Étude de cas / iaarchivé

Luxconn

IA d'imagerie satellite qui transforme des propriétés de grande valeur en leads notés pour les entrepreneurs

Quatre cartes d'amélioration (Pool Installation, Deck Addition, Outdoor Kitchen, ADU Construction), chacune avec un badge de faisabilité, un emplacement, un raisonnement de mesure, une fourchette de coût estimée et un bouton Visualize
Suggestions d'amélioration GPT-4o pour une propriété. Chaque carte indique un emplacement, des estimations de surface tirées des repères d'échelle de l'image satellite, un niveau de faisabilité et une fourchette de coût.

En bref

Plateformes
Web (Next.js), iOS et Android (Flutter)
Calendrier
De juillet à octobre 2025 (v1 : juillet à septembre, v2 : septembre à octobre, mobile : octobre)
Équipe
Seul sur les versions web v1 et v2 ; un collaborateur sur l'app Flutter
Commits
29 sur la v1 et 60 sur la v2, tous de moi ; 7 sur 11 sur l'app Flutter
Déploiement
AWS Amplify (build Next.js standalone) avec MongoDB et S3
Statut
Archivé

Vue d'ensemble

Luxconn est une plateforme de génération de leads pour les entrepreneurs en rénovation. Elle récupère les données de parcelles et l'imagerie satellite de propriétés de grande valeur, utilise un modèle de vision pour estimer ce qui pourrait être construit sur un terrain (ADU, piscine, cuisine extérieure, terrasse, panneaux solaires), note le résultat et transmet les leads aux entrepreneurs abonnés. J'ai construit seul les deux versions web entre juillet et octobre 2025, puis j'ai lancé l'app Flutter pour les entrepreneurs et je l'ai développée avec un collaborateur.

Le défi

L'objectif était de remplacer la prospection manuelle en porte-à-porte par un logiciel. La plateforme devait trouver des parcelles de grande valeur dans des États et des villes américains choisis, tout en restant dans un budget mensuel d'appels à l'API Regrid. Elle devait récupérer l'imagerie satellite de chaque terrain et obtenir d'un modèle de vision ce qui pouvait réalistement y tenir, avec des mesures plutôt que des suppositions. Les leads devaient ensuite parvenir aux entrepreneurs payants conformément à leur formule d'abonnement. La carte des routes définit six rôles (super admin, admin, support, entrepreneur, franchisé, propriétaire) qui ont besoin de vues différentes des mêmes données. Chaque appel d'imagerie et d'IA coûte de l'argent : les recherches de parcelles devaient donc être comptabilisées et les scans pouvoir être mis en pause.

Mon rôle

J'étais le seul ingénieur sur les deux bases de code web. En v1 (Next.js, de juillet à septembre 2025), j'ai construit la recherche de parcelles via l'API Regrid, les captures de carte avec la limite de la parcelle tracée dessus, les recommandations d'implantation d'ADU avec Gemini 2.5 Flash, incluant l'identification des zones de jardin et la vérification des marges de recul, ainsi que des pages d'évaluation partageables avec QR codes. De septembre à octobre 2025, j'ai reconstruit la plateforme en v2, là encore seul. La v2 couvre l'authentification JWT avec routage par rôle dans le middleware, la gestion des zones de scan avec un quota Regrid mensuel, le pipeline d'imagerie Mapbox et S3, et l'analyse des propriétés par GPT-4o avec un score de 0 à 100. Elle comprend aussi des rendus IA « visualize » avec gpt-image-1 et des retouches par masque, des abonnements Stripe avec des formules gérées depuis l'interface d'administration, et l'attribution des leads selon le quota de la formule. Le reste de la v2 comprend les cartes postales de publipostage, la messagerie et les rendez-vous des entrepreneurs, les tickets de support, une base de connaissances, la 2FA, l'email transactionnel (migré d'AWS SES vers Resend), une page de test de vente vocale construite sur l'OpenAI Agents SDK, et le déploiement sur AWS Amplify. Dans l'app Flutter pour les entrepreneurs, j'ai créé le projet et écrit les services d'authentification et de session, les services API entrepreneur et visualisation, ainsi que les écrans Profile et Schedule. Mon collaborateur a ajouté le fil d'activité du tableau de bord.

Architecture

  1. Clients

    • Application web

      Next.js 15 App Router, React 19, Tailwind CSS 4

      La v2 a des espaces distincts pour super admin, admin, support, entrepreneur et propriétaire, plus des pages publiques de cartes postales et de partage. La v1 avait aussi un tableau de bord pour les franchisés.

    • App mobile pour les entrepreneurs

      Flutter, Provider, go_router, fl_chart, table_calendar

      Tableau de bord, clients, projets, planning et visualisations IA, appelant les mêmes endpoints /api/auth, /api/contractor et /api/dashboard/visualize que l'application web.

  2. Edge/Diffusion

    • Middleware par rôle

      Next.js middleware, jose JWT in httpOnly cookies

      Vérifie le jeton de session à chaque requête et n'autorise chaque rôle qu'à ses propres préfixes de routes, avec une liste blanche de chemins publics.

  3. Services

    • Pipeline de scan et de parcelles

      Regrid API, ScanArea and StateScanProgress models, QuotaManager

      Scanne un État ville par ville à la recherche de parcelles au-dessus d'une valeur minimale, vérifie avant chaque appel un budget mensuel d'appels Regrid stocké dans MongoDB, et marque les villes comme hors quota pour qu'un scan puisse reprendre le mois suivant ou être mis en pause par zone de scan.

    • Processeur d'imagerie

      Mapbox Static Images API (path overlays), AWS S3

      Trace le polygone de la parcelle Regrid sur la tuile satellite sous forme de path overlay Mapbox, stocke plusieurs styles de carte par propriété dans S3, et traite les propriétés par lots avec des délais, en reprenant celles en attente ou en échec au passage suivant.

    • Analyse IA des propriétés

      OpenAI GPT-4o vision (v2); Gemini 2.5 and Claude 3.5 Sonnet (v1)

      Renvoie des suggestions en JSON avec dimensions, emplacement, niveau de faisabilité et valeurs estimées, plus un score global de 0 à 100, selon des règles strictes d'espace minimal et de signaux d'alerte.

    • Visualisation

      gpt-image-1 / DALL-E 2 image edits, sharp, boundary-derived masks

      Construit un masque d'édition à partir du contour vert de la parcelle ou d'une zone de jardin choisie par le modèle, fait reformuler la demande par GPT-4o en prompt d'image, puis génère le rendu de l'amélioration proposée à l'intérieur du terrain.

    • Facturation et distribution des leads

      Stripe products, prices, subscriptions and webhooks

      Les formules sont stockées dans MongoDB avec une allocation mensuelle de leads et synchronisées avec les produits et prix Stripe. Une route de webhook met à jour l'état des abonnements, et les leads sont attribués par score, puis par valeur estimée du projet, dans la limite de l'allocation de la formule.

    • Outils pour les entrepreneurs

      Postcard generator with QR code, messaging, appointments, support tickets, knowledge base

      Les entrepreneurs génèrent une carte postale de publipostage pour un lead ; chaque carte reçoit un identifiant de partage et un compteur de vues.

  4. Données

    • Base de données principale

      MongoDB with Mongoose (22 models)

      Stocke les propriétés, les leads, les zones de scan et la progression des scans, la file de traitement, les abonnements, les formules, les paiements, les cartes postales, les tickets, les messages, l'usage des API, les appels vocaux et les journaux d'activité.

  5. Services tiers

    • Email et voix

      Resend, React Email, OpenAI Realtime / Agents SDK

      Envoie les emails de vérification, de réinitialisation de mot de passe et de notification, et alimente une page de test réservée au super admin pour un agent commercial vocal.

Décisions clés

  1. 01

    Tracer la limite de la parcelle dans l'image que voit le modèle

    Je trace le polygone Regrid en vert sur l'image satellite Mapbox, et c'est cette image avec la limite que GPT-4o analyse. Le même contour vert est ensuite détecté et transformé en masque d'inpainting. Le modèle raisonne ainsi sur le bon terrain, et les rendus restent à l'intérieur. La contrepartie : une dépendance à l'exactitude de la géométrie des parcelles Regrid.

  2. 02

    Exiger une sortie mesurée et structurée

    J'ai donné au prompt d'analyse des surfaces minimales strictes (par exemple 400 pieds carrés pour une piscine ou un ADU indépendant), des règles de signaux d'alerte et une échelle de faisabilité à quatre niveaux. Il oblige le modèle à estimer l'échelle à partir de repères visibles comme une voiture, une allée ou la largeur d'un trottoir, et à renvoyer un JSON conforme au schéma. Les entrepreneurs obtiennent une justification vérifiable au lieu d'une simple étiquette. Les dimensions restent des estimations tirées d'une seule image.

  3. 03

    Noter les leads selon leur source

    Chaque lead enregistre son origine : ai_scanned, high_quality_homeowner ou manual_entry. Un propriétaire qui scanne sa propre propriété obtient des leads notés à partir du résultat GPT-4o plus un bonus de 15 points. Les leads ajoutés à la main par un entrepreneur sont notés à partir de la valeur estimée du projet. L'attribution trie par score, puis par valeur du projet.

  4. 04

    Tarification Stripe gérée en base de données

    Les super admins créent et modifient les formules dans l'interface. Le code crée le produit et le prix Stripe correspondants, ou crée un nouveau prix et archive l'ancien, car les prix Stripe sont immuables. L'allocation mensuelle de leads est portée par la formule. Un changement de prix ne nécessite aucun déploiement, mais les deux systèmes doivent rester synchronisés via les webhooks.

  5. 05

    Compter les appels à l'API de parcelles payante

    QuotaManager tient dans MongoDB un compteur mensuel d'appels Regrid, vérifié avant chaque appel. Quand le budget est épuisé, la ville en cours de scan est marquée hors quota et reprise plus tard. Les zones de scan peuvent être mises en pause individuellement, et le traitement de l'imagerie s'exécute par petits lots avec des délais. Les dépenses liées aux parcelles restent ainsi plafonnées, au prix de scans plus lents.

  6. 06

    Exécuter Next.js sur Amplify en build standalone

    La v2 construit Next.js en mode standalone et le livre sur AWS Amplify avec un petit fichier de serveur personnalisé. Elle obtient l'accès AWS via le rôle IAM d'Amplify plutôt que par des identifiants commités. Faire parvenir les variables d'environnement au runtime serveur m'a demandé plusieurs itérations en septembre et octobre 2025.

Résultats

  • Remplacement de la prospection manuelle par un pipeline automatisé du scan au lead, sur deux refontes (v1 juil.–sept., v2 sept.–oct. 2025).
  • Pipeline de scan v2 : zone de scan, parcelles Regrid filtrées par valeur sous un quota mensuel, images satellite Mapbox avec la limite de la parcelle tracée dessus, stockées dans S3.
  • Les scans lancés par les propriétaires sur leur bien exécutent GPT-4o sur l'image avec la limite et renvoient des améliorations détaillées (piscine, terrasse, cuisine extérieure, ADU, panneaux solaires, aménagement paysager) avec emplacement, faisabilité et fourchette de coût, puis créent des leads notés.
  • Rendus IA des améliorations proposées avec des retouches gpt-image-1 masquées sur la parcelle.
  • Abonnements Stripe pour les entrepreneurs, avec des formules modifiées depuis l'interface d'administration, un état piloté par webhooks et une allocation des leads selon le quota de la formule.
  • App Flutter pour les entrepreneurs sur iOS et Android, branchée aux API d'authentification, entrepreneur et visualisation de la plateforme.

Stack

Web
Next.js 15React 19TypeScriptTailwind CSS 4react-hook-formZodRechartsChart.js
Backend et données
Next.js API routesMongoDBMongoosejose / JWTbcryptjsspeakeasy (2FA)
IA
OpenAI GPT-4o visiongpt-image-1DALL-E 2OpenAI Agents SDK (Realtime)Google Gemini 2.5 (v1)Anthropic Claude 3.5 Sonnet (v1)
Géo et imagerie
Regrid Parcel APIMapbox Static ImagesMapbox GLGoogle Mapssharp
Paiements et messagerie
Stripe (products, prices, subscriptions, webhooks)ResendReact EmailQR code generation
Infrastructure
AWS AmplifyAWS S3 with presigned URLsPuppeteer (screenshot automation scripts)
Mobile
Flutter / DartProvidergo_routerfl_charttable_calendarflutter_secure_storage

Luxconn · captures d'écran

Image satellite Mapbox d'un pâté de maisons résidentiel avec un terrain entouré en vert, à côté d'une image noire avec un rectangle blanc marquant la zone modifiable
1 / 3Étape du pipeline : la limite de la parcelle Regrid est tracée sur l'image satellite Mapbox, puis transformée en masque d'édition pour que les rendus IA restent à l'intérieur du terrain. Imagerie © Mapbox, © Maxar.