Immo-Ka — agrégateur des propriétés à vendre au Québec (73 connecteurs, ~40 000 annonces, React+FastAPI)
Python 47.5%
HTML 27.9%
TypeScript 15.5%
CSS 7.2%
JavaScript 2%
-
Sun, Sep 13, 2026 3
-
Mon, Sep 7, 2026 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.
-
-
Sun, Sep 6, 2026 1
-
Sun, Aug 30, 2026 1
-
Fri, Aug 28, 2026 3
-
Thu, Aug 27, 2026 5
-
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).
-
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>
-
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>
-
docs(ontario): liste des agences et sous-agents connectables pour l'extension Ontario (~150 sites vérifiés, plateformes RealtyPress/myRealPage/Sierra/AgentLocator, priorités)
…
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
Wed, Aug 26, 2026 6
-
feat(ka-id v2.2): boost COLLABORATIVE_MODEL des recommandations du modèle ALS (kaid.py aligné sur ka-ui.git/kaid f844854)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
feat(ka-id v2.1): CF SIMILAR_USERS + langue transversale (kaid.py), SDK pilules « Sauvegarder cette recherche »/« Pas pour moi » (ka-id.js), alignés sur ka-ui.git/kaid cbe9c9f
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
fix(ka-id v2): kaid.py — les plages numériques pèsent 0.6 (un simple bon prix ne score plus 1.0), aligné sur ka-ui.git/kaid
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
feat(ka-id v2): personnalisation Groupe KA — immoka/kaid.py (canonique ka-ui.git/kaid), journal serveur (search/detail_view/favorite), reranking du tri « recent » + annotation seule sur les tris par prix, routeur /api/kaid, SDK ka-id.js, badge « Recommandé pour vous »
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
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>
-
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>
-
-
Tue, Aug 25, 2026 14
-
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
-
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
-
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)
-
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
-
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
-
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>
-
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>
-
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>
-
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>
-
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>
-
Mon, Aug 24, 2026 6
-
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>
-
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>
-
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>
-
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>
-