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
Connectors
One Python module per property manager fetches listings from rendered HTML, internal JSON APIs, or Firecrawl, with per-listing error isolation.
Normalization
Raw listings are mapped to a single standardized Listing schema — city inference, Quebec unit-type normalization, price parsing, and complete image sets.
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.
API layer
FastAPI serves filtered search, per-listing detail, facets, the 74-manager source registry with counters, provincial stats, and a background sync trigger.
Frontend
A React 18 + Vite PWA renders the aggregated market with real-time ticker, filters, galleries, and mobile-first bottom-sheet navigation.
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
Frontend
Ingestion
Operations
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.