SPB Git forge

spb/immo-ka

Public

Immo-Ka — agrégateur des propriétés à vendre au Québec (73 connecteurs, ~40 000 annonces, React+FastAPI)

112commits 1branches 0releases
125.4 MBsize
maindefault branch
13 days agolast push
Python 47.5% HTML 27.9% TypeScript 15.5% CSS 7.2% JavaScript 2%

page 2

  1. Mon, Aug 24, 2026 15

    1. Simon-Pierre Boucher committed 1 mo ago · 3 files +16
    2. feat(pdf): fiche PDF complète — prix + verdict Vrai-Prix, photos, description, inclusions, caractéristiques, pièces, jauge Vrai-Prix + rôle foncier, historique de prix, inondation, air, hydro, commerces/transport, essence, quartier, références + QR
      …
      Nouveau immoka/pdffiche.py (reportlab canvas, style « éditorial sharp »,
      pagination dynamique saut_page()/place(), sections conditionnelles _safe,
      photos compressées Pillow 1000px q78) + endpoint GET /api/listings/{uid}/pdf.
      reportlab + qrcode épinglés dans requirements.txt.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +967
    3. feat(design): passe « éditorial sharp » sur la fiche — cartes, KPI, tableaux, pastilles
      …
      Transposition de la passe v3 de lou-ka (872a202) aux sélecteurs immo-ka :
      blocs en cartes encre à ombre décalée (galerie et héros exclus), titres à
      carré accent + filet, tuiles KPI blanches à ombre dure, tableaux zébrés à
      en-têtes mono, barres en dégradé accent, pastilles mono à point d'état,
      mini-cartes à liseré pour les zones d'inondation, pastilles d'inclusions
      alignées. Validé Playwright desktop 1440 + iPhone 14 : zéro débordement,
      ordre DOM = ordre visuel (check-order OK), aucun `order`.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +112
    4. Revert "docs: README v3 — chiffres live vérifiés, pastilles dynamiques, sections complètes"
      …
      This reverts commit 4dd0d6cdd0b5e62fb57e35c9aa28020b38d9adff.
      Simon-Pierre Boucher committed 1 mo ago · 1 file +52 −131
    5. Simon-Pierre Boucher committed 1 mo ago · 1 file +131 −52
    6. Simon-Pierre Boucher committed 1 mo ago · 1 file +1 −1
    7. Simon-Pierre Boucher committed 1 mo ago · 1 file +107 −30
    8. 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 +212 −1
    9. Simon-Pierre Boucher committed 1 mo ago · 3 files +85 −235
    10. hydro : précalcul des estimations Hydro-Québec dans la boucle de sync + commande CLI hydro-precompute
      …
      data/rdl.db (base générée) ajouté au .gitignore.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +11
    11. Stats : panneaux territoire (registre des loyers, population, essence)
      …
      Portage lou-ka : immoka/statsextra.py (3 panneaux, cache 30 min ; filtre actives
      adaptatif — immo-ka n a pas dup_of) ; rdl.db copié sur le nœud ; dashboard clé
      panels ; Stats.tsx rendu groupé réutilisant le kit. Registre des loyers +
      recensement des secteurs (population 7,1 M, revenu, % locataires) + prix essence
      par région.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +386 −1
    12. hydro : postal rooftop (géocodage avant + proximity), cache négatif, fix civiques ordinaux
      …
      Idem lou-ka : _resolve_postal privilégie le géocodage AVANT (CP rooftop précis)
      au lieu de l inverse du lat/lng approximatif ; cache négatif NEG_TTL 30 j pour
      ne pas regaspiller de captcha sur les adresses inconnues d HQ ; _civic rejette
      les rues ordinales en gardant la lettre d appartement.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +79 −13
  2. Sun, Aug 23, 2026 12

    1. hydro : cache par uid + dérivation du code postal via lat/lng (Mapbox)
      …
      Idem lou-ka : les adresses Immo-Ka sans code postal obtiennent leur CP par
      géocodage inverse Mapbox du lat/lng ; cache par uid pour affichage cache-only ;
      precompute + auto sur nouvelles annonces. Testé : 4 adresses MTL estimées.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 5 files +205 −36
    2. hydro : flux live fonctionnel (2captcha) — structure API réelle
      …
      Portage lou-ka : listeLieuxConsommation + cleUnique racine, code postal avec
      espace, montantAnnuel/consommationAnnuelle ; testé live 1573 rue Pierre-Corneille
      = 577 $/an / 4720 kWh. Activé via HQ_CAPTCHA_KEY (2captcha).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +29 −24
    3. Simon-Pierre Boucher committed 1 mo ago · 1 file +1 −3
    4. Fiche : estimation du cout d electricite Hydro-Quebec (a la demande)
      …
      Portage lou-ka : parcours public rétro-conçu (lieu-consommation -> estimation),
      reCAPTCHA v2 via solveur enfichable (HQ_CAPTCHA_KEY), proxy résidentiel CA,
      cache 6 mois ; bloc fiche à la demande, masqué si non configuré.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 7 files +327
    5. Fiche et cartes : commerces/transport + lignes de métro-REM colorées
      …
      Portage lou-ka : bloc Commerces et transport (14 bannières via Mapbox Search
      Box, pastilles SVG monogrammes ; métro/REM/bus/gare via data/transit.db,
      extrait OSM pré-calculé) + couche MetroLignes (tracés du métro de Montréal
      et du REM aux couleurs officielles) sur les cartes.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 11 files +478
    6. Fiche : qualité de l air (RSQAQ/PST) + essence à proximité (gazquebec.ca)
      …
      Portage des modules lou-ka : agrégats annuels RSQAQ (PM2.5/NO2/O3/SO2 +
      PST/PM10 séquentielles) avec station la plus proche et repères OMS/RAA ;
      stations-service gazquebec.ca (TTL 4 h) avec médiane du secteur et meilleur
      prix. GET /api/air, /api/gaz, run.py air-refresh / gaz-refresh.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 10 files +599
    7. Risque d inondation (BDZI) + criminalité SPVM détaillée par catégorie
      …
      - immoka/inondation.py : lookup point-dans-polygone sur la base BDZI locale
        (25 k polygones + R*Tree, copiée de lou-ka), run.py inondation-build,
        GET /api/inondation, bloc fiche avec badge de sévérité (grand courant
        0-20 ans / faible courant 20-100 ans) et couverture cartographique
      - quartier : _crime_mtl ventile les actes SPVM par catégorie ; barres par
        catégorie avec variation 12 mois vs 12 précédents dans le bloc quartier
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 10 files +358 −11
    8. [ka2] fix connecteur kw_distinction : cert TLS expiré + recherche en 500 → verify=False + repli pages courtiers
      …
      Double panne côté kwdistinction.com le 2026-08-23 : (1) cert Let's Encrypt
      expiré à 12:02 UTC → SSLError sur toute requête directe (l'escalade payante
      finissait sur un 200 vide de Bright Data, d'où found=0 « propre ») ;
      (2) la recherche globale /Pages/Listings/Default.aspx répond 500 après 30 s
      (redirect /Pages/500/) alors que fiches détail et pages courtier fonctionnent.
      
      Correctifs : session en verify=False (commenté/daté), et si la recherche
      paginée donne 0 carte, repli sur l'annuaire des courtiers (25 pages courtier,
      même markup listing_bloc, pagination PageID par courtier) ; fin de pagination
      détectée sur les ids vus dans le parcours courant pour ne pas être stoppée
      par les co-inscriptions d'un confrère. Volume mesuré : 0 → 197 (médiane 200),
      146 avec prix (~144 historique), 100 % photos/adresses.
      Simon-Pierre Boucher committed 1 mo ago · 2 files +67 −12
    9. Simon-Pierre Boucher committed 1 mo ago · 4 files +717 −12
    10. widget KA Agent : balise analytics première partie (admin-ka /collect)
      …
      Bloc KA_ANALYTICS ajouté en fin de ka-agent.js par le déploiement du
      tableau de bord admin-ka : identifiant visiteur anonyme (localStorage
      KA_VID) + battement par minute vers administration-ka.com/collect
      (site, vid, chemin). Commité a posteriori — état déployé en prod.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +2
    11. stats: paramètre syncs_since_h pour la fenêtre de synchronisations
      …
      GET /api/stats?syncs_since_h=<heures> retourne toutes les entrées de
      sync_log de la fenêtre (ts >= now - h*3600, ORDER BY ts DESC, LIMIT 4000)
      au lieu des 20 dernières seulement. Si moins de 20 entrées correspondent,
      repli sur les 20 dernières toutes époques confondues ; sans le paramètre,
      comportement historique inchangé.
      
      Corrige les fausses alertes « stale » du moniteur central api-ka : avec
      109 sources et ~140 syncs/6 h, la fenêtre de 20 entrées polée aux 2 h ne
      montrait qu\une fraction des sources (realtor_ag_ca notamment, pourtant
      en succès à chaque cycle, ~2 145 fiches).
      
      Diagnostic connexe (aucun code à changer) : niddamour synchronise
      correctement — l\inventaire source.immo de l\agence ne contient que des
      locations (14 AVAILABLE à louer, 6 SOLD), zéro propriété à vendre, donc
      found=0 est légitime.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +15 −3
    12. connecteurs : fb_marketplace (acteur Apify ka-fb-immo), PMML, Stuart, Duque Simms + registre
      …
      - fb_marketplace : acteur maison gorgeous_thistle/ka-fb-immo (scraping public
        déconnecté, proxy Oxylabs CA), re-vérification tournante des actives,
        throttle 3 h par replay BD — 762 fiches, 597 publiées au premier run
      - pmml : API JSON interne /api/proprietes/avendre (485 en vente, 388 publiées,
        GPS + courtier) — plus grande agence commerciale/multi indépendante du QC
      - stuart : plateforme Ma Clé, JSON-LD mc:* très riche — 54/54 publiées
      - duquesimms : sitemap + JSON-LD proprius/e-mmobilier, GPS — 18/18 publiées
      - tremblantrealestate.ca écrit puis RETIRÉ : 159/159 fiches déjà couvertes
        première main par domicilia (documenté au registre pour ne pas refaire)
      - sources.json : +8 entrées (3 actives, MTRE inactif documenté, 4 prospects
        a_faire : vistoo, deakin, versants, annuaire RCIIQ) ; docs régénérées
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 72 files +2,101 −602
  3. Sat, Aug 22, 2026 4

    1. Simon-Pierre Boucher committed 1 mo ago · 2 files +8 −6
    2. Simon-Pierre Boucher committed 1 mo ago · 1 file +1 −1
    3. connecteurs: chaine de fetch anti-bot resiliente (Oxylabs->Scrapfly->Bright Data)
      …
      Auto-escalade de BaseConnector.get() sur blocage (403/429/503/challenge CF)
      ou coupure reseau, via connectors/_resilient.py. Cles lues de l env avec repli
      sur ~/.claude/.env (accepte SCRAPFLY_KEY et SCRAPFLY_API_KEY). Reponse
      compatible requests.Response; coupe-circuit par hote. Aucun connecteur modifie.
      
      Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +386
  4. Wed, Aug 19, 2026 8

    1. refactor(fiche): ordre des sections = ordre du DOM sur tous les breakpoints
      …
      Standard Groupe Ka « Ordre des sections — pages détail » (même correctif
      que Lou-Ka a6e30ef) : plus de réordonnancement via order:/display:contents
      — un bloc ajouté sans order retombait à order:0 et passait devant la
      galerie sur mobile.
      
      - Listing.tsx : hero (prix/specs/Vrai-Prix/courtier/CTA) déplacé sous la
        galerie dans la colonne principale ; inclusions + carte forment la
        colonne droite (sticky) sur desktop
      - styles.css : suppression des order:/display:contents, colonnes empilées
        en flux naturel sur mobile
      - scripts/check-order.mjs : validation Playwright de l ordre visuel
      
      Validé iPhone 14 + desktop 1440px sur 2 fiches.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +121 −76
    2. Simon-Pierre Boucher committed 1 mo ago · 2 files +5 −2
    3. Stats v2 : /stats ultra complet + 5 rapports PDF (module commun Groupe KA v2)
      …
      Contenu livré dans 9646167 (commit concurrent 'KA Agent v2' qui a englobé
      ces fichiers via git add -A) — ce commit documente le périmètre Stats :
      - immoka/kapdf.py + frontend/src/ka/stats/{kacharts.tsx,kapdf.py,SPEC.md} :
        remplacés par les canoniques ka-ui v2 (KPI+sparklines, jauges, multi-
        courbes, empilées, histogrammes, heatmap 7x24, PdfButton 5 rapports)
      - immoka/stats.py : dashboard enrichi — sparklines KPI, 5 jauges (geoloc,
        photos, Vrai-Prix, hors quarantaine, complétude), série prix médian des
        nouvelles (aire), 2 multi-séries (par type, par grande ville), empilé
        nouvelles inscriptions par bannière, 3 distributions (prix, superficie,
        année), heatmap horaire de détection, breakdown fourchettes avec deltas,
        tables quarantaine par motif + bannières/familles, 11 records
      - immoka/web.py : /api/stats/report 5 modes (complet|synthese|tendances|
        repartitions|donnees, inconnu->complet), filename(..., mode)
      - frontend/src/pages/Stats.tsx : toutes les sections v2 dans l'ordre SPEC
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 0 files
    4. Mobile : verrou de scroll du bottom-sheet filtres, cibles tactiles ≥44 px, socle mobile ka-ui
      …
      - Home.tsx : verrou du scroll d arriere-plan quand la feuille de filtres est
        ouverte (body overflow hidden + cleanup) et fermeture par Escape.
      - styles.css : extensions tactiles ::after pour a.ka-signup (99x17) et
        a.brand (92x27) ; z-index du sheet et de son backdrop bascules sur les
        variables du design system (--z-modal / --z-overlay).
      - ka/tokens.css : nouvelle section SOCLE MOBILE OBLIGATOIRE (echelle --z-*,
        --vh100 dvh, .ka-bottombar, verrou ka-scroll-lock, filet anti-zoom iOS 16 px,
        extension tactile du badge).
      - public/ka-agent.js : agent KA corrige (safe-area, textarea 16 px, plein
        ecran auto <=640 px + verrou scroll).
      - Suppression du fichier orphelin frontend/styles.css (46 Ko, non importe).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 5 files +261 −548
  5. Tue, Aug 18, 2026 1

    1. Vague 3 : Realtor.ca (MLS pan-bannières via Scrapfly ASP), Sotheby's complet (AJAX interne, 60→869), 7 agences source.immo (dont chambre CIEMCQ ~3 900), Guide Habitation (projets neufs)
      …
      - realtor_ca.py : rejoue PropertySearch_Post via Scrapfly ASP sans render_js
        (DataDome contourné) ; 14 shards bbox QC, tri récentes d abord, budget
        IMMOKA_REALTOR_MAX (défaut 2 000/sync ≈ 10-14 appels) ; external_id = MLS
        + _ag_ → dédup Centris masque les recoupements (2 145 fiches, 343 uniques).
      - sothebys_quebec.py : endpoint /include/ajax_results.php débloqué
        (p_territories[]=4, p_status neutre, remap serveur documenté) ; 869 fiches
        à vendre au lieu de ~60 ; repli pages région conservé.
      - agences source.immo : si_ag_ciemcq (Mon-Toit, Estrie-Mauricie-CdQ, 3 920
        fiches / 1 169 uniques), avenue, provad, peladeau, ferri, si_ag_jga,
        si_ag_katiasamson.
      - guidehabitation.py : répertoire des projets neufs (microdonnées schema.org,
        9 régions, 95 projets à vendre, locatifs écartés).
      - sources.json + source_immo_agencies.json + docs régénérées (50 fiches).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 60 files +1,473 −275