Simon-Pierre Boucher
All apps & projects
Lou-Ka icon
Web Platform
Python

Lou-Ka

Every rental in Quebec. One search.

An independent aggregator that turns 70+ scattered property-manager websites into one continuously synchronized, searchable rental market for the whole province.

255

sources catalogued

194

active connectors

8,000+

listings aggregated

≈30

lines to add a connector

1 day

from market research to production

Overview

Apartment hunting in Quebec means opening dozens of manager websites, each with its own navigation, filters, and formats. Lou-Ka inverts the problem: a dedicated Python connector per property manager visits each site, normalizes every listing into a single Listing schema — address, sector, unit type, price, availability, amenities, and every photo — and links back to the original ad.

Agency sites offer no webhooks, so Lou-Ka rebuilds the equivalent: periodic synchronization plus content hashing detects additions, updates, and removals automatically. A listing that disappears from the source disappears from Lou-Ka. An hourly watcher under PM2 keeps the whole inventory current without human intervention.

The system is built for polite, resilient scale: throttled requests with an identified User-Agent, no invented prices, per-listing fault isolation, and auto-discovering connectors — dropping a ~30-line module into the connectors folder is all it takes to onboard a new manager.

Key Features

One connector per manager

A dedicated Python adapter per property manager handles server-rendered HTML, internal JSON APIs (Building Stack, RealVuu, Planpoint, Rentsync, and more), or Firecrawl for Cloudflare-protected sites.

Webhook-equivalent change detection

Hourly synchronization with content hashing upserts new, modified, and removed listings automatically — vanished listings are deactivated, never left stale.

Single normalized schema

Every listing lands in one standardized Listing model: address, sector, city, Quebec unit types (3½…), price, availability, amenities, and all images.

Faceted search API

FastAPI endpoints filter by city, sector, unit size, price range, manager, and full-text query, with facets, stats, and an on-demand sync trigger.

Auto-discovering connector registry

Drop a ~30-line module in the connectors folder and it registers itself — no shared file to modify, and a broken connector never affects the others.

Province-wide coverage

Quebec City, Lévis, and Greater Montreal managers — from Logisco and Cogir to Akelius, CAPREIT, Minto, and Devimco — plus documented reasons for every non-connectable source.

Editorial-sharp PWA frontend

React 18 + Vite interface with Space Grotesk type, offset shadows, real-time ticker, mobile bottom sheet, photo galleries, and installable PWA support.

Polite and faithful by design

Requests throttled at 0.5 s minimum with crawl guardrails; prices are never invented — if a source shows no price, the field stays null.

How It Works

  1. Connectors

    One Python module per property manager fetches listings from rendered HTML, internal JSON APIs, or Firecrawl, with per-listing error isolation.

  2. Normalization

    Raw listings are mapped to a single standardized Listing schema — city inference, Quebec unit-type normalization, price parsing, and complete image sets.

  3. Diff engine

    SQLite upserts keyed by content hash classify each listing as new, modified, or gone; removed listings are deactivated and every sync is logged.

  4. API layer

    FastAPI serves filtered search, per-listing detail, facets, the 74-manager source registry with counters, provincial stats, and a background sync trigger.

  5. Frontend

    A React 18 + Vite PWA renders the aggregated market with real-time ticker, filters, galleries, and mobile-first bottom-sheet navigation.

  6. Production loop

    Three PM2 processes — web server, hourly watcher, ngrok tunnel — keep the site self-maintaining: only code gets pushed, the server refreshes its own data.

Tech Stack

Backend

Python 3.14
FastAPI
SQLite

Frontend

React 18
Vite
TypeScript
PWA

Ingestion

Per-site connectors
Firecrawl
Content-hash diff engine

Operations

PM2
ngrok
Hourly watcher

Highlights

  • Designed, built, and deployed to production in a single day — including market research verifying 74 property managers.
  • 255 rental sources catalogued and 194 active connectors, aggregating 8,000+ listings across all of Quebec.
  • Adding a new property manager takes roughly 30 lines of Python thanks to auto-discovering connector registration.
  • Content hashing recreates webhooks that agency sites never offer: additions, updates, and removals detected automatically.
  • Every non-connectable source is documented with the specific reason (no prices shown, empty inventory, placeholder site).
  • Strict fidelity rule: no invented prices, and every listing links back to the manager's original ad.

Explore Lou-Ka

Every Quebec rental, one place — the full source is on GitHub.