SPB Git

spb/lou-ka

Public

Lou·Ka — tous les logements à louer du Québec, un seul endroit.

page 1
  1. Sun, Aug 9, 2026 9

    1. 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>
      Simon-Pierre Boucher · 82 files +12,412 −1
    2. 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>
      Simon-Pierre Boucher · 349 files +432,335
    3. 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>
      Simon-Pierre Boucher · 6 files +706 −311
    4. 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>
      Simon-Pierre Boucher · 160 files +92,105
    5. 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>
      Simon-Pierre Boucher · 6 files +778
    6. 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>
      Simon-Pierre Boucher · 259 files +255,406
    7. 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>
      Simon-Pierre Boucher · 265 files +325,255
    8. Expansion P2 — Chaudière-Appalaches (le_baronet, girs, +11 annonces)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 35 files +24,826
    9. 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>
      Simon-Pierre Boucher · 937 files +738,569 −561
  2. Sat, Aug 8, 2026 30

    1. 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>
      Simon-Pierre Boucher · 2 files +8 −3
    2. Simon-Pierre Boucher · 3 files +25 −3
    3. 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>
      Simon-Pierre Boucher · 6 files +611
    4. 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>
      Simon-Pierre Boucher · 3 files +61 −1
    5. 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>
      simon-pierre boucher · 4 files +163 −2
    6. 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>
      simon-pierre boucher · 3 files +1,424
    7. 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>
      simon-pierre boucher · 7 files +504 −142
    8. 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>
      simon-pierre boucher · 9 files +1,657
    9. 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>
      simon-pierre boucher · 10 files +495
    10. Recherche : enrichissements de quartier à la Centris (26 sources documentées)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 1 file +209
    11. 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>
      simon-pierre boucher · 5 files +333 −2
    12. 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>
      simon-pierre boucher · 1 file +107 −38
    13. 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>
      simon-pierre boucher · 8 files +277 −3
    14. gitignore : brouillons de correspondance
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 1 file +1
    15. 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>
      simon-pierre boucher · 1,330 files +1,616 −1,600
    16. 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>
      simon-pierre boucher · 260 files +164,397 −3
    17. 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>
      simon-pierre boucher · 1 file +3 −1
    18. 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>
      simon-pierre boucher · 1 file +46 −1
    19. 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>
      simon-pierre boucher · 1 file +36 −10
    20. 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>
      simon-pierre boucher · 12 files +819 −8
    21. Mission 3 — recensement des gestionnaires manquants (13 candidats, top 10 priorisé)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 1 file +130
    22. Rapport d'audit global (68 connecteurs) + badges README à jour
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 2 files +77 −3
    23. 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>
      simon-pierre boucher · 310 files +503,775 −148
    24. 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>
      simon-pierre boucher · 389 files +570,255 −49
    25. 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>
      simon-pierre boucher · 317 files +387,286 −137
    26. 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>
      simon-pierre boucher · 1,415 files +1,405,975 −2,920
    27. 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>
      simon-pierre boucher · 240 files +330,294 −80
    28. 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>
      simon-pierre boucher · 360 files +575,469 −167
    29. simon-pierre boucher · 2 files +94 −6
    30. 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>
      simon-pierre boucher · 68 files +166,027 −94
  3. Thu, Aug 6, 2026 1

    1. 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>
      Simon-Pierre Boucher · 7 files +479 −7
Menu

Theme