Lou·Ka
Tous les logements à louer
Chercher un appartement au Québec, c'est ouvrir des dizaines de sites différents — chacun avec sa navigation, ses filtres, son format. Lou·Ka retourne le problème : un connecteur dédié par gestionnaire immobilier visite chaque site, normalise chaque annonce vers un schéma unique et détecte les changements en continu (synchronisation périodique + hash de contenu → ajouts, mises à jour et retraits automatiques ; une annonce disparue répond 410 Gone). Chaque fiche renvoie vers l'annonce originale du gestionnaire via une passerelle de sortie transparente (/passerelle/{uid}).
Pour qui ? Les locataires qui cherchent (recherche filtrée, carte 3D, fiches complètes), les curieux du marché (observatoire des loyers, rapports PDF) et les gestionnaires (pages réclamables). En chiffres (au 2026-08-28) : 47 827 annonces actives publiées, 302 sources actives (503 recensées dans le registre), 431 connecteurs (384 location long terme + 47 court terme), plus de 1 200 villes, 11 régions, KA Scores calculés sur 96,1 % du parc, loyer moyen 1 811 $ — plus 52 440 séjours court terme (chalets, hôtels, Airbnb…) dans la section /court-terme (47 sources actives, 36 régions).
Identité : accent orange #ff6a00, logo « porte » (la porte d'entrée du prochain chez-soi), signature « Un service Groupe KA » au pied de chaque page — design system partagé ka-ui (tokens, accents et footer centralisés via ecosystem.json).
Visite guidée
Captures du 2026-08-25 — refonte éditoriale v2 (mobile 390×844 · desktop 1440×900).
Mobile
![]() Accueil — héro typographique, ticker live, KA Tabbar |
![]() Logements à Montréal — filtres par type |
![]() Fiche logement v2 — galerie d'abord, prix + CTA source |
![]() Observatoire des loyers |
![]() Favoris — connexion KA ID |
![]() Nav v2 — panneau plein écran |
Desktop
![]() Accueil — DA premium sans boîtes, recherche soulignée, compteurs live |
![]() Résultats — grille magazine uniforme |
![]() Fiche logement v2 — sections à filets, icônes contextuelles |
![]() Fiche — analyses de prix et panneaux de quartier |
![]() Répertoire des villes (pages SEO) |
![]() Annuaire des déménageurs (565 fiches, avec Immo·Ka) |
![]() Observatoire du marché locatif |
![]() Favoris « Mon univers Ka » (KA ID) |
Le site page par page (2026-08-28)
Dix captures pleine page (desktop) qui parcourent le site publié — de l'accueil aux pages légales, en passant par les pages SEO et le registre des sources. Fichiers dans docs/screenshots/.
![]() Accueil ( /) — héro typographique, recherche soulignée, compteurs live du parc (annonces, sources, villes) et entrées rapides vers les grandes villes |
![]() Répertoire des villes ( /villes) — l'index SEO complet : chaque ville du Québec couverte, avec son compte d'annonces, menant aux pages /ville/{slug} |
![]() Location court terme ( /court-terme) — la section séjours (chalets, hôtels, Airbnb, Vrbo, SÉPAQ…) : 52 440 fiches, 47 sources, 36 régions, DA éditoriale alignée sur l'accueil |
![]() Observatoire du marché ( /stats) — KPI temps réel, loyers médians par région/ville/taille, panneaux territoire et rapports PDF téléchargeables |
![]() Registre des sources ( /sources) — la transparence du pipeline : chaque gestionnaire connecté, son statut et sa dernière synchronisation |
![]() Annuaire des déménageurs ( /demenageurs) — 565 entreprises de déménagement du Québec, annuaire partagé avec Immo·Ka |
![]() Politique de confidentialité ( /confidentialite) — données collectées, cookies, comptes KA ID : la page légale en français clair |
![]() Conditions d'utilisation ( /conditions) — rôle d'agrégateur indépendant, passerelle de sortie vers les annonces originales, limites de responsabilité |
![]() Page gestionnaire ( /g/aalto) — la vitrine réclamable d'un gestionnaire immobilier : ses annonces actives, ses statistiques et le lien vers son site |
![]() Page ville ( /ville/montreal) — page SEO en SSR léger : loyers médians locaux, filtres par type (3½, 4½…) et annonces de la ville |
Nouveautés front-end (2026-08-25)
- Refonte éditoriale v2 — accueil et fiche logement en DA premium « sans boîtes » : héro typographique géant, compteurs live en phrase, recherche soulignée, grille magazine, sections à filets et icônes contextuelles.
- KA Tabbar / nav mobile v2 — navigation mobile plein écran, galerie + prix toujours premiers dans le DOM (ordre DOM = ordre visuel).
- Court terme enrichi — hôtellerie du Québec en réservation directe (1 922 fiches, réseau Origine), 21 nouveaux connecteurs, DA éditoriale alignée sur l'accueil.
- Annuaire des déménageurs — 565 entreprises, partagé avec Immo·Ka.
- Widget ka-agent v4 — cartes d'annonces cliquables (ka-card) et choix en boutons (ka-choix).
🗄️ Les captures d'époque sont conservées dans
docs/archive/; les captures iOS restent dansdocs/screenshots/ios/.
App iOS native
![]() Accueil |
![]() Découverte |
![]() Carte |
![]() Fiche logement |
![]() Statistiques |
![]() Sources |
Fonctionnalités
- Recherche filtrée — ville, quartier, type (3½, 4½…), loyer min/max, animaux, meublé, superficie, texte libre.
- Vue carte 3D — Lou-Ka Maps (framework
@groupe-ka/ka-maps, moteur Mapbox GL JS) : clusters par prix moyen, « Rechercher dans cette zone », bascule 3D/2D, synchro liste ↔ carte. - Fiches complètes — toutes les photos, digest structuré de la description (text mining regex FR, aucun LLM), badge marché, historique de prix (
price_log), fiche PDF avec QR code. - Couches de données de quartier — recensement 2021, registre des loyers (57 433 déclarations géocodées), inondation (BDZI), criminalité (SPVM, 12 mois par catégorie), qualité de l'air (RSQAQ/PST), prix de l'essence, commerces et transport en commun (métro/REM aux couleurs officielles), estimation Hydro-Québec live, KA Scores (96,1 % du parc couvert au 2026-08-28).
- Location court terme — section isolée
/court-terme(sous-systèmelouka/shortterm/, API/api/ct/*) : chalets, Airbnb (quadrillage carte quadtree limité à la frontière du Québec), Vrbo, Booking… 52 440 séjours, 47 sources actives, 36 régions (au 2026-08-28) ; SEO complet (JSON-LDVacationRental, sitemapssitemap-ct-N.xml). - Pages villes SEO —
/villes,/ville/{slug},/ville/{slug}/{type}en SSR léger, sitemaps dynamiques (chunks de 10 000), JSON-LD (RealEstateListing+OfferCAD), vrais404/410. - Observatoire du marché — KPI temps réel, loyers médians par région/ville/taille, panneaux territoire (registre des loyers, population, essence), rapport de marché PDF multi-pages (
/api/stats/rapport.pdf) et rapports PDF personnalisés (catalogue +ReportBuilder). - Registre des sources — chaque gestionnaire, son statut, sa dernière synchro ; toute source non connectable est documentée avec sa raison dans
data/sources.json(503 entrées recensées). - Qualité éditoriale — porte de pertinence (quarantaine des stationnements, garages, locaux commerciaux, locations à la nuit) : 62 171 annonces publiées / 6 754 en quarantaine, complétude moyenne 90,5 % (au 2026-08-28).
- Comptes & SSO KA — « Se connecter avec KA » via le hub groupe-ka.com (JWT HS256,
ka_idémis par le hub) + Google OAuth direct ; favoris synchronisés vers « Mon univers Ka » ; pages gestionnaires réclamables (/g/{source_id}). - Widget KA Agent — bulle de chat IA du Groupe KA intégrée au site (déplaçable, position mémorisée).
- PWA installable + app iOS SwiftUI 100 % native (dépôt séparé
lou-ka-iossur spbgit). - Robustesse — garde-fou anti-dérive (
DRIFT_RATIO = 0.25,louka/db.py) : si une source retourne soudainement beaucoup moins d'annonces, les retraits sont suspendus au lieu de vider l'inventaire ; chaîne de fetch anti-bot résiliente (Oxylabs → Scrapfly → Bright Data).
API (endpoints principaux)
Servis par louka/web.py (FastAPI) sur le port 8095.
Location long terme
| Méthode | Endpoint | Rôle |
|---|---|---|
GET |
/api/search |
recherche unifiée liste ↔ carte (mêmes filtres, même compteur) |
GET |
/api/listings · /api/listings/{uid} |
annonces paginées + fiche détaillée (410 Gone si retirée) |
GET |
/api/listings.geojson |
flux GeoJSON pour la carte 3D |
GET |
/api/listings/{uid}/pdf |
fiche PDF avec QR code |
GET |
/api/facets · /api/sources |
facettes de filtres, registre des sources |
GET |
/api/fairvalue/{uid} |
badge marché (juste prix) d'une annonce |
GET |
/api/rdl · /api/inondation · /api/air · /api/gaz · /api/commerces · /api/hydro |
couches de quartier : registre des loyers, BDZI, qualité de l'air, essence, commerces/transport, estimation Hydro-Québec |
GET |
/api/kascores/stats |
statistiques du moteur KA Scores |
GET |
/api/stats · /detailed · /dashboard · /report · /catalog |
observatoire : KPI, détail, tableau de bord, rapports |
POST |
/api/stats/report/custom |
rapport PDF personnalisé (ReportBuilder) |
GET |
/api/stats/rapport.pdf |
rapport de marché PDF multi-pages |
POST |
/api/sync |
déclenchement d'une synchronisation |
GET |
/doc/ |
guide d'utilisation en ligne |
Location court terme (/api/ct, préfixe du sous-système louka/shortterm/)
| Méthode | Endpoint | Rôle |
|---|---|---|
GET |
/api/ct/listings · /api/ct/listings/{uid} |
séjours paginés + fiche détaillée |
GET |
/api/ct/listings.geojson |
flux GeoJSON de la carte court terme |
GET |
/api/ct/facets · /api/ct/sources |
facettes, registre des sources court terme |
GET |
/api/ct/stats |
KPI court terme (total, sources, régions, prix/nuit) |
POST |
/api/ct/sync |
déclenchement d'une synchronisation court terme |
Architecture
Pipeline : connecteurs → normalisation → déduplication → SQLite → API/SSR/frontend.
- Backend Python 3.14 / FastAPI / Uvicorn (
louka/web.py) : API JSON + service du build Vite + SSR SEO (louka/seo.py). - SQLite (WAL) (
louka/db.py) : migrations auto, upsert par hash de contenu, anti-dérive ; bases annexes dansdata/(quartier, air, gaz, hydro, commerces, inondation…). - 431 connecteurs auto-découverts : 384 long terme (
louka/connectors/) + 47 court terme (louka/shortterm/connectors/), extraction directe / Scrapfly / Bright Data / acteurs Apify maison selon la source (les 6 connecteurs à rendu JS ont migré de Firecrawl vers Scrapfly le 2026-08-27). - Enrichissement : géocodage (Nominatim + Adresses Québec), POI OSM, stats de quartier, KA Scores, estimation Hydro-Québec.
- Frontend React 18 + Vite + TypeScript (
frontend/), cartographie@groupe-ka/ka-maps(Mapbox GL). - CLI
run.py:sync·watch·sync-ct·watch-ct·serve·geocode·quality·imgaudit·fairvalue·poi·quartier·kascores·rdl·air-refresh·gaz-refresh·hydro-precompute·record(fixtures HTTP pour tests hors-ligne).
Processus PM2 sur le nœud :
| Processus | Commande réelle | Rôle | Cadence |
|---|---|---|---|
lou-ka-web |
.venv/bin/python run.py serve 8095 |
serveur FastAPI/Uvicorn (API + frontend + SSR) sur le port 8095 | continu |
lou-ka-sync |
.venv/bin/python run.py watch 60 |
boucle de resynchronisation des connecteurs long terme | cycle de 60 min |
lou-ka-ngrok |
ngrok http --url=www.lou-ka.com 8095 |
tunnel ngrok vers www.lou-ka.com | continu |
La section court terme se resynchronise via run.py watch-ct (défaut 360 min) ou à la demande (run.py sync-ct, POST /api/ct/sync).
Démarrage rapide
# Backend (Python 3.14)
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
# Frontend (nécessite le framework ka-maps bâti à côté : ../ka-maps)
cd frontend && npm install && npm run build && cd ..
.venv/bin/python run.py sync # ingestion (toutes les sources ou une liste)
.venv/bin/python run.py sync-ct # ingestion court terme
.venv/bin/python run.py serve 8095 # API + frontend sur http://localhost:8095
.venv/bin/python run.py watch 60 # resynchronisation en boucle (minutes)
# Tests (pytest + fixtures HTTP rejouables hors-ligne)
.venv/bin/python -m pytest tests/En développement frontend : cd frontend && npm run dev (Vite sur :5173, proxy /api).
Variables d'environnement
Aucun secret dans le repo — tout passe par l'environnement du nœud. Noms attendus :
| Variable | Rôle |
|---|---|
SCRAPFLY_KEY · FIRECRAWL_API_KEY · APIFY_TOKEN |
extraction anti-bot / rendu / acteurs Apify maison |
BRIGHTDATA_API_KEY · BRIGHTDATA_ZONE |
Web Unlocker Bright Data (repli anti-bot) |
OXYLABS_PROXY · OXYLABS_PROXY_USER · OXYLABS_PROXY_PASS |
proxies résidentiels (1er maillon de la chaîne de fetch) |
GOOGLE_CLIENT_ID · GOOGLE_CLIENT_SECRET |
connexion Google OAuth directe |
KA_SSO_SECRET · KA_HUB_URL · SESSION_SECRET |
SSO KA ID (JWT HS256 partagé avec groupe-ka.com) + sessions |
HQ_CAPTCHA_PROVIDER · HQ_CAPTCHA_KEY |
résolution reCAPTCHA de l'estimation Hydro-Québec |
LOUKA_BASE_URL |
URL publique de base (liens PDF, sitemaps) |
LOUKA_<SOURCE>_* (≈70 variables) |
tuning par connecteur : limites de détail, TTL, pages max, cadence (ex. LOUKA_KIJIJI_DETAIL_LIMIT, LOUKA_FBMP_CITIES, LOUKA_AIRBNB_BUDGET) |
VITE_MAPBOX_TOKEN (frontend) |
jeton public Mapbox de la carte 3D |
Données & conformité
- Agrégateur indépendant : aucune affiliation avec les gestionnaires immobiliers ; chaque fiche renvoie vers l'annonce originale via la passerelle de sortie transparente
/passerelle/{uid}(mention affichée au pied du site). - Provenance : sites publics des gestionnaires et portails d'annonces (281 sources recensées dans
data/sources.json, statut et raison documentés pour chaque source non connectable) ; couches de quartier issues de données ouvertes (recensement 2021, registre des loyers, BDZI, SPVM, RSQAQ, Régie de l'énergie, OSM). - Cadence : resynchronisation long terme en boucle de 60 min (
lou-ka-sync), court terme par cycles de 360 min ; détection de changement par hash de contenu → ajouts, mises à jour et retraits automatiques. - Cycle de vie honnête : une annonce retirée chez la source répond
410 Goneet sort des sitemaps ; le garde-fou anti-dérive suspend les retraits massifs suspects plutôt que de vider l'inventaire. - Qualité : porte de pertinence (quarantaine du hors-périmètre : stationnements, commerciaux, nuitées) et score de complétude par annonce (moyenne 91,4 %).
Structure du repo
lou-ka/
├── run.py # point d'entrée CLI (sync / watch / sync-ct / watch-ct / serve / geocode / poi / quartier / record)
├── louka/ # paquet backend : web, seo, db, ingest, normalize, textmine, auth, kascores…
│ ├── connectors/ # 384 connecteurs long terme auto-découverts
│ └── shortterm/ # sous-système court terme isolé (db, ingest, web + 47 connecteurs)
├── frontend/ # React 18 + Vite + TypeScript (pages, composants, kamaps/) + public/doc/ (guide)
├── data/ # sources.json (registre, 503 entrées) + bases SQLite de prod (gitignorées)
├── scripts/ # build recensement/contexte/environnement, docs connecteurs, screenshots, check-order
├── tests/ # pytest + fixtures HTTP rejouables hors-ligne
├── actors/ # acteurs Apify d'appoint (ka-fb-marketplace, ka-apartments-com…)
├── reports/ # audits (fiches connecteurs, expansion par région, quartier…)
└── docs/ # captures d'écran + docs connecteurs + ka-mapsHistorique
Repère des jalons (128 commits depuis la naissance) :
| Date | Jalon |
|---|---|
| 2026-08-06 | naissance du projet : agrégateur Québec/Lévis/Grand Montréal, page Statistiques (fb48938, ece6ed0) |
| 2026-08-08 | Mission 1a — couche commune : schéma enrichi, normalisation centrale, robustesse, tests (7323079) |
| 2026-08-19 | KA Scores calculés sur 94,7 % du parc + standard « ordre des sections = ordre du DOM » (747f631, a6e30ef) |
| 2026-08-21→22 | porte de pertinence (quarantaine hors-périmètre) + chaîne de fetch anti-bot Oxylabs→Scrapfly→Bright Data + acteurs Apify maison FB Marketplace / Apartments.com (8547737, 8598785, e7f4876) |
| 2026-08-22→23 | section « Location court terme » : sous-système isolé, Airbnb en quadrillage carte, 38 sources recensées, SEO complet (38b708b, 5c571bc, 63456a0) |
| 2026-08-23 | couches de quartier : registre des loyers (57 433 déclarations), inondation BDZI, criminalité SPVM, air, essence, commerces/transport, estimation Hydro-Québec live + rapports PDF personnalisés (604455e → 4d17c17, 834c92c) |
| 2026-08-24 | page documentation /doc + guide PDF + README v2/v3 (963ba8f, 4fa8714) |
| 2026-08-27 | expansion Ontario suspendue (rien d'effacé, voir docs/ONTARIO-PAUSE.md) + migration Firecrawl → Scrapfly des 6 connecteurs à rendu JS (54f25fd, a4ef788) |
| 2026-08-28 | visite guidée « page par page » : 10 captures pleine page du site publié dans docs/screenshots/ |
Documentation
- Guide en ligne : www.lou-ka.com/doc/ — à quoi sert le site, le parcours en 4 étapes (recherche → résultats → fiche → /stats), d'où viennent les données, FAQ.
- Guide PDF : lou-ka-documentation.pdf — la même documentation, téléchargeable.
- Les captures du guide sont versionnées dans
frontend/public/doc/img/(etape1 → etape4).
Développement (remote-first)
La source de vérité est le repo git sur le nœud M3U96b (~/apps/lou-ka) — on n'édite jamais les copies laptop. Toute modification se fait sur le nœud via SSH : édition, build, pm2 restart, puis commit/push depuis le nœud.
- Remote
origin= spbgit (git perso git.spboucher.ai, bare repos sur M3U96a). Pas GitHub. - L'agent forwarding SSH est actif : le
git push origin mainfonctionne pendant une session SSH depuis le laptop.
pm2 restart lou-ka-web # après un changement en productionDéploiement
- Nœud : M3U96b (Mac Studio, cluster MacLustr) — répertoire
~/apps/lou-ka - Port : 8095 (local, exposé uniquement via le tunnel)
- Processus PM2 :
lou-ka-web(serveur) +lou-ka-sync(synchro) +lou-ka-ngrok(tunnel) - Domaine : https://www.lou-ka.com (tunnel ngrok)
Écosystème Groupe KA
| Plateforme | Vocation |
|---|---|
| groupe-ka.com | portail du groupe et compte unique KA ID |
| lou-ka.com | logements à louer (ce repo) |
| immo-ka.com | propriétés à vendre |
| vrai-prix.com | estimation immobilière |
| auto-ka.com | véhicules |
| fabri-ka.com | produits québécois |
| food-ka.com | épicerie et alimentation |
| resto-ka.com | restaurants |
| sorti-ka.com | sorties et événements |
| job-ka.com | emplois |
| crea-ka.com | créateurs de contenu |
| trouve-ka.com | petites annonces |
| api-ka.com | API de données |
Contact
Simon-Pierre Boucher — fondateur, Groupe KA 📧 contact@spboucher.ai
© Groupe KA — Simon-Pierre Boucher · contact@spboucher.ai Ce repo vit sur spbgit (git.spboucher.ai).






























