spb/lou-ka Public
Lou·Ka — tous les logements à louer du Québec, un seul endroit.
HTML 99.7%
-
Filtres avancés — refonte du menu web + facettes par ville
…
- /api/facets accepte ?city= : quartiers restreints à la ville (sélecteur dépendant) - Menu de filtres refait : rangée principale compacte (recherche, ville, quartier, loyer min–max, « Plus de filtres ») + panneau avancé repliable en segments (disponibilité, meublé, animaux, superficie, gestionnaire) - Correction du débordement horizontal (colonnes 1fr → contrôles bornés) - Chips rapides (dispo maintenant, animaux, meublé) + pastilles de filtres actifs retirables ; api.ts : price_min, pets, furnished, available_by, area_min - ios/ ignoré : l'app iOS native vit dans son propre dépôt (lou-ka-ios) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Page Stats en 5 onglets + rapport PDF enrichi (source unique marketstats.py)
…
- louka/marketstats.py : tous les agrégats du marché (régions, offre, inclusions, prix au pi², baisses de prix 30 j, santé des sources) — partagés entre /api/stats/detailed et le rapport PDF - Onglets : Vue d'ensemble (tuiles + régions + histogramme) · Loyers (histogramme, par taille, prix au pi², baisses de prix cliquables) · Régions & villes · L'offre (inclusions %, dispo, animaux, superficie) · Gestionnaires (top 20 + santé des syncs + alertes 24 h) - Rapport PDF : page « Offre » ajoutée (barres d'inclusions, prix au pi², baisses de prix), 4 pages, mêmes chiffres que le site Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
PDF légendaires : fiche de propriété par annonce + rapport global du marché
…
- louka/pdfgen.py (reportlab) au style éditorial sharp : logo Lou·Ka dessiné (boîte lime tournée), tuiles à ombre décalée, chips encre/lime - Fiche (/api/listings/{uid}/pdf, 2 pages) : prix géant + badge « vs le secteur », chips clés, photos encadrées, encadré « En bref » (text mining), description structurée, inclusions ✓, tuiles du quartier + barres de proximité + badges chaleur/criminalité, à proximité avec temps de marche, QR code vers la fiche en ligne, attributions de licences - Rapport global (/api/stats/rapport.pdf, 3 pages) : grands chiffres, couverture par région avec barres, histogramme des loyers, par taille, top 20 villes et gestionnaires - Boutons : « Télécharger la fiche (PDF) » sur chaque annonce, « Télécharger le rapport global (PDF) » sur la page Stats Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> -
Stats : compte « ailleurs au Québec » distinct du Grand Montréal (expansion provinciale)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
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>
-
Commodités de proximité par immeuble (Overpass/OSM) sur chaque fiche
…
- louka/poi.py : une requête Overpass par immeuble (13 catégories : épicerie, dépanneur, pharmacie, école, garderie, parc, bus, métro, gym, café, clinique, hôpital, bibliothèque), plus proche par catégorie avec distance, cache permanent par coordonnées arrondies (~11 m), politesse 1 req/s, rafraîchissement aux 3 mois - run.py poi [n] + intégration à la boucle watch (80 nouveaux immeubles/cycle) - /api/listings/{uid} : champ poi[] joint depuis le cache - fiche : section « À proximité » (icône, nom réel, distance formatée), mention données OpenStreetMap 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>
-
Mission 1a — couche commune : schéma enrichi, normalisation centrale, robustesse, tests
…
- schema.Listing : availability_date (ISO/now), area_sqft, pets, furnished, details (JSON structuré) + finalize() appliqué à toutes les sources - normalize.py : dates FR/EN → ISO, superficies pi²/m², prix robuste, types d'unité (chambres→½, 6½+, MDV…), commodités → tags canoniques, stationnement/animaux/fumeur/contact extraits du texte - db.py : migration auto, délai de grâce (2 syncs) avant désactivation, détection de dérive (volume + taux de prix null) avec retraits suspendus, cache des pages détail, cache de géocodage (préparé pour la carte) - fixtures.py + run.py record : enregistrement/rejeu des réponses HTTP, tests de régression pytest par connecteur (snapshot + validité schéma) - web.py : nouveaux filtres pets/furnished/available_by/area_min Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
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>