Lou·Ka — tous les logements à louer du Québec, un seul endroit.
HTML 98.9%
Python 0.6%
-
Sat, Aug 8, 2026 30
-
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>
-
Géocodage : requêtes Nominatim structurées (street/city/state) + repli centroïde de rue
…
La recherche libre confondait « Québec » ville/province (141 rue Saint-Paul -> Repentigny, rejeté par la bbox). Stratégies en cascade : structurée civique+rue, libre complète, rue seule. Double civique « 6275 et 6375 » géré. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mission 4 — géocodage Nominatim + carte interactive MapLibre GL
…
Géocodage (louka/geocode.py) : - Nominatim 1 req/s, User-Agent identifié, cache SQLite par immeuble (adresse normalisée sans n° d'unité) — une adresse n'est géocodée qu'une fois - nettoyages QC : préfixe d'unité « 101-2905 », « Montréal - Laval », cardinales abrégées ; repli civique+rue en 2e tentative - validation bounding-box (Québec/Lévis resserrée, garde-fou provincial), flag geocode_failed, ré-essai des échecs après 30 jours - intégré à la boucle watch (nouvelles adresses géocodées à chaque sync) - finalize() rejette aussi les coordonnées invalides fournies par les sources (annonce de Limoilou qui pointait au Kazakhstan) Carte (frontend) : - /api/listings.geojson : GeoJSON filtré (mêmes filtres que /api/listings) - MapView MapLibre GL : chargement paresseux (254 ko gzip hors du bundle principal), clustering natif, marqueurs-prix, popup fiche (photo, prix, type, dispo, gestionnaire, lien), synchro avec les filtres, fitBounds - bascule Liste/Carte : côte à côte sur desktop, plein écran sur mobile - tuiles vectorielles OpenFreeMap (positron), style Lou-Ka (encre + lime) - worker MapLibre v6 copié par plugin Vite (imports relatifs préservés) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mission 3 — recensement des gestionnaires manquants (13 candidats, top 10 priorisé)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Rapport d'audit global (68 connecteurs) + badges README à jour
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mission 1b (lot 8) — logisbourg, logisco, logisma, lokalia, lynk_olymbec
…
- lokalia : +12 annonces (variantes « + DEN » dédupliquées à tort), GPS 100 % - logisco : adresse complète JSON-LD, superficie/étage structurés, 4 sections de commodités, pages unité en cache - lynk_olymbec : valeurs semi-inventées supprimées, prix/dispo réels RentCafe - normalize.py : non-chauffé avec trait d'union, branchements combinés, « refusés sauf un chat » -> conditions, « (sans utilisation) » neutralisé, fourchettes « de X $ à Y $ » = prix plancher Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mission 1b (lot 5) — gestipro, gimcote, gparadis, groupe_dallaire, hazelview
…
- groupe_dallaire : superficie 49 % -> 100 %, inclusions réelles par unité, fiches en cache (180 requêtes/sync évitées) - gestipro : GPS 100 %, animaux 92 %, inclusions depuis « Frais et charge » - gimcote : description/animaux/meublé 100 %, GPS 100 % - gparadis : +1 immeuble Saint-Roch (regex pluriels) - normalize.py : « à la charge des locataires » -> non inclus, « actuellement vacant » -> disponible maintenant Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mission 1b (lot 6) — headway, huma, immomarketing, immostar, interrent
…
- interrent : bug amenities (champ inexistant) corrigé, animaux 0 -> 203 - immostar : commodités 0 -> 100 % sur les 6 micro-sites, superficie 100 % - huma : dates de dispo réelles par unité, adresses et GPS par phase - immomarketing : GPS 100 %, cache detail, animaux 53/82 - normalize.py : animal au singulier, promos neutralisées, prix stationnement complet (formats 150 $ et $85) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mission 1b (lots 4,7,9-13) + mission 2 — 37 connecteurs mis à niveau, Logis-Experts activé
…
Nouveau connecteur logis_experts (logis-experts.com, API JSON) : 516 annonces, 188 immeubles, prix/adresse/code postal/secteur/lat-lng à 100 %, superficie et commodités via pages détail en cache. Faits saillants de l'audit : - lakle : +20 unités (phases 2-3 ignorées), superficie terrasse->habitable - dma_locago : +11 unités Tour Frontenac, correction des disponibilités - equinoxe_batimo : adresses 0 % -> 100 % (602 annonces) - sgiq : lat/lng 88 %, animaux 100 %, sync 83 s -> 4 s - msi/picard/progim/capreit… : pages détail migrées vers le cache BD - utile : statut hero corrigé (2 annonces faussement « Complet ») - per : « Animaux permis : Non » inversé corrigé normalize.py : ~20 nouveaux cas génériques remontés par les agents (dates anglaises mois-jour, animaux singulier/poids/interdits, aires communes, piscine/stationnement « chauffé », balcon négatif, vélo, « ($) », semi-meublé, superficies balcon/terrasse ignorées, milliers avec virgule, hydro/heat/terrace anglais, nombres en toutes lettres) — chaque cas couvert par un test. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mission 1b (lot 1) — akelius, app_urbains, axia, beaudoin, boardwalk, bribourg
…
- akelius : JSON détail découvert (pets 221/247, meublé, inclusions, photos HD) - boardwalk : superficie 100 %, dispo réelle, sync 210 s -> 54 s (cache detail) - beaudoin : commodités 100 % (additional_features), superficie 67 % - app_urbains : superficie 100 %, adresse Le Charlie corrigée - normalize.py : « chiens et chats acceptés » -> oui (priorité sur conditions) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mission 1b (lots 2-3) — audit et mise à niveau de 10 connecteurs + correctifs normalisation
…
Connecteurs : brio, brivia_1sp, brochu, capreit, cogir, contraste, copley, cromwell, denux, devimco — fixtures + tests + rapports d'audit. Faits saillants : - cogir : collision d'uid corrigée (283 annonces au lieu de 270), annonces fantômes « liste d'attente » exclues - capreit : lat/lng 100 %, fiches derrière cache detail (sync 75 s -> 0,4 s) - devimco : adresses 84 % -> 100 %, superficie structurée - contraste : commodités 0 % -> 100 %, faux « 0 $/mois » supprimés - brivia_1sp : API AJAX des plans découverte (dispo réelle, superficies) normalize.py : négations chauffage/éclairage, « chiens non permis » -> pets conditions, options payantes neutralisées (optionnel/en sus), stationnement mixte int+ext, étage restreint aux commodités, refrigerator/cooling anglais. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Fiche logement : disponibilité normalisée, superficie, animaux, étage, badges structurés
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mission 1a — couche commune : schéma enrichi, normalisation centrale, robustesse, tests
…
- schema.Listing : availability_date (ISO/now), area_sqft, pets, furnished, details (JSON structuré) + finalize() appliqué à toutes les sources - normalize.py : dates FR/EN → ISO, superficies pi²/m², prix robuste, types d'unité (chambres→½, 6½+, MDV…), commodités → tags canoniques, stationnement/animaux/fumeur/contact extraits du texte - db.py : migration auto, délai de grâce (2 syncs) avant désactivation, détection de dérive (volume + taux de prix null) avec retraits suspendus, cache des pages détail, cache de géocodage (préparé pour la carte) - fixtures.py + run.py record : enregistrement/rejeu des réponses HTTP, tests de régression pytest par connecteur (snapshot + validité schéma) - web.py : nouveaux filtres pets/furnished/available_by/area_min Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Thu, Aug 6, 2026 2
-
Page Statistiques + extension Grand Montréal (68 connecteurs)
…
- Page /stats : tuiles héro (total, loyer médian/moyen, villes, gestionnaires), histogramme des loyers (classes de 200$), répartitions par taille, ville et gestionnaire — barres mono-série encre verte, infobulles, étiquettes directes, vue tableau par graphique, catégories cliquables vers les logements filtrés - 38 connecteurs Grand Montréal (REITs, promoteurs, gestionnaires) + extension de 5 connecteurs existants; registre à 74 sources - Filtres de l'accueil pré-remplis depuis l'URL - Optimisation smartphone : bottom sheet de filtres, FAB, safe-areas, anti-zoom iOS Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Lou-Ka — agrégateur de logements à louer (Québec, Lévis, Grand Montréal)
…
Plateforme complète : 68 connecteurs de gestionnaires immobiliers, schéma standardisé avec détection de changements (hash), API FastAPI, frontend React/Vite PWA (design éditorial sharp, thème clair), déployée sur www.lou-ka.com avec resynchronisation horaire. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-