SPB Git

spb/lou-ka

Public

Lou·Ka — tous les logements à louer du Québec, un seul endroit.

page 1
  1. Tue, Aug 18, 2026 2

    1. Vague 2 : colonnes bedrooms/bathrooms, perf fb_marketplace/logisquebec, connecteurs Kangalou + Rentals.ca, visites virtuelles
      …
      - Schéma : colonnes bedrooms/bathrooms REAL (additives) dérivées dans
        finalize() — details explicites > type d'unité (n½ -> n-2, convention QC)
        > extraction texte ; backfill one-shot : 96,7 % bedrooms / 51 % bathrooms
        sur le parc actif.
      - fb_marketplace : recherche et détails Scrapfly EN PARALLÈLE (6 fils,
        mêmes requêtes, aucun volume perdu), TTL détail 10 -> 30 j, annonces
        louées filtrées avant enrichissement : 43-47 min -> 7,3 min/cycle.
      - logisquebec : budget détail 1200 -> 400 (dimensionné TTL 7 j / ~10
        passes/j), fiches jamais vues servies en premier, délai 0,7 -> 0,5 s :
        19 min -> 7,6 min/cycle, parc complet (6 393 fiches).
      - Kangalou (nouveau) : découverte en 1 requête via les pins de la carte
        (/fr/recherche/ajax/search-map/, loués/commerciaux exclus), fiches SSR
        (adresse, chambres/SDB, GPS, galerie, dispo, superficie) : 7 916 annonces.
      - Rentals.ca (nouveau) : même GraphQL que Louer.ca mais inventaire ~+15 %,
        rejoué via Scrapfly ASP sans rendu JS (Cloudflare), détails PAR LOTS de
        40 via nodes(ids), villes/volumes plafonnés : 3 452 annonces (les
        recoupements Louer.ca sont résorbés par la dédup, déjà dans PORTALS).
      - Visites virtuelles : details.virtual_tour — tours{} Matterport/YouTube
        du réseau Rentals.ca (louer_ca clé cache v2 + rentals_ca) + détection
        générique Matterport/iGUIDE/Klapty dans les fiches logisquebec,
        duproprio, kangalou. 1 107 annonces actives en ont déjà une.
      - TtlDetailCache : peek()/put() pour la planification de lots parallèles.
      - sources.json : +kangalou, +rentals_ca (275 sources, 212 connecteurs).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 12 files +808 −114
    2. Connecteurs : rivero/trudel suspendus (RealVuu mort), groupe_dallaire via proxy Scrapfly, disjoncteur ingest, capreit/logisquebec/royal_lepage enrichis
      …
      - rivero + trudel : app.realvuu.com hors-ligne depuis 2026-08-10 (DNS NXDOMAIN)
        -> flag disabled=True (exclus du registre auto), statut sources.json mis a
        jour, 244 annonces zombies archivees (active=0, aucune suppression)
      - ingest : disjoncteur leger — une source en echec aux 5 derniers passages
        est sautee (log sync_log "disjoncteur: ..."), retentee 1 passage sur 5
      - groupe_dallaire : le pare-feu bloque l IP du serveur (timeout TCP sur tout
        le domaine) -> timeout direct 8 s puis repli proxy Scrapfly (simple, puis
        escalade ASP residentiel apres 422 WAF) pour admin-ajax et fiches ;
        teste : 255/256 unites retrouvees en ~5 min
      - capreit : area_sqft (colonne pi2 de la fiche) et availability_date
        (earliest_date du flux) mappes directement — 117/117 vs 107/117 avant
      - logisquebec : details canoniques postal_code / contact.phone / rooms
        (JSON-LD) ; superficie : verifie, aucune source structuree sur la fiche
      - royal_lepage : enrichissement fiche detail (description "Remarques",
        superficie habitable, agence) avec cache detail2 + cap 100/cycle
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 10 files +169 −22
  2. Mon, Aug 17, 2026 9

    1. Simon-Pierre Boucher · 2 files +106 −350
    2. Câblage du widget KA Agent (bulle de chat IA Groupe KA)
      …
      Balises window.KA_AGENT={site:"lou-ka"} + /ka-agent.js (defer) dans
      frontend/index.html ; le gabarit SSR de louka/seo.py reprend le shell du
      build Vite, les fiches logement héritent donc du widget sans doublon.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +235
    3. Footer/contact : Job-Ka rejoint l écosystème (ecosystem.json 13 sites)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +175 −24
    4. Ajoute fpdf2 aux dépendances (moteur PDF des rapports statistiques)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +1
    5. Page /stats refaite en tableau de bord analytique + rapport PDF Groupe-KA
      …
      - louka/statsdash.py : GET /api/stats/dashboard (contrat ka-stats SPEC.md) —
        KPI avec deltas vs période précédente, séries actives/nouvelles par jour
        (reconstruites de first_seen/last_seen), répartitions taille/source, top
        villes, heatmap, tableaux villes & gestionnaires, records auto-générés ;
        requêtes SQL agrégées + cache mémoire 5 min par période.
      - louka/kapdf.py (moteur PDF commun fpdf2) + GET /api/stats/report :
        rapport estampillé Groupe-KA (couverture Lou·Ka, sommaire, graphiques
        vectoriels, tableaux zébrés, records, page contact), modes complet/synthèse,
        nom de fichier normalisé groupe-ka_lou-ka_stats_<periode>_<date>.pdf.
      - frontend : pages/Stats.tsx réécrite sur le kit ka/stats/kacharts.tsx
        (KpiCard, PeriodSelector, LineChart N-1, Donut, BarChart, CalendarHeatmap,
        DataTable, RecordCard, PdfButton, Fraicheur) — responsive 360/768/1440,
        états vides propres quand la donnée n existe pas.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 8 files +2,177 −390
    6. Ajoute les assets de partage Groupe KA (og.png, favicon.svg, apple-touch-icon) et complète le head SSR
      …
      - Nouveau favicon SVG et apple-touch-icon servis à la racine via frontend/public
      - Image Open Graph 1200×630 par défaut (og.png) : meta og:image + dimensions + twitter:card/twitter:image dans index.html
      - seo.py : og:image par défaut sur toutes les pages SSR, twitter:image, et retrait des meta statiques du gabarit pour éviter les doublons
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 5 files +21 −4
    7. 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>
      Simon-Pierre Boucher · 14 files +731 −219
    8. Simon-Pierre Boucher · 11 files +106
    9. Nouvelles sources + déduplication inter-sources
      …
      8 connecteurs (208 → 212), testés en live :
      - logisquebec — portail (~9 800 fiches) : sitemaps + JSON-LD, expiration HTTP 410
      - duproprio — location par particuliers (~4 200, 0 % chevauchement) : sitemaps gz + JSON-LD, retrait = 302
      - louer_ca — réseau Rentals.ca (~1 700) : API GraphQL interne (JWT), 1 annonce par plan d'étage
      - roomies — chambres/colocation : JSON-LD Room
      - groupe_maurice — 37 résidences pour aînés (RPA) : API REST + grilles de prix
      - bons_locataires — agence Montréal : carte MapListPro + fiches WordPress
      - omhm — logements abordables ENHARMONIE
      - fb_marketplace — Scrapfly ASP, pagination par tranches de prix (scroll bloqué hors login)
      
      Déduplication inter-sources (louka/dedup.py) :
      - colonnes dup_of / dup_sources (migration db.py), recalcul idempotent dans ingest.watch() après géocodage
      - blocage par clé d'adresse (civique + rue normalisée FR/EN + ville), confirmation type + prix ±4 %
      - contrainte « ≤1 annonce par source par groupe » (évite de fusionner des unités distinctes d'un immeuble)
      - canonique = source la plus autoritaire (gestionnaire direct > portail > petites annonces)
      - web.py n'affiche que les annonces canoniques (dup_of IS NULL) ; dup_sources exposé pour le badge « aussi publiée sur »
      - résultat : 147 groupes, 154 doublons masqués sur 18 536 annonces
      
      Utilitaire _detailutil.TtlDetailCache : cache de pages détail avec TTL + budget par sync.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 14 files +1,936 −8
  3. Sat, Aug 15, 2026 3

  4. Thu, Aug 13, 2026 15

    1. watch : géocodage en lot à chaque cycle (au lieu du 1-par-1 limité à 120)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +2 −2
    2. geocode : mode EN LOT Adresses Québec (porté d'Immo-Ka) — peuple Lou-Ka Maps
      …
      run.py geocode = lots de 200 adresses normalisées (geocodeAddresses),
      1 entrée par immeuble, cache partagé, validation bbox par ville ;
      l'ancien mode 1-par-1 (Nominatim) reste sous « geocode1 ».
      Résultat : 11 033 → 14 206 annonces géolocalisées (77 % des actives).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +120 −1
    3. docs: ka-maps-lou-ka.md — intégration Lou-Ka Maps
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +36
    4. 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>
      Simon-Pierre Boucher · 21 files +854 −439
    5. 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)
      Simon-Pierre Boucher · 14 files +679 −36
    6. 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
      Simon-Pierre Boucher · 16 files +1,469 −12
    7. 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)
      Simon-Pierre Boucher · 6 files +317 −2
    8. 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)
      Simon-Pierre Boucher · 4 files +120 −4
    9. 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)
      Simon-Pierre Boucher · 10 files +382 −43
  5. Wed, Aug 12, 2026 1

    1. Portails & courtiers en location — 10 connecteurs portés d'Immo-Ka (Kijiji, LesPAC, RE/MAX, Sutton, Royal LePage, Via Capitale, Proprio Direct, Ubee, Barnes, M Immobilier)
      …
      - base.py : backends Scrapfly (scrapfly/get_scrapfly) + post() portés d'Immo-Ka
      - _detailutil.py : helper partagé d'enrichissement fiche détail (cache BD, budget par sync) adapté au schéma Listing
      - Kijiji c37 apparts/condos + c36 chambres/coloc (Apollo __NEXT_DATA__, QC l9001)
      - LesPAC b457 logements + b458 coloc + b460 aînés (searchResponse, ancre Montréal = province entière triée par distance)
      - RE/MAX Québec : index Meilisearch public shardé par RTA, slugs -a-louer seulement
      - Sutton : sitemap inscriptions typeInscription=2 (= locations)
      - Royal LePage : recherche transactionType=LEASE (formulaire caché), 28 villes d'ancrage
      - Via Capitale : criteresJson AVendre:false via Firecrawl (Cloudflare)
      - Proprio Direct : API searchListings filter rentOrSale:rent, volet résidentiel
      - Ubee : API SearchProperties listingType Renter (askPrice = loyer mensuel)
      - Barnes : Algolia facette type:rental (property_rent) ; M Immobilier : CODE_STATUT=AL
      - sources.json : 255 → 265 (10 nouvelles sources « Province »/Montréal)
      - Écartés après vérification live (pas de location résidentielle) : DuProprio, Profusion, Engel & Völkers, KW Prestige/Distinction/Urbain, Expert PM, Sotheby's
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 13 files +2,759 −1
  6. Tue, Aug 11, 2026 1

    1. 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>
      Simon-Pierre Boucher · 5 files +388 −71
  7. Sun, Aug 9, 2026 9

    1. Simon-Pierre Boucher · 3 files +234 −4
    2. Expansion P3 — Estrie (6 connecteurs +24 annonces, 17 non-connectables)
      …
      terater (12) · alexcellence (4e Houzez, sous-classe Dynamic) · oxford ·
      immeubles_pm (plogg vivant) · majestic (Granby) · lequerre (OBNL).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 84 files +54,661
    3. Expansion P3 — Est & Nord + Chaudière-Appalaches (7 connecteurs +98 annonces, 9 non-connectables)
      …
      quartier_plus (Thetford, 59) · immeubles_bois (Rimouski, catalogue 23) ·
      louer_saguenay · luxuor · beaulieu_groupe · gestion_jdm · alias_appartements.
      LM Gestion et Alexandre Pelletier re-vérifiés (sites toujours morts).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 46 files +29,930
    4. Expansion P3 — Mauricie/CdQ/Lanaudière (6 connecteurs +53 annonces, 8 non-connectables)
      …
      moderno · acceslogis_gb · ferrovia (23, prix non publiés) · habitations_sf ·
      lambert · fournelle. Non-connectables documentés (parcs pleins, vitrines
      sans unités, renvois Facebook).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 45 files +42,985
    5. Expansion P3 — Outaouais (5 connecteurs +41 annonces, 10 non-connectables)
      …
      wandji (API /api/buildings découverte, 29) · gio (crawl-delay 3 respecté) ·
      immnasr · quanta · leviu (portail Magex). Registre fusionné.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 82 files +12,412 −1
    6. Expansion P2 — Estrie (15 connecteurs, +279 annonces)
      …
      Famille Houzez factorisée (dynamic -> gestimmo_estrie, agence_sherbrooke) ·
      uptimo (51) · dynamic (49) · matinale (42, Crawl-Delay 20 respecté) ·
      gestimmo (41) · montagnais (6 campus étudiants) · floria (Livya) + 8 autres.
      6 non-connectables documentés (plateforme plogg morte, vitrines sans prix).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 349 files +432,335
    7. 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>
      Simon-Pierre Boucher · 6 files +706 −311
    8. Expansion P2 — Outaouais (10 connecteurs, +136 annonces)
      …
      garic (admin-ajax JSON avec GPS, 47) · aalto (RentCafe/Zibi via Firecrawl,
      28) · desmarais (14) · souleymane (13) · elite (12) · lacite (crawl-delay 10
      respecté, prix non publiés) + 4 autres. Aucune exclusion nécessaire.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 160 files +92,105
    9. 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>
      Simon-Pierre Boucher · 6 files +778
Menu

Theme