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 1

  1. Sun, Sep 13, 2026 3

  2. Mon, Sep 7, 2026 1

    1. feat(fiche): refonte premium mobile-first de la fiche propriété (2026-09-07)
      …
      Port de la fiche Lou-Ka v3 (2026-09-04) adapté à l'achat. Frontend
      (frontend/src/fiche/, nouvelle arborescence) : héro prix → capsule « vs
      estimation Vrai-Prix » → adresse → résumé → galerie → actions ; Immo-Ka Score
      (60 % emplacement = indice de proximité StatCan du secteur + 40 % prix = écart
      à l'estimation Vrai-Prix, partiel si une composante manque) ; « En bref »
      déterministe (prix, rôle d'évaluation, accessibilité, air, inondation, charges
      fixes taxes/copropriété, chaleur, baisse de prix, temps sur le marché,
      publications multiples) ; navigation sticky par sections (scroll-spy) ; Prix et
      marché (KPI, jauge fourchette/estimation/prix demandé, rôle d'évaluation
      terrain+bâtiment, historique du prix demandé) ; La propriété (grille
      icône/valeur + rangées agence/courtier + toutes les caractéristiques Centris et
      les pièces en accordéons) ; description tronquée ; caractéristiques et
      inclusions (AmenityIco) ; Financement et coût de propriété (ex-Financement :
      calculateur hypothécaire sur taux réels, SCHL, stress test, renouvellement,
      comparateur banques, historique, amortissement + coût mensuel = versement +
      taxes publiées + copropriété + Hydro-Québec, postes étiquetés publié/estimé/
      inconnu) ; grande carte 3D Ka Maps (bâtiment cerise) avec filtres de lieux
      (transport, épiceries, pharmacies, commerces, écoles, parcs, essence) ; À
      proximité / Transport en carrousels + bottom sheet ; Quartier en KPI compacts
      (propriétaires, revenu, défavorisation…) ; risque d'inondation, qualité de l'air,
      essence ; Dossier de l'annonce (suivi Immo-Ka, aussi publiée sur, courtier et
      agence, identifiants) ; Sources et méthodologie. Primitives ik-* (SectionCard,
      Accordion, BottomSheet, StatTile, StatusBadge, Skeleton, toast), tokens --ik-*
      (fond papier #F5F3EE, cerise réservé CTA/prix/score). Desktop ≥ 1024 : aside
      sticky (prix, CTA, score, constats, courtier, Demander à Ka). CTA sticky après
      le héro ; « ✦ Demander à Ka » branché sur le widget KA Agent. Header compact
      sur /propriete/ (favoris + partage via fiche/current.ts, ticker et badge
      masqués, connexion KA en icône sur mobile). Aucun `order` CSS ; pas de
      scrollIntoView à l'ouverture. 8 anciens composants de fiche supprimés
      (QuartierBlock, RisqueInondation, QualiteAir, EssenceProche, HydroEstimation,
      CommercesProches, PropertyMap, Financement). Icons.tsx : 30 pictos ajoutés +
      IcoHeart. Scripts QA : check-order.mjs (ik-*), shots.mjs, interactions.mjs,
      preview.mjs (build + proxy /api sans toucher dist/).
      
      Backend (additif) : poi.py conserve lat/lng des POI ; gaz.py expose lat/lng ;
      /api/gaz accepte `limit` (max 60). vite.config : proxy /api via IMMOKA_API.
      
      Validé sur M4M64b : tsc + vite build, check-order OK sur 3 fiches (scrollY 0,
      ordre croissant, sans overflow mobile/desktop), interactions (lightbox,
      accordéons, filtre carte, sheets lieux/Ka, 404) sans erreur JS, captures 6
      largeurs. Déployé : dist basculé, pm2 restart immo-ka-web.
      Simon-Pierre Boucher committed 19 days ago · 46 files +3,961 −1,544
  3. Sun, Sep 6, 2026 1

  4. Sun, Aug 30, 2026 1

  5. Fri, Aug 28, 2026 3

    1. Simon-Pierre Boucher committed 28 days ago · 11 files +26 −33
  6. Thu, Aug 27, 2026 5

    1. Simon-Pierre Boucher committed 29 days ago · 2 files +1 −1
    2. pause(ontario): expansion ON suspendue temporairement — rien d'effacé
      …
      - realtypress.py : enregistrement des connecteurs rp_* gaté par IMMOKA_ONTARIO=1
        (.env : flag documenté, commenté) — plus aucun sync ON
      - sources.json : 15 sources rp_* -> status pause + note_pause
      - quality.refresh : dépublication pause-ontario (published=0) des annonces
        source rp_* tant que le flag n'est pas posé (source ajoutée au SELECT)
      - docs/ONTARIO-PAUSE.md : quoi/pourquoi/comment réactiver
      
      202 187 fiches ON conservées en base, dépubliées. QC intact (95 010 publiées).
      Simon-Pierre Boucher committed 1 mo ago · 4 files +89 −32
    3. feat(ontario): monstres RealtyPress — revelrealty (~110k) + codygroup (~58k)
      …
      Champ registre `archive` (défaut "listing" ; revel: /listings/ — ⚠ /listing/ =
      carousel ; cody: /all-regional-listings/) et _LINK_RE généralisé (fiches cody
      hors /listing/). Ingestion : revel 84 091 + cody 57 925 ; dédup par external_id
      ddf<id> vérifiée (0 doublon visible, les sites régionaux priment).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +45 −2
    4. feat(ontario v1): connecteur générique RealtyPress — 13 sites d'agences ON (CREA DDF)
      …
      - connectors/realtypress.py : archive /listing/page/N/?posts_per_page=100,
        cookie disclaimer=accepted (mur CREA), 2 variantes de thème (ville avec/sans
        <strong>, ft²), fiches DDF (MLS®, tableaux, GPS JSON-LD, photos ddfcdn),
        external_id ddf<id> + infixe _ag_ → dédup inter-sites par external_id
      - data/ontario_agencies.json : registre 13 sites (Ottawa, KW, Kingston,
        Grey-Bruce, Collingwood, PEC, Pembroke, Huron-Perth, Thunder Bay, Sault,
        North Bay) ; sources.json : 13 entrées rp_ag_*
      - pipeline Ontario-aware : schema.finalize bbox 41.6–63/-95.5–-56,
        normalize._TYPE_MAP mots-clés anglais (detached, semi-detached, row house,
        multi-family, mobile home, farm, retail…), geocode _BBOX_KA + fallback
        Nominatim « city, Ontario, Canada » + run_batch exclut region='Ontario'
        (Adresses Québec ne couvre pas l'ON ; le DDF fournit lat/lng)
      
      Testé : cbnorthbay ingéré (503 fiches, 150 enrichies publiées score 94,
      stubs en quarantaine jusqu'à enrichissement), labrosse/sutton spot-checkés,
      API /api/listings?region=Ontario OK, parc QC intact (94 528 publiées).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 6 files +569 −40
  7. Wed, Aug 26, 2026 6

    1. Simon-Pierre Boucher committed 1 mo ago · 1 file +8 −2
    2. Simon-Pierre Boucher committed 1 mo ago · 2 files +116 −3
    3. Simon-Pierre Boucher committed 1 mo ago · 1 file +7 −2
    4. Mode carte Ka Map System v2 — expérience immersive plein viewport
      …
      - MapView réécrit autour de KaMapShell : mobile edge-to-edge + bottom sheet
        de résultats à 3 crans, desktop split liste|carte redimensionnable (ratio
        persisté) avec carte quasi plein écran d un clic
      - Toolbar unifiée (zoom, 3D, dessiner, me localiser) au lieu des pilules
        flottantes ; « Rechercher dans cette zone » contextuel
      - Dessin de zone : découpe côté client (setClipPolygon) + CTA
        « N propriétés dans cette zone »
      - Fiche contextuelle v2 : photo, prix, badge « sous l estimation Vrai-Prix »,
        swipe/chevrons entre propriétés voisines
      - Thème markers v2 : pilules off-white/encre premium, rouge réservé aux
        bonnes affaires et à la sélection ; clusters légers à anneau rouge,
        valeur moyenne sous les bulles significatives (valueMinCount)
      - Home : mode carte plein viewport, feuille de filtres en modale au-dessus
        du shell (desktop), widget Ka Agent masqué en mode carte
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 4 files +358 −109
    5. Fix /api/stats 500 : exclure les annonces sans prix du calcul d'écart Vrai-Prix
      …
      Une annonce active avec price NULL et une estimation Vrai-Prix faisait
      planter le calcul des deltas — les métriques du héro restaient à « — ».
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +1
  8. Tue, Aug 25, 2026 14

    1. Fiche propriete : refonte editoriale v2 — icones contextuelles, sections sans boites
      …
      - Nouveau composant AmenityIco partage (~34 pictos maison) : chaque
        inclusion Centris est appariee par mots-cles a SON icone (egouts, aqueduc,
        piscine, foyer, garage, bord de l eau…) — fini le check repete dix fois
      - Inclusions : grille en filets avec tuile icone 32px cerise-soft
      - Panneau heros de-boxe : le prix (36-54px), les specs iconees et Vrai-Prix
        structurent sans carte ; colonnes de la fiche sans boites, les modules
        pleine largeur (financement, quartier) restent en cartes
      - Caracteristiques : cles en micro-mono uppercase, rangees en filets
      - Titres de section avec tiret cerise net ; galerie au cadre allege
      - Mobile : le CTA sticky prend le bas d ecran, la tabbar s efface sur la
        fiche (body:has) — reglage du conflit tabbar/CTA introduit avec la barre
      Simon-Pierre Boucher committed 1 mo ago · 3 files +162 −2
    2. Desktop : grille uniforme + header sans debordement
      …
      - Grille editoriale : suppression du grand format 7n+1 — 3 colonnes
        uniformes, style editorial conserve
      - Header : la nav (8 entrees) + connexion depassaient le conteneur 1240px
        meme a 1440 (bouton Se connecter coupe, masque par overflow-x clip) —
        nav resserree (13px, nowrap), badge Groupe KA masque sous 1400px, burger
        des 1200px, header-inner en pleine largeur pour s aligner aux bords de
        l ecran sur les grands moniteurs — verifie par mesure Playwright de 1600
        a 900px : plus aucun element coupe
      Simon-Pierre Boucher committed 1 mo ago · 1 file +15 −6
    3. Navigation mobile : tabbar flottante (meme langage que Lou-Ka v2)
      …
      - Nouveau MobileTabBar : Decouvrir (/), Carte (/?view=carte), Taux
        (/taux-hypothecaires), Profil — pilule detachee des bords (radius 18,
        hairline, blur, ombre portee), trait cerise sous l onglet actif
      - Icones fines (stroke 1.6) du set Ico existant ; etat actif Carte deduit
        du parametre d URL view=carte comme sur Lou-Ka
      - body et ka-footer compenses sous 760px ; widget KA Agent remonte au-dessus
        de la barre (surcharge a specificite doublee, style injecte apres bundle)
      Simon-Pierre Boucher committed 1 mo ago · 2 files +56
    4. Refonte editoriale v2 de l accueil — direction artistique premium
      …
      Moins de boites, plus de typographie : personnalite architecturale et
      financiere (Bloomberg x magazine d architecture), cerise en signal seulement.
      
      - Hero : composition majuscule geante en 4 lignes (clamp 40-92px) — plein /
        outline (text-stroke) / ligne decalee / UN SEUL ENDROIT. avec seul souligne
        cerise — plus de gros boutons rectangulaires ni de stat-chips
      - Colonne de donnees facon terminal a droite du hero (filet vertical) :
        proprietes indexees (compteur anime), villes, prix moyen, plus haut prix ;
        passe en rangee horizontale sous 900px
      - Donnees vivantes : ligne mono LIVE — derniere synchro reelle qui tictaque
        (max ts des recent_syncs), +N proprietes ajoutees aujourd hui, agences
      - Recherche au coeur : grand champ Ou voulez-vous vivre ? souligne 2px,
        criteres inline Ville/Type/Prix en filets, Tous les criteres avec badge —
        la boite filterbar disparait
      - Barre de resultats sticky : N proprietes · tri mono nu · Liste|Carte
        (onglets a soulignement anime) · Filtres (mobile) — le FAB disparait
      - Fiches editoriales : image dominante (radius 10, zoom 1,025), prix 22px,
        adresse, secteur/MLS en micro-mono ; badge type en cerise sur photo
      - Grille magazine : 3 colonnes, grand format panoramique 16/9 toutes les 7
        fiches, apparition decalee par colonne, align-items start
      - Pagination nue : chiffres sans boites, page courante soulignee cerise
      - Feuille mobile premium : resume des criteres actifs sous la recherche,
        poignee, application sticky Voir les N proprietes
      - Primitives locales v2 : rayons 0/6/10/18, durees 150/240/350ms, hairlines
      Simon-Pierre Boucher committed 1 mo ago · 2 files +486 −95
    5. Accueil : refonte majeure du rendu — CTA hero, filtres et boutons peaufines
      …
      - Hero : halo cerise + trame de points decorative, rangee CTA (Explorer les
        proprietes / Voir la carte) avec ombres decalees cerise, stat-chips
        interactives (tabular-nums, survol)
      - Filterbar : rayon 14, recherche avec focus cerise, selects survolables,
        bouton Plus de filtres avec icone sliders, badge compteur et chevron anime,
        panneau avance avec easing
      - Boutons .btn : inline-flex + icones alignees, survol leve (ombre decalee),
        etats disabled ; segments actifs avec souligne cerise interieur
      - Pastilles actives : animation d apparition, survol danger (retrait) ;
        correction du conflit .pill avec la page Sources (uppercase qui fuyait)
      - Bascule Liste/Carte avec vraies icones SVG, tri encadre encre, pagination
        arrondie avec relief et etat actif cerise
      - Mobile : poignee de sheet, Voir les resultats sticky, FAB icone sliders +
        badge compteur, feuille sur l echelle z --z-modal
      Simon-Pierre Boucher committed 1 mo ago · 2 files +136 −49
    6. 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
    7. 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, overflow:hidden qui CLIPPAIT compte + pied de menu) à
      position:fixed inset:0 avec overflow-y:auto — menu complet et visible peu
      importe la position de scroll. Verrou de scroll CSS pur via html:has().
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +15 −3
    8. Dédup : priorité courtier + box « Aussi publiée sur… » sur la fiche
      …
      À autorité égale, une fiche avec courtier/agence bat désormais une fiche
      anonyme (fb_marketplace rejoint les petites annonces). Nouvelle colonne
      dup_of persistée par les 3 passes de dédup ; l'API expose les doublons de
      la fiche visible et la page fiche les liste avec mention et liens.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 5 files +81 −15
    9. Géocodage rigoureux : validation par références de ville (grappes + Nominatim)
      …
      Corrige la classe de bug « rue homonyme d'une autre ville » (4671 rue des
      Perdrix, Jonquière/Lac-Kénogami affichée à Saint-Augustin, ~180 km) :
      
      - chaque résultat de géocodage doit être à <= 40 km d'une référence de la
        ville annoncée : grappes de fiches déjà géocodées (une par municipalité
        HOMONYME — deux L'Ange-Gardien, deux Saint-Donat…) + point Nominatim de la
        ville (cache geocode_cache, clé « ville:… », colonne muni ajoutée)
      - resolve() : si la ville annoncée est un secteur inconnu d'Adresses Québec
        (« Jonquière (Lac-Kénogami) »), retry AQ avec la municipalité officielle
        (« Saguenay ») dérivée de Nominatim, puis variantes Nominatim structurées
      - run_batch : validation par références + rattrapage resolve() individuel des
        échecs du lot (RESCUE_MAX/passe, file auto-drainante)
      - run_audit (CLI geocode-audit [budget] [dry]) : détecte les fiches actives
        aux coordonnées incohérentes avec leur ville et les remet en file de
        géocodage ; intégré au cycle watch (budget Nominatim 50/passe)
      - garde d'ingestion : lat/lng fournis par un connecteur (ex. JSON-LD
        DuProprio erroné) rejetés s'ils contredisent la ville (cache seulement)
      
      Audit initial : 110 574 fiches vérifiées, 3 incohérentes corrigées et
      re-géocodées correctement (les municipalités homonymes ne sont pas flaguées).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 4 files +314 −26
    10. Onglet Bannières OACIQ (691 bannières/17 357 courtiers) + 15 connecteurs agences web
      …
      - immoka/bannieres.py + /api/bannieres(/{slug}) + page frontend Bannières
        (annuaire OACIQ avec couverture connecteur, 273/690 agences couvertes)
      - immoka/connectors/agences_web.py : famille générique registry-driven
        (data/web_agencies.json, 14 sites hétérogènes — WordPress, Next.js via
        Scrapfly, sitemaps) : prix labellisé prioritaire, rejet filtres/loyers/
        boilerplate, ville/type/description par cascade de fallbacks (JSON-LD,
        h1, <title> segmenté, slug), galerie absolutisée via marqueur d'URL
      - sourceimmo.py : codes catégorie courts COM/IND/RES/CON/MF (groupevalor)
      - + groupevalor (source.immo) ; sources.json passe à 80 sources, census
        et bannieres.json resynchronisés (covered_by), docs régénérés
      - sync : 632 fiches, ~371 publiées (pgl en quarantaine : fiches XHR vides)
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 96 files +2,110 −242
  9. Mon, Aug 24, 2026 6

    1. Recensement OACIQ (17 357 courtiers, 690 agences) + 3 connecteurs source.immo : blvd, christinegauthier, guyhoquet
      …
      - data/oaciq_census.json : registre OACIQ complet croisé avec les connecteurs
        (253 agences couvertes / 437 sans connecteur, sites+plateformes sondés pour
        les ~120 plus grosses) — base des prochaines campagnes de connecteurs.
      - Nouvelles agences (plateforme source.immo, config auto _configs.json) :
        BLVD Immobilier (329 fiches), Christine Gauthier (40), Guy Hoquet Québec (8).
      - agences_source_immo.py : listing_path par agence (BLVD utilise
        « details-de-la-propriete » au lieu de « propriete »).
      - vaillancourtimmobilier.com écarté (même compte/vue que domicilia).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 74 files +7,381 −600
    2. Simon-Pierre Boucher committed 1 mo ago · 1 file +10
    3. Stats : panneaux « enrichissements de la fiche » (Vrai-Prix, historique des prix, taux hypothécaires, annuaires)
      …
      - immoka/statsfiche.py : 5 panneaux calculés sur les données réelles des fiches
        (couverture des enrichissements + couches branchées, écarts prix demandé vs
        estimation Vrai-Prix par ville + verdicts, baisses/hausses de prix suivies,
        meilleurs taux hypothécaires réels par institution et par terme, annuaires
        déménageurs + inspecteurs en bâtiment)
      - stats.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 +406 −2
    4. Annuaire des inspecteurs en bâtiment du Québec : page /inspecteurs (542 entreprises, 17 régions)
      …
      - data/inspecteurs.json : dataset canonique (balayage Google Places via Serper,
        188 villes, requêtes inspecteur en bâtiment + inspection préachat,
        dédoublonnage CID/téléphone, exclusions SAAQ/municipal/agricole)
      - immoka/inspecteurs.py : API /api/inspecteurs (filtres région + texte)
      - frontend : page Inspecteurs.tsx (recherche, filtre par région, tel:/site web),
        liens nav + menu mobile
      - seo.py : SSR /inspecteurs (liste complète par région, JSON-LD
        ProfessionalService ItemList) + entrée sitemaps/pages.xml
      - scripts/build_inspecteurs.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 +8,754
    5. 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 Lou-Ka
      - immoka/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
      - seo.py : SSR /demenageurs (liste complète par région, JSON-LD MovingCompany
        ItemList) + entrée sitemaps/pages.xml
      - 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,092 −1