Simon-Pierre Boucher
All apps & projects
Web Platform
TypeScript + Python

Immo-Ka

Every property for sale in Québec. One place.

Immo-Ka aggregates 57,900+ active listings from 22 brokerage banners and 159 sub-agencies into a single searchable, mappable interface. Live at www.immo-ka.com.

57,900+

Active listings

95

Source connectors

22

Brokerage banners

159

Sub-agencies

2,825

Cities covered

≈$683K

Average asking price

Overview

Immo-Ka is an independent aggregator of houses, condos, plexes, and lots for sale across Québec. Instead of juggling the sites of RE/MAX, Royal LePage, Sutton, Via Capitale, Century 21, and dozens of other banners — each with its own navigation and filters — buyers search 57,900+ active listings from 22 banners, 159 sub-agencies, and 2,825 cities in one place. Every property is normalized to a single schema, deduplicated by Centris number, and links back to the original agency listing.

Since agency sites offer no webhooks, Immo-Ka reproduces the equivalent: 95 connectors (one adapter per source, using internal JSON APIs, JSON-LD, sitemaps, or Firecrawl for anti-bot SPAs) sync periodically, and content hashing detects new listings, price changes, and removals automatically, with a two-sync grace period and per-source drift detection. Listings are then enriched with cached geocoding, nearby points of interest, StatCan and INSPQ neighbourhood statistics, price history, and Vrai-Prix market-value estimates from a hedonic model plus comparables.

The backend is Python and FastAPI over SQLite in WAL mode; the frontend is React 18 with Vite, TypeScript, and Ka Maps, the Groupe KA mapping framework built on Mapbox GL 3D. A server-side SEO renderer serves complete HTML with JSON-LD and sitemaps on every route, including 1,589 programmatic city pages. The app runs on MacLustr cluster node M4M64a under PM2 as three processes — web server, sync watcher, and ngrok tunnel — exposed at www.immo-ka.com.

Key Features

Search and filters

Free-text search (address, city, MLS number) plus filters for city, sector, type, agency, price, bedrooms, bathrooms, and area — with shareable state kept in the URL.

Ka Maps 3D map

In-house Groupe KA mapping framework on a Mapbox GL 3D engine: live price clusters, markers colored by gap to the Vrai-Prix estimate, search-as-you-move, and a 2D/3D toggle.

Vrai-Prix estimates

Market-value estimation from a hedonic model plus comparables: a P10–P90 gauge, estimate versus asking-price markers, and an overpriced / aligned / below-estimate verdict on each listing.

Full agency registry

A banner-to-sub-agency registry covering 22 banners and 159 sub-agencies with deduplicated listing counts; sub-agency connectors act as automatic backup if a central feed fails.

Continuous change detection

Periodic sync plus content hashing detects additions, price changes, and sold properties automatically, with a grace period against transient failures and per-source drift detection.

Programmatic SEO

Full server-rendered HTML on every route: 1,589 city pages, 2,702 city-and-type pages, JSON-LD RealEstateListing markup, auto-regenerated sitemaps, and true 410/404 lifecycle handling.

How It Works

  1. Source connectors

    95 connectors — one adapter per agency or platform — pull listings via internal JSON APIs (Meilisearch, Algolia, source.immo, wp-json), JSON-LD, sitemaps, or Firecrawl for SPA and anti-bot sites, with auto-generated registries for multi-office banners.

  2. Normalization

    Every listing is mapped to a single PropertyListing schema: address, sector, city, region, canonical type, price, bedrooms and bathrooms, areas, year, MLS number, broker, room dimensions, all photos, and structured features.

  3. Diff and dedup engine

    SQLite in WAL mode with content-hash upserts detects new, changed, and removed properties, applies a two-sync grace period and per-source drift detection, logs price history, and deduplicates across agencies by Centris number.

  4. Enrichment

    Listings are enriched with cached geocoding, nearby amenities (POI), StatCan census and INSPQ heat-island neighbourhood statistics, and Vrai-Prix market-value estimates.

  5. Delivery

    A FastAPI layer serves listings, facets, stats, and bbox-bounded GeoJSON to the React 18 + Ka Maps frontend, while a server-side SEO renderer serves complete HTML and sitemaps to search engines; a PM2 watcher keeps everything in sync.

Tech Stack

Backend

Python
FastAPI
SQLite (WAL)
Firecrawl

Frontend

React 18
TypeScript
Vite
Ka Maps (Mapbox GL 3D)

Deployment

MacLustr node M4M64a
PM2 (web + sync + tunnel)
ngrok
www.immo-ka.com

Highlights

  • 95 connectors (31 modules plus auto-generated sub-agency registries) cover 22 banners including RE/MAX, Royal LePage, Sutton, Via Capitale, Century 21, DuProprio, Kijiji, and LesPAC.
  • Cross-agency deduplication by Centris number lets 60+ sub-agency connectors serve as failover without double-counting when a banner's central feed goes down.
  • Every listing carries a Vrai-Prix gauge with a P10–P90 estimate range and an overpriced / aligned / below-estimate verdict.
  • The neighbourhood block combines StatCan census dissemination-area data (median income, average rent, renter share) with INSPQ heat-island indicators.
  • Server-rendered SEO produces 1,589 city pages and 2,702 city-and-type pages, with sitemaps covering all 57,900+ listing pages.
  • KA ID single sign-on and hub-stored favorites connect Immo-Ka to the whole Groupe KA family, including Lou-Ka, Auto-Ka, and Vrai-Prix.

Explore Immo-Ka

Every Québec property for sale, one place — the full source is on GitHub.