Lou·Ka — tous les logements à louer du Québec, un seul endroit.
- 264commits
- 1branches
- 0releases
- 180.7 MBon disk
- maindefault branch
- 5 days agolast push
-
Thu, Aug 13, 2026 9
-
Lou-Ka Maps — carte propulsée par Ka Maps (framework Groupe Ka, moteur Mapbox 3D)
…
Frontend : MapView réécrit sur @groupe-ka/ka-maps (file:../../ka-maps) — style Mapbox Standard 3D par défaut + bouton 2D, pastilles de prix encre/ blanc, grappes compte + loyer moyen (clamp anti-prix aberrants), « Rechercher dans cette zone », aperçu React (fin du popup HTML injecté), sync liste↔carte (sélection + survol), caméra dans l'URL, badge Lou-Ka Maps · Groupe Ka, jeton public Mapbox (kamaps/config.ts). Recherche debouncée (fin des requêtes à chaque frappe). Backend : /api/listings.geojson accepte bbox + limit et renvoie totalGeocoded/totalMatching ; index idx_listings_geo(lat,lng) ; PRAGMA optimize au cycle d'ingestion (le planificateur choisissait le mauvais index). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
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, 2026 1
-
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, 2026 1
-
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, 2026 13
-
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, 2026 16
-
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>
-