Repository Public
-
Thu, Aug 13, 20267 commits
-
Profil enrichi — photo téléversée, bio, ville, coordonnées, réseaux sociaux
···
- louka/profile.py : PUT /api/me/profile (nom affiché, bio 280, ville, téléphone, site web, réseaux instagram/facebook/x/linkedin/tiktok/youtube), POST /api/me/avatar (Pillow : EXIF, recadrage carré centré, 512 px, JPEG, purge des anciennes photos), DELETE /api/me/avatar (retour avatar Google) - /uploads/ monté (data/uploads/), colonnes users (display_name, avatar_url, bio, city, phone, website, socials JSON) - /api/me : nom et avatar « effectifs » (display_name > Google, upload > Google) + tous les champs ; profil public /u/{ka_id} : bio, ville, rôle, site, réseaux (jamais courriel/téléphone) - /profil : éditeur complet (photo avec téléversement, nom affiché, bio avec compteur, ville, téléphone, site, 6 réseaux avec icônes maison) - /u/{ka_id} : bio, chips ville/rôle/site, boutons réseaux sociaux - python-multipart ajouté (formulaires multipart FastAPI) -
Comptes v2 — KA-ID, profil « carte de membre », rôles, favoris, pages gestionnaires
···
- KA-ID : identifiant membre unique « ka- » + 10 chiffres, attribué à la création du compte (index unique, backfill au premier /api/me) - /profil : carte de membre Groupe KA (encre + lime, KA-ID en vedette, avatar, ancienneté, bande décorative), infos du compte, copie du KA-ID - Profil PUBLIC opt-in : /u/{ka_id} (nom, avatar, ancienneté — jamais le courriel ; 404 indistinguable si non public), toggle + lien copiable - Rôles à l'intégration (/bienvenue après le premier login Google) : · locataire — favoris (cœur sur les cartes, page /favoris, toggle optimiste) · gestionnaire — réclame la page de SA source (1/compte, 1 compte/source) et la personnalise (/gestion : accroche, description, contact, logo) ; page publique /g/{source} avec inventaire relié + pagination - louka/accounts.py (rôles, favoris, source_profiles), tables favorites + source_profiles + colonnes users (ka_id, public, role, org_source) - Contexte de compte partagé (account.tsx) : header, cartes et pages reliés -
Comptes utilisateurs — connexion Google (OAuth 2.0 / OpenID Connect)
···
- louka/auth.py : flux authorization-code serveur (login -> Google -> callback), state signé, upsert table users, session HMAC-SHA256 en cookie httpOnly 30 j (stdlib seulement), /api/me, /api/auth/logout, /api/auth/config - db.py : table users (google_sub unique, email, name, picture) - Frontend : bouton « Connexion » (logo Google) dans le header, avatar + menu compte (courriel, se déconnecter) — masqué tant que l'OAuth n'est pas configuré - .env : SESSION_SECRET généré ; GOOGLE_CLIENT_ID/SECRET à coller (redirect URI : https://www.lou-ka.com/api/auth/google/callback)
-
Web — mention Groupe KA + page Conditions d'utilisation + courriels officiels
···
- Footer : « Lou-Ka est une plateforme du Groupe KA » (lien groupe-ka.com), © Groupe KA, contact@groupe-ka.com, lien vers /conditions - Nouvelle page /conditions : opérateur (info@groupe-ka.com), nature du service, exactitude, retrait de contenu (contact@groupe-ka.com), usage acceptable, volet légal (admin@groupe-ka.com) — route + menu mobile - Confidentialité : responsable Loi 25 admin@groupe-ka.com, retraits et questions contact@/info@groupe-ka.com (remplace contact@spboucher.ai)
-
Web — pagination 12 annonces/page + icônes SVG maison (fin des emojis génériques)
···
- Pager.tsx : pagination éditoriale (précédent/suivant, numéros avec ellipses, rappel « X–Y sur N »), sous la grille ET sous la liste de la vue carte - Home.tsx : 12 annonces/page via limit/offset API, page dans l'URL (?page=N), retour page 1 au changement de filtre, défilement doux vers les résultats - Icons.tsx : jeu d'icônes SVG au trait « éditorial sharp » (maison, immeuble, caméra, patte, sofa, éclair, liste, carte, curseurs, alerte, boussole…) - Emojis remplacés partout (cartes, chips, bascule liste/carte, FAB filtres, nav mobile, onglets Stats, fiche, carrousel vide, popups carte, 404)
-
-
Wed, Aug 12, 20261 commit
-
Portails & courtiers en location — 10 connecteurs portés d'Immo-Ka (Kijiji, LesPAC, RE/MAX, Sutton, Royal LePage, Via Capitale, Proprio Direct, Ubee, Barnes, M Immobilier)
···
- base.py : backends Scrapfly (scrapfly/get_scrapfly) + post() portés d'Immo-Ka - _detailutil.py : helper partagé d'enrichissement fiche détail (cache BD, budget par sync) adapté au schéma Listing - Kijiji c37 apparts/condos + c36 chambres/coloc (Apollo __NEXT_DATA__, QC l9001) - LesPAC b457 logements + b458 coloc + b460 aînés (searchResponse, ancre Montréal = province entière triée par distance) - RE/MAX Québec : index Meilisearch public shardé par RTA, slugs -a-louer seulement - Sutton : sitemap inscriptions typeInscription=2 (= locations) - Royal LePage : recherche transactionType=LEASE (formulaire caché), 28 villes d'ancrage - Via Capitale : criteresJson AVendre:false via Firecrawl (Cloudflare) - Proprio Direct : API searchListings filter rentOrSale:rent, volet résidentiel - Ubee : API SearchProperties listingType Renter (askPrice = loyer mensuel) - Barnes : Algolia facette type:rental (property_rent) ; M Immobilier : CODE_STATUT=AL - sources.json : 255 → 265 (10 nouvelles sources « Province »/Montréal) - Écartés après vérification live (pas de location résidentielle) : DuProprio, Profusion, Engel & Völkers, KW Prestige/Distinction/Urbain, Expert PM, Sotheby's Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Tue, Aug 11, 20261 commit
-
Filtres avancés — refonte du menu web + facettes par ville
···
- /api/facets accepte ?city= : quartiers restreints à la ville (sélecteur dépendant) - Menu de filtres refait : rangée principale compacte (recherche, ville, quartier, loyer min–max, « Plus de filtres ») + panneau avancé repliable en segments (disponibilité, meublé, animaux, superficie, gestionnaire) - Correction du débordement horizontal (colonnes 1fr → contrôles bornés) - Chips rapides (dispo maintenant, animaux, meublé) + pastilles de filtres actifs retirables ; api.ts : price_min, pets, furnished, available_by, area_min - ios/ ignoré : l'app iOS native vit dans son propre dépôt (lou-ka-ios) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Sun, Aug 9, 202613 commits
-
Expansion provinciale complète : registre final (255 sources, 179 actives), README, enrichissement
···
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Expansion P3 — Estrie (6 connecteurs +24 annonces, 17 non-connectables)
···
terater (12) · alexcellence (4e Houzez, sous-classe Dynamic) · oxford · immeubles_pm (plogg vivant) · majestic (Granby) · lequerre (OBNL). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Expansion P3 — Est & Nord + Chaudière-Appalaches (7 connecteurs +98 annonces, 9 non-connectables)
···
quartier_plus (Thetford, 59) · immeubles_bois (Rimouski, catalogue 23) · louer_saguenay · luxuor · beaulieu_groupe · gestion_jdm · alias_appartements. LM Gestion et Alexandre Pelletier re-vérifiés (sites toujours morts). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Expansion P3 — Mauricie/CdQ/Lanaudière (6 connecteurs +53 annonces, 8 non-connectables)
···
moderno · acceslogis_gb · ferrovia (23, prix non publiés) · habitations_sf · lambert · fournelle. Non-connectables documentés (parcs pleins, vitrines sans unités, renvois Facebook). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Expansion P3 — Outaouais (5 connecteurs +41 annonces, 10 non-connectables)
···
wandji (API /api/buildings découverte, 29) · gio (crawl-delay 3 respecté) · immnasr · quanta · leviu (portail Magex). Registre fusionné. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Expansion P2 — Estrie (15 connecteurs, +279 annonces)
···
Famille Houzez factorisée (dynamic -> gestimmo_estrie, agence_sherbrooke) · uptimo (51) · dynamic (49) · matinale (42, Crawl-Delay 20 respecté) · gestimmo (41) · montagnais (6 campus étudiants) · floria (Livya) + 8 autres. 6 non-connectables documentés (plateforme plogg morte, vitrines sans prix). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Page Stats en 5 onglets + rapport PDF enrichi (source unique marketstats.py)
···
- louka/marketstats.py : tous les agrégats du marché (régions, offre, inclusions, prix au pi², baisses de prix 30 j, santé des sources) — partagés entre /api/stats/detailed et le rapport PDF - Onglets : Vue d'ensemble (tuiles + régions + histogramme) · Loyers (histogramme, par taille, prix au pi², baisses de prix cliquables) · Régions & villes · L'offre (inclusions %, dispo, animaux, superficie) · Gestionnaires (top 20 + santé des syncs + alertes 24 h) - Rapport PDF : page « Offre » ajoutée (barres d'inclusions, prix au pi², baisses de prix), 4 pages, mêmes chiffres que le site Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Expansion P2 — Outaouais (10 connecteurs, +136 annonces)
···
garic (admin-ajax JSON avec GPS, 47) · aalto (RentCafe/Zibi via Firecrawl, 28) · desmarais (14) · souleymane (13) · elite (12) · lacite (crawl-delay 10 respecté, prix non publiés) + 4 autres. Aucune exclusion nécessaire. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
PDF légendaires : fiche de propriété par annonce + rapport global du marché
···
- louka/pdfgen.py (reportlab) au style éditorial sharp : logo Lou·Ka dessiné (boîte lime tournée), tuiles à ombre décalée, chips encre/lime - Fiche (/api/listings/{uid}/pdf, 2 pages) : prix géant + badge « vs le secteur », chips clés, photos encadrées, encadré « En bref » (text mining), description structurée, inclusions ✓, tuiles du quartier + barres de proximité + badges chaleur/criminalité, à proximité avec temps de marche, QR code vers la fiche en ligne, attributions de licences - Rapport global (/api/stats/rapport.pdf, 3 pages) : grands chiffres, couverture par région avec barres, histogramme des loyers, par taille, top 20 villes et gestionnaires - Boutons : « Télécharger la fiche (PDF) » sur chaque annonce, « Télécharger le rapport global (PDF) » sur la page Stats Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> -
Expansion P2 — Est & Nord (19 connecteurs, +633 annonces)
···
medway (494 — Lévis 343, Québec 81, La Malbaie, Pont-Rouge, Rivière-du-Loup) · immeubles_aeb (26, Saguenay) · location_saguenay (21, crawl-delay 10 respecté) · appartements_rimouski (17, GPS permutés corrigés) · habitations_jeanne (14, Baie-Comeau) · stb_immobilier (11, correctif : Matane pas Lévis) · immeubles_dcl (9, API FleetCart) + 12 autres. Non-connectables documentés : habitat_honguedo (Gaspé, vide depuis 2020), immofidelite (RPA hors périmètre). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Expansion P2 — Mauricie/Centre-du-Québec/Lanaudière (17 connecteurs, +423 annonces)
···
evoludev (Laravel+JSON-LD, 125) · groupe_robin (admin-ajax, 65) · cosoltec (Planpoint x3 vitrines, 51) · info_logement (45) · jutras (35) · gestion_isr (API Supabase découverte, 21) + 11 autres. 3 non-connectables documentés (nicolyn, gestion_traversy, proplex). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Expansion P2 — Chaudière-Appalaches (le_baronet, girs, +11 annonces)
···
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Expansion provinciale P1 : 26 nouveaux connecteurs + 8 extensions (+1 358 annonces)
···
Lot 0 extensions : girescom +Beauce, msi +Thetford, utile +Trois-Rivières/ Rimouski, cogir/realstar/centurion/plan_a +Gatineau/Sherbrooke. Lot 1 plateformes maîtrisées : thrace (Livya, 181), lr_gestion (Rentsync), urban_services + immobilia (Building Stack). Lot 2 Est & Nord : immeubles_bc (Rimouski), tri_logis (Rouyn), devcore (Sept-Îles/Outaouais), multi_logis (Côte-Nord+Lévis), courtemanche (Saguenay). Lot 3 Estrie : lachance (82), gesteco (API Umbraco), savouet, laureat_richard, desroches. Lot 4 Mauricie/CdQ : location_di, cap_gestion (122), capital_rdr, gestion_tb, summum (93). Lot 5 Outaouais/Ch-App : halfred (165), heafey (245), brigil (Firecrawl), mellem, quartier_oree, le_st_georges, place_florimay. Enrichissement complet appliqué : géocodage provincial (+616), POI 1 756 immeubles, quartier 1 088 annonces jointes (0 hors-zone), normalize corrigé (frontières de mots des mois). Registre : 114 sources, 108 connecteurs, ~7 350 annonces. Secrets tiers caviardés des fixtures (jetons Mapbox + caviardage automatique à l'enregistrement). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Sat, Aug 8, 202618 commits
-
Expansion provinciale : bornes géographiques élargies (géocodage + recensement)
···
Le garde-fou du géocodeur et la bbox des aires de diffusion excluaient Gatineau, l'Abitibi, le Saguenay, le Bas-Saint-Laurent, la Côte-Nord et la Gaspésie. Élargis à la province habitée (44,5-63 / -80 à -56) ; reconstruction du recensement provincial lancée. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Stats : compte « ailleurs au Québec » distinct du Grand Montréal (expansion provinciale)
···
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Phase 1 expansion provinciale : recensement 173 gestionnaires (33 P1) + plan de déploiement
···
5 rapports régionaux vérifiés site par site (techno, robots.txt, CGU) + familles de plateformes + exclusions documentées + ordre de construction. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Page /bot (transparence LouKaBot) + User-Agent pointant dessus
···
Explique le robot aux gestionnaires : cadence, respect de robots.txt, aucune donnée personnelle, contact pour flux officiel/retrait, consigne de blocage. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Passerelle de sortie vers l'annonce originale (à la Centris)
···
/passerelle/:uid — Lou-Ka -> gestionnaire avec points animés, barre de progression (2,2 s) puis redirection ; boutons « Y aller maintenant » et « Rester sur Lou-Ka ». Sécurité : uid seulement, l'URL de destination vient de l'API (aucune redirection ouverte). CTAs de la fiche (desktop + sticky) rebranchés ; prefers-reduced-motion respecté. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Text mining des descriptions : nettoyage, extraction, sections, En bref
···
louka/textmine.py (déterministe, ~1 ms/annonce, aucune dépendance) : - A nettoyage : TITRES EN MAJUSCULES -> sections, doublons (« Disponible disponible »), phrases collées, typographie québécoise (insécables $/%) - B extraction : bail minimum, occupants (« 11 chambreurs »), sdb/cuisine commune-privée, électros, dépôt, ~40 quartiers (réutilise normalize.py) - C sections jamais reformulées ; « En bref » par gabarit strict à partir des faits haute-confiance seulement (aucune invention) - D confiance par fait, incohérences (quartier mentionné ≠ secteur), complétude 0-100 — 25 tests dont un test d'or sur le 2435 boul. Laurier Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Fiche v2 mobile-first : essentiel d'abord, badge marché, CTA sticky, historique de prix
···
- Ordre mobile : galerie (balayage natif + compteur) -> prix + badge « vs le secteur » (seuils -15 %/+10 %) -> chips clés défilantes -> ancres -> description -> inclusions (confirmées ✓ vs mentionnées, badge 0 $ de frais cachés) -> détails pratiques -> quartier -> à proximité groupé repliable avec temps de marche estimés - Desktop : 2 colonnes (logement | synthèse+quartier) via display:contents - CTA source sticky en bas d'écran mobile (toujours visible) - Criminalité reformulée (« 15 % sous la moyenne canadienne ✅ ») - Backend : table price_log (historique de prix aux changements), colonne digest (description structurée, pipeline en cours), « en ligne depuis X jours », plomberie schema/db/web Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Quartier : scripts de construction des données + centiles PMD + correctif débordement mobile
···
- scripts/build_{recensement,contexte,environnement}.py : pipelines rejouables (StatCan recensement 2021 + limites AD, PMD, INSPQ défavorisation, écoles MEQ/IMSE, îlots de chaleur INSPQ, actes criminels SPVM, IGC WDS) - merge_quartier.py : fusion + rangs centiles québécois des scores PMD (l'échelle nationale brute écrasait les valeurs urbaines) - data/quartier.db (51 Mo, gitignoré) : déployé par rsync, reconstruit par scripts — 11 317 AD, 49 791 actes SPVM 24 mois, 1 249 immeubles chaleur - min-width:0 sur les enfants de .detail-grid (débordement mobile) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> -
Stats de quartier (à la Centris) — runtime + fiche « Le quartier »
···
- louka/quartier.py : jointure lat/lng -> aire de diffusion 2021 (point-dans- polygone local, préfiltre bbox), assemblage fiche (démographie recensement, scores de proximité StatCan, défavorisation INSPQ, îlot de chaleur, criminalité SPVM <500 m sur l'île / indice IGC ailleurs), enrichissement listings.dauid dans la boucle watch - data/quartier.db : base statique construite par scripts/ (fusion via scripts/merge_quartier.py), défensif si absente - fiche : section « Le quartier » (tuiles démographiques, barres de proximité 0-100, badges chaleur/criminalité, attributions licences ouvertes) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Recherche : enrichissements de quartier à la Centris (26 sources documentées)
···
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mobile : menu déroulant animé + sélecteur de consentement témoins + page confidentialité
···
- Header : hamburger animé (-> X), panneau déroulant avec liens en cascade (Logements, Carte, Stats, Sources, Confidentialité), backdrop flouté, verrouillage du défilement, fermeture à la navigation - CookieConsent : bandeau au premier chargement (aucun témoin tiers — honnête), 3 choix (tout accepter / essentiels / personnaliser avec cases préférences et statistiques), mémorisé en localStorage, ré-ouvrable depuis le pied de page et la page confidentialité - /confidentialite : politique de confidentialité et de témoins - Vue carte synchronisée avec l'URL (?view=carte depuis le menu) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
POI : stratégie par tuiles Overpass (11 requêtes pour 1249 immeubles, 4 min)
···
L'union d'around() par immeuble était intenable (~13 s/immeuble, throttling). On télécharge tous les POI des catégories par tuile de 0,5° (marge 4 km), puis calcul local du plus proche par catégorie (préfiltre rectangulaire + haversine). Miroir kumi.systems avec rotation vers l'instance officielle. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Commodités de proximité par immeuble (Overpass/OSM) sur chaque fiche
···
- louka/poi.py : une requête Overpass par immeuble (13 catégories : épicerie, dépanneur, pharmacie, école, garderie, parc, bus, métro, gym, café, clinique, hôpital, bibliothèque), plus proche par catégorie avec distance, cache permanent par coordonnées arrondies (~11 m), politesse 1 req/s, rafraîchissement aux 3 mois - run.py poi [n] + intégration à la boucle watch (80 nouveaux immeubles/cycle) - /api/listings/{uid} : champ poi[] joint depuis le cache - fiche : section « À proximité » (icône, nom réel, distance formatée), mention données OpenStreetMap Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> -
gitignore : brouillons de correspondance
···
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Sécurité : caviardage des clés API tierces dans les fixtures de test
···
Les pages HTML archivées des sites sources contenaient leurs clés Google Maps (publiques par nature côté client, mais republiées inutilement sur GitHub). Toutes caviardées ; l'enregistreur les caviarde désormais automatiquement. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mission 3 (suite) — 13 nouveaux connecteurs Québec/Lévis (+747 annonces)
···
somex_saintnicolas (145) · quartier_sila (200) · edifia (184 : Le Vital, Capella, Cardinal N/S) · aula (69) · girescom (38) · mercini (35) · quartier_mosaique (24) · la_cour (20) · louis14 (18, prix réels via widget Livya jamais affichés sur leur site) · immeubles_guillot (7) · sig (4 résidences étudiantes UL) · promenade_des_forts (2) · centurion (Quartier QB, 684 unités — 'No Vacancy' actuellement, se peuplera automatiquement). Découverte transverse : 4 sites (Somex, Sila, Louis XIV, Le Vital) utilisent le module Livya (ex-RealVuu) dont le flux RSC Next.js rendu serveur expose l'inventaire JSON complet. La Cour + AULA partagent le parseur do-selecteur (REST wp-json), déjà éprouvé chez Immostar. Registre : 88 sources, 82 connecteurs. 191 tests verts. Couverture GPS : 95,6 % global · 97,5 % des annonces avec adresse. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Géocodage : User-Agent ASCII (le serveur ArcGIS d'Adresses Québec 500 sur les accents)
···
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Géocodage : repli Adresses Québec (MERN) + nettoyage « bureau »/« (Québec) »
···
Les rues trop récentes pour OpenStreetMap (Courchevel, L'Amont, Étienne- Dallaire — développements neufs de Lévis) sont résolues par le géocodeur officiel du gouvernement (ArcGIS findAddressCandidates, seuil de score 75). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-