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

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
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.
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.
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.
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é.
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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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