SPB Git

spb/immo-ka Public

Immo-Ka — agrégateur des propriétés à vendre au Québec (73 connecteurs, ~40 000 annonces, React+FastAPI)

Python 64% TypeScript 21.1% CSS 14.3% HTML 0.6%
ZIP
NameLast commitUpdated
.claude feat: initial commit 1 h ago
data feat: initial commit 1 h ago
docs feat: initial commit 1 h ago
frontend feat: initial commit 1 h ago
immoka feat: initial commit 1 h ago
scripts feat: initial commit 1 h ago
.gitignore feat: initial commit 1 h ago
README.md feat: initial commit 1 h ago
requirements.txt feat: initial commit 1 h ago
run.py feat: initial commit 1 h ago
README.md

# Immo·Ka

# Toutes les propriétés à vendre du Québec. Un seul endroit.

www.immo-ka.com

Python FastAPI React MapLibre SQLite

Propriétés Connecteurs Agences Couverture MàJ

Agrégateur indépendant des maisons, condos et terrains à vendre au Québec — un connecteur dédié par agence de courtage, chaque propriété normalisée vers un schéma unique, avec galerie photo, caractéristiques complètes et lien direct vers l'annonce originale de l'agence. Toujours à jour, automatiquement.


# Aperçu

Accueil — liste, filtres & carte Fiche propriété — galerie & specs
Accueil Immo-Ka Fiche propriété

# Pourquoi Immo-Ka ?

Chercher une propriété à vendre au Québec, c'est jongler entre les sites de RE/MAX, Royal LePage, Sutton, Via Capitale, Century 21 et des dizaines d'autres bannières — chacun avec sa navigation, ses filtres, son format. Immo-Ka retourne le problème : un connecteur par agence visite chaque source, normalise chaque propriété vers un schéma unique, et détecte les changements en continu.

Les sites d'agences n'offrent pas de webhooks. Immo-Ka reproduit l'équivalent : synchronisation périodique + hash de contenu → ajouts, changements de prix et retraits (propriété vendue) détectés automatiquement.

C'est le pendant « à vendre » de Lou-Ka (location) — même architecture, schéma adapté à la vente.

# Couverture (métriques en direct)

Agence Propriétés Méthode technique
RE/MAX Québec ~25 300 Meilisearch public + sharding FSA postal + page détail
Via Capitale ~5 250 portail central (Firecrawl stealth, pagination criteresJson)
Sutton ~4 500 sitemap sitemap_inscription.cfm → n° Centris
Proprio Direct ~2 440 API interne JSON
Engel & Völkers ~1 240 property-sitemap → JSON-LD
Royal LePage ~1 000+ recherche par ville filtrée QC + sharding + dédup MLS
Century 21 ~1 600 sous-agences source.immo (« All Quebec »)
Keller Williams (Urbain + Distinction) ~510 HTML rendu serveur + sitemap
Barnes Québec ~340 Algolia + page détail
Profusion (Christie's) ~360 WordPress + JSON-LD
M Immobilier · Vendirect · Sotheby's · L'Expert PM ~180 Centris / source.immo / JSON-LD
Sous-agences RE/MAX / Via Capitale / Century 21 backup 60+ connecteurs *_ag_*, dédup par n° Centris

≈ 40 000 propriétés dédupliquées, mises à jour automatiquement. Les sous-agences servent de plan B : si le flux central d'une bannière tombe, elles prennent le relais sans double-comptage (déduplication par numéro Centris).

# Architecture

flowchart LR
    subgraph Sources["Agences de courtage du Québec"]
        S1["RE/MAX · Royal LePage · Sutton<br/>Via Capitale · Century 21 · Proprio Direct<br/>Engel & Völkers · Barnes · Profusion<br/>… 73 connecteurs"]
    end
    subgraph ImmoKa["Immo-Ka"]
        C["Connecteurs<br/><i>1 adaptateur / agence</i>"] --> N["Normalisation<br/><i>schéma PropertyListing</i>"]
        N --> D[("SQLite WAL<br/>hash + diff + dédup Centris")]
        D --> A["API FastAPI<br/>/api/listings · /api/facets · geojson"]
        A --> F["React 18 + Vite + MapLibre<br/>liste · carte · fiche détaillée"]
    end
    W["⏱ Watcher (PM2)"] -.-> C
    S1 --> C
    F --> U["🔑 Acheteur"]
Couche Rôle Fichiers
Connecteurs 1 module par agence : API JSON interne (Meilisearch, Algolia, source.immo, wp-json), JSON-LD, sitemap, ou Firecrawl pour les sites SPA/anti-bot immoka/connectors/*.py
Schéma PropertyListing : adresse, secteur, ville, région, type, prix, chambres/SdB, superficie, terrain, année, MLS, courtier, pièces (dimensions), toutes les photos immoka/schema.py
Diff engine upsert par hash de contenu, délai de grâce, détection de dérive, historique de prix, déduplication inter-agences par n° Centris immoka/db.py, immoka/web.py
API filtres ville/secteur/région/type/agence/prix/chambres, facettes, stats, GeoJSON immoka/web.py
Frontend React 18 + Vite + TS + react-router + MapLibre : accueil (liste/carte), fiche par propriété (galerie + lightbox, caractéristiques, pièces, historique de prix, courtier, mini-carte), Stats, Agences frontend/

# Démarrage rapide

bash
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt

# frontend
cd frontend && npm install && npm run build && cd ..

# (optionnel) sites JavaScript / anti-bot
echo "FIRECRAWL_API_KEY=fc-votre-cle" > .env

.venv/bin/python run.py list              # connecteurs enregistrés
.venv/bin/python run.py sync              # toutes les agences (ou: sync remax_quebec sutton)
.venv/bin/python run.py serve 8090        # API + frontend → http://localhost:8090
.venv/bin/python run.py watch 180         # synchronisation en boucle

# Ajouter une agence

  1. Créer immoka/connectors/<id>.py : sous-classe de BaseConnector, définir source_id, implémenter fetch() -> list[PropertyListing]. Le registre est auto-découvrant — aucun fichier partagé à modifier.
  2. Ajouter l'entrée dans data/sources.json.
  3. Tester : .venv/bin/python run.py sync <id>.

Pour une bannière à sous-agences (RE/MAX, Via Capitale, Century 21), un module génère un connecteur par sous-agence depuis un registre JSON — nommer les source_id en <banniere>_ag_<slug> active automatiquement la déduplication.

# Déploiement

Déployé sur le cluster MacLustr (nœud M4M64a) via PM2 : immo-ka-web (API + frontend), immo-ka-sync (watcher horaire), immo-ka-ngrok (tunnel www.immo-ka.com). Base SQLite en mode WAL pour les accès concurrents.


# Auteur

Simon-Pierre Boucher 📧 contact@spboucher.ai

Agrégateur indépendant — les annonces proviennent des sites publics des agences de courtage et sont rafraîchies automatiquement ; chaque fiche renvoie vers l'annonce originale de l'agence.