Lou·Ka — tous les logements à louer du Québec, un seul endroit.
- 264commits
- 1branches
- 0releases
- 180.7 MBon disk
- maindefault branch
- 5 days agolast push
-
Sat, Aug 22, 2026 1
-
court terme : nouvelle section « Location court terme » isolée (backend louka/shortterm + API /api/ct + page /court-terme) — 1er connecteur Airbnb
…
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
-
Tue, Aug 18, 2026 2
-
KA Scores — suite géographique maison (Walk/Transit/Bike/Calme/Services)
…
· environment.py : inventaire OSM par tuile (Overpass) — routes majeures, rails, aéroports, zones industrielles, bars, pistes cyclables (géométrie densifiée) et TOUS les POI par catégorie ; cache env_tiles ~3 mois. · kascores.py : 5 scores 0-100 par immeuble + global pondéré, barème versionné (2026.08-v1), détails honnêtes par score, « Données insuffisantes »/« Non desservi » plutôt que des 0 trompeurs ; Transit = proximité des arrêts × percentile PMD StatCan ; calcul incrémental (7 900 immeubles en ~8 s), distribution de calibration en sortie. · API : ks_* joints à /api/listings et /api/search (tri « ka », filtre kascore_min), détail complet sur la fiche, /api/kascores/stats. · Frontend : pastille KA sur les cartes d annonces, section KA Scores de la fiche (5 jauges + détail dépliable + date/version), page /ka-scores (méthodologie publique + pondérations personnelles en curseurs), tri « Meilleur KA Score » dans la vue carte, filtre « KA Score minimal ». · Boucle watch : env (4 tuiles max) + kascores incrémental à chaque sync. · Tests : test_kascores.py (barème, honnêteté, rendement décroissant, cohérence spatiale sur le parc réel). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Qualité des données + solidité mobile + framework de juste valeur (fair value)
…
Mission 1 — enrichissement des connecteurs et qualité : - quality.py : score de complétude 0-100 + seuil de publication (quarantaine des annonces sans prix plausible / localisation / contenu exploitable) - imgcheck.py : audit des images (liens morts 404/410, minuscules, placeholders multi-adresses, doublons) -> galeries nettoyées images_ok, cache image_checks, politesse 3 requêtes/hôte, écriture hors transaction réseau - 26 connecteurs enrichis (galeries complètes, descriptions, prix, adresses) : kangalou, royal_lepage, medway, remax_quebec, groupe_maurice, mellem, sutton, lespac, heafey, kijiji, fb_marketplace, zumper, equinoxe_batimo, logis_experts, quartier_sila, msi, summum, quartier_plus, urban_services, cosoltec, garic, lakle, matinale, huma, jutras, groupe_theoret, ferrovia - normalize : clean_city/clean_sector (rues et entités HTML retirées des menus), kijiji : adresses françaises « 89, rue X » correctement découpées - geocode : virgule après le n° civique corrigée (lot AQ), base en WAL - dedup : une annonce en quarantaine ne masque jamais un doublon publié Mission 2 — mobile : - /api/img : miniatures WebP servies à la taille de l écran (cache disque) - SmartImg : miniature -> original -> visuel de secours Lou-Ka (jamais d icône cassée) - lightbox tactile : balayage scroll-snap + pincement + double-tape - bannière témoins : ne recouvre plus le bouton Filtres (--consent-h) - cibles tactiles >= 44 px (pointer: coarse) ; KA Agent plein écran à l ouverture - stats : complétude moyenne, quarantaine par source Mission 3 — juste valeur locative (fairvalue.py, fv-logement-1.0) : - 3 niveaux : segments médians (repli en échelle) + coefficients de caractéristiques appris et centrés + comparables kNN géographiques (médiane pondérée) ; couloir de sécurité, fourchette, indice de confiance - prudence : pas de verdict si confiance faible, prix « à partir de », prix non mensuel, écart hors plausible ; chambres/coloc = segment dédié - pastilles sous/dans/au-dessus du marché (cartes + fiche), bloc Analyse de prix avec histogramme, filtre « Sous le marché » + tri, page /juste-valeur - API : champs fv_* + deal/sort, /api/fairvalue/{uid} ; stats + PDF ; historisation fv_segments ; tests synthétiques ; docs/FAIRVALUE*.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Sat, Aug 15, 2026 2
-
Thu, Aug 13, 2026 5
-
Lou-Ka Maps — carte propulsée par Ka Maps (framework Groupe Ka, moteur Mapbox 3D)
…
Frontend : MapView réécrit sur @groupe-ka/ka-maps (file:../../ka-maps) — style Mapbox Standard 3D par défaut + bouton 2D, pastilles de prix encre/ blanc, grappes compte + loyer moyen (clamp anti-prix aberrants), « Rechercher dans cette zone », aperçu React (fin du popup HTML injecté), sync liste↔carte (sélection + survol), caméra dans l'URL, badge Lou-Ka Maps · Groupe Ka, jeton public Mapbox (kamaps/config.ts). Recherche debouncée (fin des requêtes à chaque frappe). Backend : /api/listings.geojson accepte bbox + limit et renvoie totalGeocoded/totalMatching ; index idx_listings_geo(lat,lng) ; PRAGMA optimize au cycle d'ingestion (le planificateur choisissait le mauvais index). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Profil enrichi — photo téléversée, bio, ville, coordonnées, réseaux sociaux
…
- louka/profile.py : PUT /api/me/profile (nom affiché, bio 280, ville, téléphone, site web, réseaux instagram/facebook/x/linkedin/tiktok/youtube), POST /api/me/avatar (Pillow : EXIF, recadrage carré centré, 512 px, JPEG, purge des anciennes photos), DELETE /api/me/avatar (retour avatar Google) - /uploads/ monté (data/uploads/), colonnes users (display_name, avatar_url, bio, city, phone, website, socials JSON) - /api/me : nom et avatar « effectifs » (display_name > Google, upload > Google) + tous les champs ; profil public /u/{ka_id} : bio, ville, rôle, site, réseaux (jamais courriel/téléphone) - /profil : éditeur complet (photo avec téléversement, nom affiché, bio avec compteur, ville, téléphone, site, 6 réseaux avec icônes maison) - /u/{ka_id} : bio, chips ville/rôle/site, boutons réseaux sociaux - python-multipart ajouté (formulaires multipart FastAPI) -
Comptes v2 — KA-ID, profil « carte de membre », rôles, favoris, pages gestionnaires
…
- KA-ID : identifiant membre unique « ka- » + 10 chiffres, attribué à la création du compte (index unique, backfill au premier /api/me) - /profil : carte de membre Groupe KA (encre + lime, KA-ID en vedette, avatar, ancienneté, bande décorative), infos du compte, copie du KA-ID - Profil PUBLIC opt-in : /u/{ka_id} (nom, avatar, ancienneté — jamais le courriel ; 404 indistinguable si non public), toggle + lien copiable - Rôles à l'intégration (/bienvenue après le premier login Google) : · locataire — favoris (cœur sur les cartes, page /favoris, toggle optimiste) · gestionnaire — réclame la page de SA source (1/compte, 1 compte/source) et la personnalise (/gestion : accroche, description, contact, logo) ; page publique /g/{source} avec inventaire relié + pagination - louka/accounts.py (rôles, favoris, source_profiles), tables favorites + source_profiles + colonnes users (ka_id, public, role, org_source) - Contexte de compte partagé (account.tsx) : header, cartes et pages reliés -
Web — pagination 12 annonces/page + icônes SVG maison (fin des emojis génériques)
…
- Pager.tsx : pagination éditoriale (précédent/suivant, numéros avec ellipses, rappel « X–Y sur N »), sous la grille ET sous la liste de la vue carte - Home.tsx : 12 annonces/page via limit/offset API, page dans l'URL (?page=N), retour page 1 au changement de filtre, défilement doux vers les résultats - Icons.tsx : jeu d'icônes SVG au trait « éditorial sharp » (maison, immeuble, caméra, patte, sofa, éclair, liste, carte, curseurs, alerte, boussole…) - Emojis remplacés partout (cartes, chips, bascule liste/carte, FAB filtres, nav mobile, onglets Stats, fiche, carrousel vide, popups carte, 404)
-
Sat, Aug 8, 2026 4
-
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>
-
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>
-
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>
-
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>
-
-
Thu, Aug 6, 2026 1
-
Lou-Ka — agrégateur de logements à louer (Québec, Lévis, Grand Montréal)
…
Plateforme complète : 68 connecteurs de gestionnaires immobiliers, schéma standardisé avec détection de changements (hash), API FastAPI, frontend React/Vite PWA (design éditorial sharp, thème clair), déployée sur www.lou-ka.com avec resynchronisation horaire. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-