SPB Git forge

spb/lou-ka

Public

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

232commits 1branches 0releases
172.9 MBsize
maindefault branch
2 days agolast push
HTML 98.9% Python 0.6%

page 3

  1. Tue, Aug 25, 2026 11

    1. Court terme : upgrade majeur — 21 nouveaux connecteurs, 12 enrichis, fiches améliorées
      …
      - 21 nouveaux connecteurs (chaleto, hébergement-charlevoix, chaletsalpins,
        memoria, pourvoiries FPQ, campingquebec, hebergia, rezerve, accestremblant,
        chaletsdanslenord, alouerauxiles, rvmt, boraboreal, homminichalets…)
      - enrichissement des existants : airbnb (desc/capacité/commodités via PDP),
        booking/vrbo/expedia (Apollo SSR, bug slug vrbo corrigé), sepaq (desc+géo),
        tremblantliving (prix API Streamline), qldc/kijiji/parcscanada/bonjourquebec/
        gitespassant ; sinistar : prix vérifiés inaccessibles (documenté)
      - fiches CT : /api/ct/listings/{uid}/context (analyse prix/nuit par segment,
        histogramme, centile) + badge marché + hébergements similaires à proximité
      - registre sources_ct.json : 52 sources (7 mortes retirées, 21 ajoutées)
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 41 files +5,841 −109
    2. Court terme : retrait des 7 connecteurs squelettes jamais productifs (sources mortes ou hors Québec)
      …
      Suppression des stubs disabled=True et de leurs entrées dans sources_ct.json,
      verdicts revérifiés en live le 2026-08-25 :
      - chaletsquebec : domaine sans DNS (SERVFAIL)
      - locationschalets : 301 → km42.ca (1 exploitant, 2 chalets, 0 prix)
      - hebergementquebec : 302 → citq.qc.ca (aucun répertoire scrapable)
      - chaletsdirect : chalets de ski européens, zéro inventaire QC
      - blueground : aucun marché québécois (sitemap = tor seul, page Montréal 404)
      - tripadvisor : produit locations fermé nov. 2024 (VacationRentals-g155033 → 301 Hotels, confirmé Scrapfly)
      - sonder : liquidation nov. 2025, sonder.com = affilié Booking (403 même via Scrapfly ASP)
      
      Aucune rangée de ces sources dans les bases ; registre auto-découvrant intact (22 connecteurs actifs).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 8 files −196
    3. Nav v2 correctif : le ✕ de fermeture vit DANS le panneau (fixe, toujours visible)
      …
      Le ✕ était le burger du header ; si le header n'est pas épinglé (bas de page),
      il défilait hors écran alors que le panneau fixed restait affiché — impossible
      de fermer sans Escape. Ajout d'un .mm-close position:fixed en haut à droite du
      panneau et burger masqué à l'ouverture (une seule commande de fermeture).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +13 −2
    4. Nav mobile v2 : le dropdown 480px devient un panneau plein écran fixed
      …
      Standard KA 2026-08-25 : .mobile-menu passe de position:absolute top:100%
      (max-height 480px) à position:fixed inset:0 — menu visible peu importe la
      position de scroll. Rang du header (marque + burger→✕) maintenu au-dessus du
      panneau, verrou de scroll CSS pur via html:has(.mobile-menu.open).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +13 −10
    5. Overpass : miroirs de repli maps.mail.ru et openstreetmap.fr (poi, env, commerces)
      …
      Panne simultanée de kumi.systems (502) et overpass-api.de (connexion refusée)
      le 2026-08-25 : POI et tuiles environnement bloqués. Ajout de deux miroirs
      vérifiés couvrant le Québec ; overpass.osm.ch écarté (extrait suisse
      uniquement). environment.py hérite de la liste de poi.py.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +7 −1
    6. managers: tolérer `type` en liste dans les fiches SerpApi (multi-catégories)
      …
      Le champ `type` des local_results Google Maps arrive maintenant parfois en
      liste, ce qui cassait la résolution (`TypeError` dans _score_candidate et le
      tri des candidats). Normalisé en chaîne dès la réception des candidats.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +4
    7. Campagne connecteurs province 2026-08-24 : 149 nouveaux connecteurs (+3 685 annonces)
      …
      Création massive issue de la recherche province (reports/expansion/
      recherche-province-2026-08-24.md), en 17 lots parallèles :
      - 149 connecteurs actifs (Building Stack, RentCafe/Yardi, Rentsync/
        LiftSystem, Planpoint, Livya, silo.immo, Webflow, Wix SSR, WordPress
        admin-ajax/wp-json/SSR, PDF+pdfplumber, OCR tesseract, Google Sheets CSV)
      - helpers partagés _planpoint.py et _livya.py
      - 9 sources documentées non connectables (doublons Cogir, vitrines sans
        inventaire, OMHQ annuaire, Skyline 0 propriété QC)
      - registre data/sources.json : 281 → 439 sources
      - fix groupe_mathieu : découverte via /condos-locatifs/ (le méga-menu Jet
        n'est servi que par certaines variantes de cache Elementor)
      - pdfplumber ajouté aux dépendances ; doc régénérée (367 fiches)
      
      Syncs initiaux : 3 685 annonces ajoutées.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 678 files +37,920 −1,538
    8. Recherche connecteurs province (2026-08-24) : 111 nouveaux sites vérifiés + 61 écarts doc→connecteurs
      …
      7 recherches parallèles (~330 requêtes Serper/Tavily, validation curl/Scrapfly).
      Top cibles : Mostra/Cogir, Résidences Cogir (RPA), Chartwell, Summit (LiftSystem),
      NexLiving (RentCafe), Trouve-Ton-Appart (229 fiches), Morguard, Org. Dupuis (Building Stack).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +93
  2. Mon, Aug 24, 2026 20

    1. Simon-Pierre Boucher committed 1 mo ago · 1 file +10
    2. Stats : panneaux « enrichissements de la fiche » (KA Scores, juste valeur, historique des prix, court terme, gestionnaires, annuaire déménageurs)
      …
      - louka/statsfiche.py : 7 panneaux calculés sur les données réelles des fiches
        (couverture des enrichissements + couches branchées, KA Scores par pilier et
        par ville, verdicts de juste valeur + écarts, baisses/hausses de loyer +
        événements de vie, court terme CITQ/notes/prix par région, réputation des
        gestionnaires — masqué tant que <10 fiches notées, annuaire déménageurs)
      - statsdash.py : fusion statsfiche.panels() + statsextra.panels()
      - rendu 100 % générique par le kit stats existant (aucun changement frontend)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +485 −2
    3. Annuaire des déménageurs du Québec : page /demenageurs (565 entreprises, 17 régions)
      …
      - data/demenageurs.json : dataset canonique (balayage Google Places via Serper,
        188 villes, dédoublonnage CID/téléphone) — partagé avec Immo-Ka
      - louka/demenageurs.py : API /api/demenageurs (filtres région + texte)
      - frontend : page Demenageurs.tsx (recherche, filtre par région, tel:/site web),
        liens nav + menu mobile + prefooter
      - seo.py : SSR /demenageurs (liste complète par région, JSON-LD MovingCompany
        ItemList) + entrée sitemap-pages
      - scripts/build_demenageurs.py : régénération du dataset
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 7 files +9,093
    4. feat(fiche): dossier d'intelligence locative — passe sharp desktop/mobile + PDF complet
      …
      CSS : pastilles de statut affûtées, score hiver et note Google en tuiles
      à ombre dure, timeline encre, media queries 640px (tableau coût réel,
      dates empilées, barres d'avis compactes). PDF fiche : cinq nouvelles
      sections fidèles au web — coût réel ligne par ligne (statuts étiquetés),
      historique Lou-Ka + vies antérieures, passeport de l'immeuble (tuiles
      KPI, rotation, pression), gestionnaire (note Google, distribution des
      avis, plaintes, confiance d'association), score hiver.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +375 −9
    5. feat(fiche): styles du dossier d'intelligence locative — coût réel, historique, immeuble, gestionnaire, hiver
      …
      Complète les snapshots ka2 (backend 8efd8cb + composants 0ee1a2d) : pastilles
      de statut de donnée (observé/estimé/inconnu), tableau du coût réel, timeline
      Lou-Ka, distribution des avis Google, score hiver.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +166
    6. Simon-Pierre Boucher committed 1 mo ago · 7 files +670
    7. Simon-Pierre Boucher committed 1 mo ago · 12 files +1,697 −1
    8. feat(pdf): fiche PDF complète — analyse de prix, registre, TAL, environnement, KA Scores
      …
      Le PDF de fiche reflète désormais tout le contenu de la fiche web :
      analyse de prix Lou-Ka (juste valeur, verdict, histogramme), registre
      des loyers (KPI + tableau), historique TAL, inondation, qualité de
      l'air, électricité, commerces/transport, essence, KA Scores et
      quartier, avec pagination dynamique multi-pages. Les photos sont
      redimensionnées (max 1200 px, JPEG q82) : le PDF passe de 30 Mo à
      ~400 Ko sur une annonce enrichie.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +468 −39
    9. feat(design): passe « éditorial sharp » sur la fiche — cartes, KPI, tableaux, pastilles
      …
      Blocs de la fiche transformés en cartes encre (bordure 1,5 px + ombre décalée
      douce), titres de section à marqueur accent + filet, tuiles KPI blanches à
      ombre dure, tableaux zébrés avec survol accent, barres de proximité/crime/air
      en dégradé, pastilles d'état unifiées (mono, point, liseré), décisions TAL en
      mini-cartes. Vérifié Playwright desktop 1440 + mobile 390 (overflow 0,
      check-order OK).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +111
    10. feat(tal): historique du Tribunal administratif du logement par adresse
      …
      Décisions publiques du TAL (diffusées par SOQUIJ) croisées avec l'adresse
      de chaque annonce : recherche « no civique + rue » via Scrapfly (le site
      exige rendu JS + IP résidentielle ; pas de phrases entre guillemets),
      puis vérification de l'adresse exacte dans le texte intégral et
      classification (non-paiement, résiliation, expulsion, reprise/éviction,
      insalubrité…, demande du locateur vs du locataire, verdict). Cache par
      adresse dans data/tal.db, backfill borné dans la boucle watch + file
      prioritaire alimentée par les fiches consultées (/api/tal), bloc
      « Historique au TAL » sur la fiche (aucun nom de partie affiché —
      référence neutre + lien SOQUIJ).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 9 files +616
    11. Simon-Pierre Boucher committed 1 mo ago · 1 file +144 −60
    12. Simon-Pierre Boucher committed 1 mo ago · 1 file +123 −38
    13. feat(doc): page documentation /doc (guide + captures) + lien footer + PDF téléchargeable
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 8 files +171 −1
    14. Simon-Pierre Boucher committed 1 mo ago · 3 files +90 −191
    15. Simon-Pierre Boucher committed 1 mo ago · 1 file +16 −7
    16. Stats : panneaux territoire (registre des loyers, population, essence)
      …
      - louka/statsextra.py : 3 panneaux calculés sur nos jeux ouverts (cache 30 min)
        · Registre des loyers : 57 k loyers déclarés — KPI, médiane par nb chambres,
          histogramme, top 15 villes
        · Population & territoire : recensement des aires de diffusion couvertes
          (population, revenu médian, % locataires, âge, défavorisation) via
          listings.dauid
        · Prix de l essence : ~2450 stations gazquebec.ca — médianes régulier/super/
          diesel, barres et tableau par région
      - dashboard : clé panels ; Stats.tsx : rendu groupé et titré réutilisant le kit
        (KpiCard/Donut/BarChart/Histogram/DataTable)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +376
    17. hydro : postal rooftop (géocodage avant Mapbox + proximity), cache négatif, fix civiques ordinaux
      …
      - _resolve_postal : géocodage AVANT de l adresse complète ancré par proximity
        lat/lng (CP rooftop précis, vérif du numéro civique) au lieu de l inverse
        du lat/lng approximatif — récupère des adresses qui échouaient (ex.
        2038 Charlemagne : 0 -> 618 $/an)
      - cache négatif (NEG_TTL 30 j) : les adresses inconnues d HQ ne re-consomment
        plus de captcha à chaque cycle watch
      - _civic rejette les rues ordinales (15e Avenue, 1re Avenue, 2e Rang) tout en
        gardant la lettre d appartement (2457A)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +79 −13
  3. Sun, Aug 23, 2026 9

    1. hydro : cache par uid + dérivation du code postal via lat/lng (Mapbox)
      …
      - cache indexé aussi par uid (clé stable annonce) : affichage cache-only sur
        la fiche sans code postal ni appel Mapbox
      - code postal dérivé du lat/lng par géocodage inverse Mapbox quand l adresse
        n en porte pas (cas Immo-Ka) — au moment du calcul seulement
      - estimate(uid, lat, lng) ; endpoint et fiche passent uid+lat+lng ;
        cache-only renvoie en_attente (bouton) si un calcul est faisable
      - precompute sélectionne lat/lng/uid, saute ce qui est déjà en cache par uid
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 5 files +128 −37
    2. hydro : pré-calcul des 100 annonces récentes + auto pour les nouvelles
      …
      - hydro.precompute(limit, budget) : calcule l estimation des annonces les plus
        récentes non encore en cache, plafond de résolutions captcha par appel
        (coût borné) ; run.py hydro-precompute [N] [budget]
      - watch : precompute(100, budget=30) à chaque cycle -> nouvelles annonces
        estimées automatiquement ; le cache data/hydro.db persiste entre releases
      - estimate(solve=False) = lecture cache seule (aucun captcha) ;
        GET /api/hydro cache-only par défaut, solve=1 pour forcer
      - fiche : le bloc s affiche AUTOMATIQUEMENT quand l estimation est en cache,
        sinon bouton de calcul à la demande
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 6 files +112 −26
    3. hydro : flux live fonctionnel (2captcha) — structure API réelle
      …
      - lieu-consommation : clé listeLieuxConsommation + cleUnique au niveau racine,
        code postal reformaté avec espace (exigé), idConso = item.id
      - estimation : {cleUnique, idConso} -> montantAnnuel + consommationAnnuelle
      - expose kwh_annuel ; testé live : 20 rue Lockwell = 283 $/an / 1100 kWh (12 s),
        2e appel servi du cache
      Activé via HQ_CAPTCHA_KEY (2captcha) dans .env.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +29 −24
    4. Simon-Pierre Boucher committed 1 mo ago · 1 file +1 −3
    5. Fiche : estimation du coût d electricite Hydro-Quebec (a la demande)
      …
      - louka/hydro.py : parcours PUBLIC rétro-conçu de l outil « Estimer les coûts
        d électricité à une résidence » — 2 étapes (lieu-consommation -> estimation)
        sur services-cl.solutions.hydroquebec.com, jeton reCAPTCHA v2 via solveur
        enfichable (2captcha/CapSolver, clé HQ_CAPTCHA_KEY), sortie par proxy
        résidentiel CA (Oxylabs/Bright Data), cache 6 mois data/hydro.db ; sans clé
        captcha -> {disponible:false} et bloc masqué (jamais d estimation inventée)
      - GET /api/hydro?adresse= ; bloc fiche à la demande (bouton, 1 captcha/appel)
        affichant le coût mensuel et annuel estimés
      
      Activation : définir HQ_CAPTCHA_KEY (+ HQ_CAPTCHA_PROVIDER) dans .env.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 7 files +329
    6. Cartes : lignes de métro/REM aux couleurs officielles + transit hors ligne
      …
      - MetroLignes.tsx : couche Ka Maps (useKaMap) qui trace metro-lignes.geojson
        (lignes verte/orange/jaune/bleue + REM, extraites d OSM avec leurs couleurs
        officielles, liseré blanc de lisibilité) sur la carte de recherche, la
        vue carte et la carte 3D de la fiche
      - commerces : transit servi par data/transit.db (extrait OSM pré-calculé,
        37 237 arrêts de bus + 75 stations de métro + 57 REM + 106 gares au
        Québec — les miroirs Overpass refusent l IP du cluster) ; ajoute Station
        REM et Gare de train au bloc Commerces et transport
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 8 files +102 −3
    7. Fiche : bloc Commerces et transport (Mapbox Search Box + cache POI/OSM)
      …
      - louka/commerces.py : point de vente le plus proche de 14 grandes bannières
        (Costco, Walmart, Metro, IGA, Maxi, Super C, Provigo, Canadian Tire,
        Dollarama, SAQ, Pharmaprix, Jean Coutu, Home Depot, RONA) via l API Mapbox
        Search Box (jeton public kamaps, validation du nom retourné, anti
        « Station Métro »), cache par cellule ~1 km TTL 30 j ; station de métro et
        arrêt de bus les plus proches repris du cache POI du projet (repli
        Overpass) ; GET /api/commerces
      - bloc fiche : pastilles SVG monogrammes aux couleurs des bannières,
        nom du point de vente et distance — métro/bus en tête
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 7 files +381
    8. Fiche : qualité de l air (RSQAQ/PST) + essence à proximité (gazquebec.ca)
      …
      - louka/air.py : agrégats annuels par station du RSQAQ (MELCCFP) — horaires
        2024-2025 (PM2.5, NO2, O3, SO2, CO) + séquentielles PST/PM10 (<LD -> LD/2),
        data/air.db minuscule, station la plus proche ≤ 60 km ; bloc fiche avec
        badge global et barres vs repères OMS 2021 / norme RAA (PST 60 µg/m³)
      - louka/gaz.py : copie locale des ~2 450 stations de gazquebec.ca (prix
        Régulier/Super/Diesel, TTL 4 h, auto-refresh au lookup) ; bloc fiche avec
        KPI (stations, médiane du secteur, meilleur prix) et tableau des stations
        les plus proches, la moins chère mise en évidence
      - run.py air-refresh / gaz-refresh, GET /api/air et /api/gaz
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 10 files +577
    9. Quartier : criminalité SPVM détaillée par catégorie (12 mois, tendance)
      …
      _crime_mtl ventile désormais les actes par catégorie (vol dans/sur véhicule,
      introduction, vol de véhicule, méfait, vol qualifié, infractions mortelles) ;
      le bloc quartier affiche des barres par catégorie avec la variation vs les
      12 mois précédents (flèches chiffrées, jamais la couleur seule).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 4 files +64 −11