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
-
Fri, Sep 4, 2026 1
-
feat(fiche): refonte premium mobile-first de la fiche logement (2026-09-04)
…
Frontend (frontend/src/fiche/, nouvelle arborescence) : héro prix → adresse → résumé → galerie → actions ; Lou-Ka Score (60 % KA Score emplacement + 40 % prix vs juste valeur, partiel si une composante manque) ; « En bref » déterministe (prix, accessibilité, air, inondation, coûts, TAL, chaleur, baisse de prix) ; navigation sticky par sections (scroll-spy) ; Prix et marché (juste valeur + histogramme) ; Le logement (grille icône/valeur) ; description tronquée + texte original ; inclusions dédoublonnées FR/EN ; grande carte 3D Ka Maps avec filtres de lieux (transport, épiceries, pharmacies, commerces, écoles, parcs, essence) ; À proximité / Transport en carrousels + bottom sheet ; Quartier en KPI compacts + accessibilité en lignes ; KA Scores compacts ; Registre des loyers orienté décision (jauge p10–p90, médianes par chambres, 3 comparables + sheet filtrable) ; coût réel + Hydro ; risque d'inondation (statut clair, juridique en accordéon) ; qualité de l'air en tuiles ; essence (3 stats, 3 stations, sheet) ; Dossier de l'immeuble en accordéons (historique, passeport, gestionnaire, TAL, hiver) ; Sources et méthodologie + fin de fiche. Primitives : SectionCard, Accordion, BottomSheet (modale ≥ 900 px), StatTile, StatusBadge, Skeleton, états vides/erreur, toast. Données : useFicheData (groupe critique au montage, groupe différé à l'approche de la carte). Tokens --lk-* scopés (.lk-fiche) : fond #F7F7F5, cartes blanches bord 1 px, ombres légères, rayons 10/14/18/22, orange réservé CTA/prix/score. Desktop ≥ 1024 : aside sticky (prix, CTA, score, constats, Demander à Ka). CTA sticky compact affiché seulement après le héro ; bouton « ✦ Demander à Ka » discret branché sur le widget KA Agent existant (contexte de la fiche transmis). Header compact sur la fiche (56 px, ticker masqué, favoris + partage, connexion en icône sur mobile). Aucun `order` CSS ; scrollIntoView banni de la barre de sections (faisait ouvrir la page à 434 px). Anciennes classes .fiche/.f-* intactes pour la fiche court terme. 16 anciens composants de fiche supprimés (remplacés). check-order.mjs mis à jour + shots.mjs / interactions.mjs. Backend (additif, rétrocompatible) : poi.py conserve lat/lng des POI (carte) ; gaz.py expose lat/lng des stations ; /api/gaz et /api/rdl acceptent `limit` (sheets « Voir les N »). vite.config : proxy /api paramétrable (LOUKA_API). Validé : tsc + vite build, check-order OK (scrollY 0, ordre croissant, sans overflow 375→1440), captures Playwright 6 largeurs, sheets/carte/Ka/404, fiche sans KA Score. node_modules frontend réinstallés (typescript/esbuild tronqués par ka2 le 2026-08-31 pour ENOSPC).
-
-
Tue, Aug 25, 2026 1
-
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>
-
-
Mon, Aug 24, 2026 2
-
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>
-
feat(doc): page documentation /doc (guide + captures) + lien footer + PDF téléchargeable
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Sat, Aug 22, 2026 2
-
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>
-
header opaque + z-index en tokens + scroll-lock ka-scroll-lock (standard header/menu KA 2026-08-22)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Wed, Aug 19, 2026 1
-
Mobile : backdrop du menu compte via createPortal, verrou scroll de la feuille filtres, champs ≥16 px, logo tactile, socle mobile tokens.css, ka-agent corrigé
…
- frontend/src/App.tsx : .account-backdrop rendu à la racine via createPortal (le backdrop-filter du header re-parentait le position:fixed → voile de 66 px) + fermeture du menu compte à Escape. - frontend/src/pages/Home.tsx : feuille de filtres mobile (sheetOpen) — gel du scroll d arrière-plan (pattern du hamburger) + fermeture à Escape. - frontend/src/styles.css : backdrop compte plein écran sous le header (z-40, le menu ancré dans le header reste au-dessus) ; champs de filtres ≥16 px sur mobile (f-search, f-native, f-ctl select, ms-sort) ; zone tactile ≥44 px du logo .brand (::after inset -8px, rendu inchangé). - frontend/src/ka/tokens.css : socle mobile obligatoire (z-index communs, --vh100, .ka-scroll-lock, .ka-bottombar, filet anti-zoom iOS 16 px). - frontend/public/ka-agent.js : safe-areas, textarea 16 px, plein écran ≤640 px + verrou, pas de focus clavier forcé. Co-Authored-By: Claude Fable 5 <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>
-
-
Mon, Aug 17, 2026 1
-
Retour au design system commun Groupe KA « éditorial sharp » (accent orange conservé)
…
Lou-Ka abandonne l'identité marine/bleu du 2026-08-15 et revient au socle partagé ka-ui (papier #f5f3ee, encre #141814, Space Grotesk/Inter/JetBrains Mono, bordures encre 1,5 px + ombres décalées), en gardant son accent orange (#ff6a00), son logo « porte entrouverte » et sa baseline. - ka-ui vendoré : frontend/src/ka/ (tokens.css, ecosystem.json, KaFooter, GroupeKaBadge) ; tokens.css importé AVANT styles.css dans main.tsx - styles.css : :root réécrit (accent orange + alias --lime, anciens jetons marine/bleu remappés sur les jetons communs), géométrie sharp 10/6 px, états sélectionnés encre+accent, couche d'harmonisation finale ; le thème Ka Maps passe à l'accent orange sur le chrome de la carte - Header : badge « Un service Groupe KA » (desktop + menu mobile ≥44 px) - Footer : KaFooter commun (siteId lou-ka, pages légales locales) précédé d'une rangée de navigation locale + « Gérer mes témoins » - Nouvelle page /contact (courriels + rôles d'ecosystem.json, avertissement agrégateur, liste des sites, lien hub) ; route ajoutée au fallback SPA - SEO : title « Lou-Ka — Un service Groupe KA » (index.html) ; titre SSR de l'accueil harmonisé + lien Groupe KA dans le corps SEO (seo.py) - « Créer mon compte » pointe vers https://www.groupe-ka.com/connexion - Polices Space Grotesk + JetBrains Mono ajoutées (Google Fonts) - ka-maps redéployé sur le nœud (~/apps/ka-maps) pour le build Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Sat, Aug 15, 2026 1
-
Thu, Aug 13, 2026 6
-
SEO — SSR léger FastAPI (louka/seo.py) : HTML complet dès la première requête ; pages programmatiques /villes et /ville/{ville}[/{type}] ; fiches avec title/description uniques + JSON-LD RealEstateListing ; robots.txt ; sitemaps dynamiques (index + villes + annonces) ; 410 annonces retirées, 404 réels (fin des soft-404) ; GZip
…
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 -
Comptes utilisateurs — connexion Google (OAuth 2.0 / OpenID Connect)
…
- louka/auth.py : flux authorization-code serveur (login -> Google -> callback), state signé, upsert table users, session HMAC-SHA256 en cookie httpOnly 30 j (stdlib seulement), /api/me, /api/auth/logout, /api/auth/config - db.py : table users (google_sub unique, email, name, picture) - Frontend : bouton « Connexion » (logo Google) dans le header, avatar + menu compte (courriel, se déconnecter) — masqué tant que l'OAuth n'est pas configuré - .env : SESSION_SECRET généré ; GOOGLE_CLIENT_ID/SECRET à coller (redirect URI : https://www.lou-ka.com/api/auth/google/callback)
-
Web — mention Groupe KA + page Conditions d'utilisation + courriels officiels
…
- Footer : « Lou-Ka est une plateforme du Groupe KA » (lien groupe-ka.com), © Groupe KA, contact@groupe-ka.com, lien vers /conditions - Nouvelle page /conditions : opérateur (info@groupe-ka.com), nature du service, exactitude, retrait de contenu (contact@groupe-ka.com), usage acceptable, volet légal (admin@groupe-ka.com) — route + menu mobile - Confidentialité : responsable Loi 25 admin@groupe-ka.com, retraits et questions contact@/info@groupe-ka.com (remplace contact@spboucher.ai)
-
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 3
-
Page /bot (transparence LouKaBot) + User-Agent pointant dessus
…
Explique le robot aux gestionnaires : cadence, respect de robots.txt, aucune donnée personnelle, contact pour flux officiel/retrait, consigne de blocage. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Passerelle de sortie vers l'annonce originale (à la Centris)
…
/passerelle/:uid — Lou-Ka -> gestionnaire avec points animés, barre de progression (2,2 s) puis redirection ; boutons « Y aller maintenant » et « Rester sur Lou-Ka ». Sécurité : uid seulement, l'URL de destination vient de l'API (aucune redirection ouverte). CTAs de la fiche (desktop + sticky) rebranchés ; prefers-reduced-motion respecté. 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>
-
-
Thu, Aug 6, 2026 2
-
Page Statistiques + extension Grand Montréal (68 connecteurs)
…
- Page /stats : tuiles héro (total, loyer médian/moyen, villes, gestionnaires), histogramme des loyers (classes de 200$), répartitions par taille, ville et gestionnaire — barres mono-série encre verte, infobulles, étiquettes directes, vue tableau par graphique, catégories cliquables vers les logements filtrés - 38 connecteurs Grand Montréal (REITs, promoteurs, gestionnaires) + extension de 5 connecteurs existants; registre à 74 sources - Filtres de l'accueil pré-remplis depuis l'URL - Optimisation smartphone : bottom sheet de filtres, FAB, safe-areas, anti-zoom iOS Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
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>
-