Python 68.8%
TypeScript 18.6%
CSS 8.7%
JavaScript 3.3%
HTML 0.6%
1<!-- Author: Simon-Pierre Boucher — contact@spboucher.ai -->23<p align="center">4 <img src="frontend/public/og.png" alt="Rent-Ka — Apartments and homes for rent across Canada" width="720">5</p>67# Rent-Ka8910> ⚠️ **Application archivée le 2026-09-04** — l'URL live (https://www.rent-ka.com) est hors fonction ; l'app a été retirée du cluster MacLustr (registre mld, admin-ka, gardiens, site groupe-ka). Ce dépôt spbgit reste la source de vérité pour une remise en service.11**[www.rent-ka.com](https://www.rent-ka.com)** — Apartments and homes for rent12across **Canada outside Québec** (Ontario first, national expansion live). A13**Groupe KA** service, sister site of [Lou-Ka](https://www.lou-ka.com) (Québec14rentals) and [House-Ka](https://www.house-ka.com) (Canadian homes for sale).1516Rent-Ka continuously aggregates rental listings published by Canadian property17managers, REITs, real-estate brokers and national portals: every listing keeps18its photos, price, availability and a **direct link to the original ad**.19Groupe KA is a content aggregator — we sell nothing, rent nothing and are not20a party to any transaction.2122**Live snapshot (2026-08-28)** · ~76,000 rentals indexed · **767 registered23connectors** · listings in 9 provinces + 2 territories (all of Canada except24Québec) · average rent **$2,180/month** · ~1,800 cities covered · top markets:25Toronto, Calgary, Edmonton, Ottawa, Hamilton, Vancouver, Mississauga, London,26Winnipeg, Kitchener.2728---2930## Table of contents31321. [Guided tour (screenshots)](#guided-tour)332. [Features](#features)343. [Architecture](#architecture)354. [Connectors & data sources](#connectors--data-sources)365. [API & routes](#api--routes)376. [Canonical unit types](#canonical-unit-types-english)387. [Run](#run)398. [Tests](#tests)409. [Deployment](#deployment)4110. [Development workflow (remote-first)](#development-workflow-remote-first)4211. [Expansion playbook](#expansion-playbook)4312. [The ·KA ecosystem](#the-ka-ecosystem)4413. [Contact](#contact)4546---4748## Guided tour4950Ten screenshots of the production site (captured 2026-08-28, live at51[www.rent-ka.com](https://www.rent-ka.com)).5253### 1 — Home page54555657The landing page: live counters (rentals indexed, sources, last sync, average58rent), a **Browse by province** grid covering every province and territory59outside Québec (Ontario, Alberta, British Columbia, Manitoba, Saskatchewan,60Nova Scotia, New Brunswick, PEI, Newfoundland and Labrador, NWT, Nunavut), a61city search box, and the ticker of per-province listing counts. The cookie62banner reflects the no-tracker policy: preferences live in `localStorage`63only.6465### 2 — Listing page (price analysis)66676869A listing detail page (`/listing/{uid}`): photo gallery with thumbnails,70advertised price, and the **Rent-Ka price analysis** panel — estimated fair71value with a confidence range, deviation vs the market ("Above market +8 %"),72a histogram of comparable listings, and the **Listing history** card (tracked73since, days online, observed price changes). The fair-value estimate is74computed continuously from comparable market listings.7576### 3 — Rental market statistics77787980The `/stats` observatory: active listings, new/removed listings over the81selected period, average and median rent, quality quarantine size,82below-market listings, active connectors and covered cities — with period83presets (today → all), gauge charts for data-quality KPIs (geocoded share,84average record completeness…) and downloadable **PDF reports** (full report,85themed reports, custom report builder).8687### 4 — Aggregated sources registry88899091The public `/sources` page: every property manager and platform tracked by92Rent-Ka, with connection status, active listing count and last sync time —93REALTOR.ca broker listings, Cogir, CAPREIT, Minto, Realstar, Hazelview and94hundreds more. Transparency is a core Groupe KA principle: each "connected"95source is synced periodically by a dedicated connector.9697### 5 — Privacy9899100101"Your privacy, kept simple": no advertising pixel, no third-party cookies, no102data resale. The only browser storage is `localStorage` for consent, search103filters and list/map preference. Written in plain English with a104Loi 25-compliant contact for the responsible person.105106### 6 — Terms of use107108109110The `/terms` page states what Rent-Ka is (an independent aggregator that111links back to the original ad) and what it is not (a landlord, a broker or a112party to any rental transaction), plus indexing-robots transparency.113114### 7 — Property manager profile115116117118Public manager pages (`/g/{source_id}`, here Accommod8u): all active rentals119by that manager with photos, prices and unit types — plus (see capture 8) an120automatically matched Google Business profile with review statistics.121122### 8 — Listing page (details & manager panel)123124125126Further down a listing page: normalized characteristics (unit type,127availability date, pets, area), description with a link to the source's128original text, amenities, practical details, the PDF listing sheet download,129and the **"Who manages this rental?"** panel — manager profile matched to130Google Maps with rating, review distribution and recent excerpts, including131the confidence score of the automatic match.132133### 9 — Map view (Ka Maps)134135136137The split list/map view (`/?view=map`), powered by the shared138**@groupe-ka/ka-maps** framework (Mapbox): clustered markers across the whole139country, price labels, "search as I move the map", 3D toggle and drawing140tools. The list panel stays in sync with the viewport.141142### 10 — Contact143144145146The `/contact` page: Groupe KA addresses (projects & data partnerships, media,147legal/privacy), the aggregator disclaimer, and links to the 16 sites of the148·KA ecosystem.149150---151152## Features153154- **Search & browse** — full-text search, facet filters (city, unit type,155 price range, availability), browse by province and by city, list or map156 view, sort by recency/price.157- **Map** — Ka Maps (Mapbox GL) with clustering, price pins, viewport-synced158 list, polygon drawing and 3D buildings.159- **Listing pages** — photo gallery, normalized attributes, description,160 amenities, direct link to the original ad, downloadable PDF sheet,161 SEO-friendly server-rendered fallback.162- **Fair rental value** — continuous market-comparables model with range,163 deviation badge (above/below market) and confidence level.164- **Listing history & recycled-unit detection** — first-seen date, price165 changes observed across syncs, re-listed unit detection.166- **Manager profiles** — `/g/{source_id}` pages + automatic Google Business167 matching (rating, review histogram, recent excerpts, match confidence).168- **KA Scores** — OSM-based Walk / Transit / Bike / Quiet / Services scores,169 plus a Canada-appropriate **Winter Score**.170- **Data quality** — completeness scoring, publication gate, quarantine,171 photo audit (`imgcheck`), Québec-exclusion guard.172- **Statistics** — public `/stats` dashboard with period selector, KPI173 gauges, and PDF report generation (full, themed, custom).174- **KA ID** — optional Groupe KA single sign-on (email, Google, Apple) for175 saved favourites across the ecosystem; the site is fully usable signed out.176- **Privacy by design** — no trackers, no third-party cookies, no ads.177- **SEO** — server-side HTML rendering (meta, JSON-LD, breadcrumbs), robots178 and sitemap suite (`sitemap.xml`, pages/cities/listings sitemaps).179180## Architecture181182Forked from Lou-Ka on 2026-08-27 (the Ontario expansion paused there — 65183sources, ~5,850 listings — moved here and went live, with every Québec-only184layer removed). The Python package is `rentka/`.185186- **Backend** — FastAPI + SQLite (`data/rentka.db`): connectors → `ingest`187 → geocoding (Nominatim) → dedup → `quality` (completeness score +188 publication gate + Québec exclusion) → API.189- **Connector pipeline** — each source is a connector module under190 `rentka/connectors/` (41 files) or a platform-registry entry (see below);191 `run.py sync` walks them, `run.py watch` loops every 60 minutes; every sync192 is journaled (found/added/updated/removed + null-rate stats) and surfaced193 on `/sources` and `/stats`.194- **Frontend** — React/Vite (`frontend/`), **English (en-CA)**, cobalt skin195 on the shared ka-ui tokens. Routes: `/`, `/listing/{uid}`,196 `/city/{slug}[/{type}]`, `/cities`, `/stats`, `/sources`, `/g/{source_id}`,197 `/privacy`, `/terms`, `/contact`, `/doc`. Map = Ka Maps198 (`@groupe-ka/ka-maps`, expected at `../../ka-maps`).199- **SEO** — `rentka/seo.py` renders server-side HTML (meta, JSON-LD,200 sitemaps) in English.201- **Enrichment kept** (Canada-wide, no Québec dependency): KA Scores202 (OSM Walk/Transit/Bike/Quiet/Services), fair rental value, building203 passport, listing history, re-listed-unit detection, Winter Score,204 photo audit, manager profiles (SerpApi).205- **Removed vs Lou-Ka** — everything Québec-only: Hydro-Québec estimates,206 rent registry (registre des loyers), TAL history, BDZI flood, RSQAQ air,207 gazquebec, quartier (QC census), real-cost breakdown, movers directory,208 the whole short-term subsystem, and ~300 QC connectors.209210## Connectors & data sources211212**767 registered connectors** (2026-08-28), three families:213214- **Platform generators** — one JSON registry per rental platform in215 `data/*_clients.json`; adding a property manager anywhere in Canada =216 adding one client row (optional `"province"` key, default `"ON"`):217 - **LiftSystem / Rentsync** (`lift_*`) — **640 clients**, the backbone of218 the manager coverage;219 - **Buildium** (`bld_*`) — 86 clients;220 - **RentCafe** (`rc_*`) — 26 clients;221 - **Rentsync gateway** (`rsgw_*`) — 7 clients (Fitzrovia, Drewlo, BGO…);222 - **AppFolio** (`apf_*`) — 2 clients.223- **National landlords & REITs** (dedicated connectors): Boardwalk, CAPREIT,224 Centurion, Cogir, Hazelview, InterRent, MetCap, Minto, Morguard, Realstar,225 Akelius, Killam, Skyline, Starlight, Homestead, Medallion, Q Residential,226 Greenrock, KG Group, Sifton, Westdale, RioCan Living… — whole portfolio227 outside Québec (AB/SK/BC/MB/NS/NB included).228- **National portals & MLS**: Rentals.ca, Zumper, Kijiji, Apartments.com,229 Facebook Marketplace, louer.ca — major metros in every province — plus230 **REALTOR.ca broker listings** (added 2026-08-28: CREA MLS rental listings231 via the internal PropertySearch API, recursive quad-split area scan,232 ~22,400 active rentals).233234Data quality per sync is tracked (null-price rate, null-address rate, missed235records) and gates publication; listings failing the completeness bar sit in236quarantine instead of being published.237238## API & routes239240Public JSON API (same origin, no key required for read endpoints):241242| Endpoint | Description |243|---|---|244| `GET /api/listings` | paginated search (city, source, type, price, sort…) |245| `GET /api/listings/{uid}` | one listing, full record |246| `GET /api/listings/{uid}/historique` | price/availability history |247| `GET /api/listings/{uid}/recyclees` | re-listed-unit detection |248| `GET /api/listings/{uid}/pdf` | listing sheet PDF |249| `GET /api/listings.geojson` | map payload (GeoJSON) |250| `GET /api/search` | unified list+map search (viewport, polygon) |251| `GET /api/facets` | facet counts for the filter bar |252| `GET /api/fairvalue/{uid}` | fair rental value estimate |253| `GET /api/kascores/stats` | KA Scores coverage stats |254| `GET /api/immeuble` | building passport lookup |255| `GET /api/managers/{source_id}` | manager profile (+ Google reviews) |256| `GET /api/sources` | source registry with sync status |257| `GET /api/stats` · `/api/stats/detailed` · `/api/stats/dashboard` | market statistics |258| `GET /api/stats/rapport.pdf` · `/api/stats/report[/custom]` | PDF reports |259| `GET /api/seo/cities` · `/api/seo/city/{slug}` | city directory data |260| `GET /api/img` | image proxy/cache |261262Server-rendered HTML routes for SEO: `/listing/{uid}`, `/city/{slug}[/{type}]`,263`/cities`, `/g/{source_id}`, `/sources`, `/stats`, `/privacy`, `/terms`,264`/doc`, `robots.txt` and the sitemap suite (`sitemap.xml`,265`sitemap-pages.xml`, `sitemap-cities.xml`, `sitemap-listings-{n}.xml`).266267## Canonical unit types (English)268269`Studio | 1 bedroom | 2 bedrooms | 3 bedrooms | 4 bedrooms | 5+ bedrooms |270Loft | Penthouse | Condo | Townhouse | House | Room` — see271`rentka/normalize.py`. Québec «n½» input converts automatically272(n½ = n−2 bedrooms), and a central FR→EN label funnel in273`schema.finalize()` translates amenities/availability/price labels coming274from fr-ca page templates — the DB is uniformly English.275276## Run277278```bash279python run.py sync [source ...] # sync listings280python run.py watch [minutes] # sync loop (default 60 min)281python run.py serve [port] # API + frontend (default 8125)282python run.py list # registered connectors283python run.py geocode [n] # geocode listings missing coordinates284python run.py quality # recompute publication gate285```286287Python dependencies: `requirements.txt` (use the repo's `.venv`). Frontend:288`cd frontend && npm install && npm run build` (Ka Maps expected at289`../../ka-maps`).290291## Tests292293```bash294python -m pytest tests/295```296297Connector snapshot tests replay recorded fixtures (`tests/fixtures/`);298re-record with `python run.py record <source>` after changing a connector.299300## Deployment301302Production runs on the MacLustr node **M4M36** (Mac Studio), port **8125**,303under PM2:304305| PM2 process | Role |306|---|---|307| `rent-ka-web` | `run.py serve 8125` — API + frontend |308| `rent-ka-sync` | `run.py watch 60` — connector sync loop |309| `rent-ka-ngrok` | `ngrok http --url=www.rent-ka.com 8125` — public tunnel |310311PM2 resurrection is wired into launchd, so the three processes survive a312node reboot.313314## Development workflow (remote-first)315316The **source of truth is the git repo on the deployment node**317(`M4M36:~/apps/rent-ka`), not any laptop copy. Edits, builds, `pm2 restart`318and commits all happen on the node over SSH. The remote `origin` is319**spbgit** (Groupe KA's private git server, bare repos on the cluster320gateway; SSH alias `gitsrv`) — not GitHub. Pushes work during an SSH session321thanks to agent forwarding.322323## Expansion playbook324325The fastest way to add coverage is the platform registries: find property326managers whose sites run LiftSystem/RentCafe/Rentsync/Buildium/AppFolio327(signatures documented in `gestion-immobiliere-ontario.md` §10) and append328a client entry with its `province`. `docs/canada-sources.md` tracks the329national source inventory. Per-connector documentation lives in330`docs/connecteurs/`.331332## The ·KA ecosystem333334Rent-Ka is one of the Groupe KA aggregators — fully automated platforms where335hundreds of connectors read sources directly, normalize the data and resync336on their own:337338[Groupe KA](https://www.groupe-ka.com) ·339[Lou-Ka](https://www.lou-ka.com) (Québec rentals) ·340[Rent-Ka](https://www.rent-ka.com) (Canada rentals) ·341[Immo-Ka](https://www.immo-ka.com) (Québec real estate) ·342[House-Ka](https://www.house-ka.com) (Canada homes for sale) ·343[Vrai-Prix](https://www.vrai-prix.com) ·344[Auto-Ka](https://www.auto-ka.com) ·345[Fabri-Ka](https://www.fabri-ka.com) ·346[Food-Ka](https://www.food-ka.com) ·347[Resto-Ka](https://www.resto-ka.com) ·348[Sorti-Ka](https://www.sorti-ka.com) ·349[Créa-Ka](https://www.crea-ka.com) ·350[Trouve-Ka](https://www.trouve-ka.com) ·351[Job-Ka](https://www.job-ka.com) ·352[API-Ka](https://www.api-ka.com) ·353[KA-Stats](https://www.ka-stats.com)354355## Contact356357- **Projects, partnerships & data** — contact@groupe-ka.com358- **Media & general questions** — info@groupe-ka.com359- **Legal, privacy & Loi 25** — admin@groupe-ka.com360- Author: Simon-Pierre Boucher — contact@spboucher.ai361362© 2026 Groupe KA — Rent-Ka is an independent aggregator: every listing links363back to the original ad.364