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-Ka89**[www.rent-ka.com](https://www.rent-ka.com)** — Apartments and homes for rent10across **Canada outside Québec** (Ontario first, national expansion live). A11**Groupe KA** service, sister site of [Lou-Ka](https://www.lou-ka.com) (Québec12rentals) and [House-Ka](https://www.house-ka.com) (Canadian homes for sale).1314Rent-Ka continuously aggregates rental listings published by Canadian property15managers, REITs, real-estate brokers and national portals: every listing keeps16its photos, price, availability and a **direct link to the original ad**.17Groupe KA is a content aggregator — we sell nothing, rent nothing and are not18a party to any transaction.1920**Live snapshot (2026-08-28)** · ~76,000 rentals indexed · **767 registered21connectors** · listings in 9 provinces + 2 territories (all of Canada except22Québec) · average rent **$2,180/month** · ~1,800 cities covered · top markets:23Toronto, Calgary, Edmonton, Ottawa, Hamilton, Vancouver, Mississauga, London,24Winnipeg, Kitchener.2526---2728## Table of contents29301. [Guided tour (screenshots)](#guided-tour)312. [Features](#features)323. [Architecture](#architecture)334. [Connectors & data sources](#connectors--data-sources)345. [API & routes](#api--routes)356. [Canonical unit types](#canonical-unit-types-english)367. [Run](#run)378. [Tests](#tests)389. [Deployment](#deployment)3910. [Development workflow (remote-first)](#development-workflow-remote-first)4011. [Expansion playbook](#expansion-playbook)4112. [The ·KA ecosystem](#the-ka-ecosystem)4213. [Contact](#contact)4344---4546## Guided tour4748Ten screenshots of the production site (captured 2026-08-28, live at49[www.rent-ka.com](https://www.rent-ka.com)).5051### 1 — Home page52535455The landing page: live counters (rentals indexed, sources, last sync, average56rent), a **Browse by province** grid covering every province and territory57outside Québec (Ontario, Alberta, British Columbia, Manitoba, Saskatchewan,58Nova Scotia, New Brunswick, PEI, Newfoundland and Labrador, NWT, Nunavut), a59city search box, and the ticker of per-province listing counts. The cookie60banner reflects the no-tracker policy: preferences live in `localStorage`61only.6263### 2 — Listing page (price analysis)64656667A listing detail page (`/listing/{uid}`): photo gallery with thumbnails,68advertised price, and the **Rent-Ka price analysis** panel — estimated fair69value with a confidence range, deviation vs the market ("Above market +8 %"),70a histogram of comparable listings, and the **Listing history** card (tracked71since, days online, observed price changes). The fair-value estimate is72computed continuously from comparable market listings.7374### 3 — Rental market statistics75767778The `/stats` observatory: active listings, new/removed listings over the79selected period, average and median rent, quality quarantine size,80below-market listings, active connectors and covered cities — with period81presets (today → all), gauge charts for data-quality KPIs (geocoded share,82average record completeness…) and downloadable **PDF reports** (full report,83themed reports, custom report builder).8485### 4 — Aggregated sources registry86878889The public `/sources` page: every property manager and platform tracked by90Rent-Ka, with connection status, active listing count and last sync time —91REALTOR.ca broker listings, Cogir, CAPREIT, Minto, Realstar, Hazelview and92hundreds more. Transparency is a core Groupe KA principle: each "connected"93source is synced periodically by a dedicated connector.9495### 5 — Privacy96979899"Your privacy, kept simple": no advertising pixel, no third-party cookies, no100data resale. The only browser storage is `localStorage` for consent, search101filters and list/map preference. Written in plain English with a102Loi 25-compliant contact for the responsible person.103104### 6 — Terms of use105106107108The `/terms` page states what Rent-Ka is (an independent aggregator that109links back to the original ad) and what it is not (a landlord, a broker or a110party to any rental transaction), plus indexing-robots transparency.111112### 7 — Property manager profile113114115116Public manager pages (`/g/{source_id}`, here Accommod8u): all active rentals117by that manager with photos, prices and unit types — plus (see capture 8) an118automatically matched Google Business profile with review statistics.119120### 8 — Listing page (details & manager panel)121122123124Further down a listing page: normalized characteristics (unit type,125availability date, pets, area), description with a link to the source's126original text, amenities, practical details, the PDF listing sheet download,127and the **"Who manages this rental?"** panel — manager profile matched to128Google Maps with rating, review distribution and recent excerpts, including129the confidence score of the automatic match.130131### 9 — Map view (Ka Maps)132133134135The split list/map view (`/?view=map`), powered by the shared136**@groupe-ka/ka-maps** framework (Mapbox): clustered markers across the whole137country, price labels, "search as I move the map", 3D toggle and drawing138tools. The list panel stays in sync with the viewport.139140### 10 — Contact141142143144The `/contact` page: Groupe KA addresses (projects & data partnerships, media,145legal/privacy), the aggregator disclaimer, and links to the 16 sites of the146·KA ecosystem.147148---149150## Features151152- **Search & browse** — full-text search, facet filters (city, unit type,153 price range, availability), browse by province and by city, list or map154 view, sort by recency/price.155- **Map** — Ka Maps (Mapbox GL) with clustering, price pins, viewport-synced156 list, polygon drawing and 3D buildings.157- **Listing pages** — photo gallery, normalized attributes, description,158 amenities, direct link to the original ad, downloadable PDF sheet,159 SEO-friendly server-rendered fallback.160- **Fair rental value** — continuous market-comparables model with range,161 deviation badge (above/below market) and confidence level.162- **Listing history & recycled-unit detection** — first-seen date, price163 changes observed across syncs, re-listed unit detection.164- **Manager profiles** — `/g/{source_id}` pages + automatic Google Business165 matching (rating, review histogram, recent excerpts, match confidence).166- **KA Scores** — OSM-based Walk / Transit / Bike / Quiet / Services scores,167 plus a Canada-appropriate **Winter Score**.168- **Data quality** — completeness scoring, publication gate, quarantine,169 photo audit (`imgcheck`), Québec-exclusion guard.170- **Statistics** — public `/stats` dashboard with period selector, KPI171 gauges, and PDF report generation (full, themed, custom).172- **KA ID** — optional Groupe KA single sign-on (email, Google, Apple) for173 saved favourites across the ecosystem; the site is fully usable signed out.174- **Privacy by design** — no trackers, no third-party cookies, no ads.175- **SEO** — server-side HTML rendering (meta, JSON-LD, breadcrumbs), robots176 and sitemap suite (`sitemap.xml`, pages/cities/listings sitemaps).177178## Architecture179180Forked from Lou-Ka on 2026-08-27 (the Ontario expansion paused there — 65181sources, ~5,850 listings — moved here and went live, with every Québec-only182layer removed). The Python package is `rentka/`.183184- **Backend** — FastAPI + SQLite (`data/rentka.db`): connectors → `ingest`185 → geocoding (Nominatim) → dedup → `quality` (completeness score +186 publication gate + Québec exclusion) → API.187- **Connector pipeline** — each source is a connector module under188 `rentka/connectors/` (41 files) or a platform-registry entry (see below);189 `run.py sync` walks them, `run.py watch` loops every 60 minutes; every sync190 is journaled (found/added/updated/removed + null-rate stats) and surfaced191 on `/sources` and `/stats`.192- **Frontend** — React/Vite (`frontend/`), **English (en-CA)**, cobalt skin193 on the shared ka-ui tokens. Routes: `/`, `/listing/{uid}`,194 `/city/{slug}[/{type}]`, `/cities`, `/stats`, `/sources`, `/g/{source_id}`,195 `/privacy`, `/terms`, `/contact`, `/doc`. Map = Ka Maps196 (`@groupe-ka/ka-maps`, expected at `../../ka-maps`).197- **SEO** — `rentka/seo.py` renders server-side HTML (meta, JSON-LD,198 sitemaps) in English.199- **Enrichment kept** (Canada-wide, no Québec dependency): KA Scores200 (OSM Walk/Transit/Bike/Quiet/Services), fair rental value, building201 passport, listing history, re-listed-unit detection, Winter Score,202 photo audit, manager profiles (SerpApi).203- **Removed vs Lou-Ka** — everything Québec-only: Hydro-Québec estimates,204 rent registry (registre des loyers), TAL history, BDZI flood, RSQAQ air,205 gazquebec, quartier (QC census), real-cost breakdown, movers directory,206 the whole short-term subsystem, and ~300 QC connectors.207208## Connectors & data sources209210**767 registered connectors** (2026-08-28), three families:211212- **Platform generators** — one JSON registry per rental platform in213 `data/*_clients.json`; adding a property manager anywhere in Canada =214 adding one client row (optional `"province"` key, default `"ON"`):215 - **LiftSystem / Rentsync** (`lift_*`) — **640 clients**, the backbone of216 the manager coverage;217 - **Buildium** (`bld_*`) — 86 clients;218 - **RentCafe** (`rc_*`) — 26 clients;219 - **Rentsync gateway** (`rsgw_*`) — 7 clients (Fitzrovia, Drewlo, BGO…);220 - **AppFolio** (`apf_*`) — 2 clients.221- **National landlords & REITs** (dedicated connectors): Boardwalk, CAPREIT,222 Centurion, Cogir, Hazelview, InterRent, MetCap, Minto, Morguard, Realstar,223 Akelius, Killam, Skyline, Starlight, Homestead, Medallion, Q Residential,224 Greenrock, KG Group, Sifton, Westdale, RioCan Living… — whole portfolio225 outside Québec (AB/SK/BC/MB/NS/NB included).226- **National portals & MLS**: Rentals.ca, Zumper, Kijiji, Apartments.com,227 Facebook Marketplace, louer.ca — major metros in every province — plus228 **REALTOR.ca broker listings** (added 2026-08-28: CREA MLS rental listings229 via the internal PropertySearch API, recursive quad-split area scan,230 ~22,400 active rentals).231232Data quality per sync is tracked (null-price rate, null-address rate, missed233records) and gates publication; listings failing the completeness bar sit in234quarantine instead of being published.235236## API & routes237238Public JSON API (same origin, no key required for read endpoints):239240| Endpoint | Description |241|---|---|242| `GET /api/listings` | paginated search (city, source, type, price, sort…) |243| `GET /api/listings/{uid}` | one listing, full record |244| `GET /api/listings/{uid}/historique` | price/availability history |245| `GET /api/listings/{uid}/recyclees` | re-listed-unit detection |246| `GET /api/listings/{uid}/pdf` | listing sheet PDF |247| `GET /api/listings.geojson` | map payload (GeoJSON) |248| `GET /api/search` | unified list+map search (viewport, polygon) |249| `GET /api/facets` | facet counts for the filter bar |250| `GET /api/fairvalue/{uid}` | fair rental value estimate |251| `GET /api/kascores/stats` | KA Scores coverage stats |252| `GET /api/immeuble` | building passport lookup |253| `GET /api/managers/{source_id}` | manager profile (+ Google reviews) |254| `GET /api/sources` | source registry with sync status |255| `GET /api/stats` · `/api/stats/detailed` · `/api/stats/dashboard` | market statistics |256| `GET /api/stats/rapport.pdf` · `/api/stats/report[/custom]` | PDF reports |257| `GET /api/seo/cities` · `/api/seo/city/{slug}` | city directory data |258| `GET /api/img` | image proxy/cache |259260Server-rendered HTML routes for SEO: `/listing/{uid}`, `/city/{slug}[/{type}]`,261`/cities`, `/g/{source_id}`, `/sources`, `/stats`, `/privacy`, `/terms`,262`/doc`, `robots.txt` and the sitemap suite (`sitemap.xml`,263`sitemap-pages.xml`, `sitemap-cities.xml`, `sitemap-listings-{n}.xml`).264265## Canonical unit types (English)266267`Studio | 1 bedroom | 2 bedrooms | 3 bedrooms | 4 bedrooms | 5+ bedrooms |268Loft | Penthouse | Condo | Townhouse | House | Room` — see269`rentka/normalize.py`. Québec «n½» input converts automatically270(n½ = n−2 bedrooms), and a central FR→EN label funnel in271`schema.finalize()` translates amenities/availability/price labels coming272from fr-ca page templates — the DB is uniformly English.273274## Run275276```bash277python run.py sync [source ...] # sync listings278python run.py watch [minutes] # sync loop (default 60 min)279python run.py serve [port] # API + frontend (default 8125)280python run.py list # registered connectors281python run.py geocode [n] # geocode listings missing coordinates282python run.py quality # recompute publication gate283```284285Python dependencies: `requirements.txt` (use the repo's `.venv`). Frontend:286`cd frontend && npm install && npm run build` (Ka Maps expected at287`../../ka-maps`).288289## Tests290291```bash292python -m pytest tests/293```294295Connector snapshot tests replay recorded fixtures (`tests/fixtures/`);296re-record with `python run.py record <source>` after changing a connector.297298## Deployment299300Production runs on the MacLustr node **M4M36** (Mac Studio), port **8125**,301under PM2:302303| PM2 process | Role |304|---|---|305| `rent-ka-web` | `run.py serve 8125` — API + frontend |306| `rent-ka-sync` | `run.py watch 60` — connector sync loop |307| `rent-ka-ngrok` | `ngrok http --url=www.rent-ka.com 8125` — public tunnel |308309PM2 resurrection is wired into launchd, so the three processes survive a310node reboot.311312## Development workflow (remote-first)313314The **source of truth is the git repo on the deployment node**315(`M4M36:~/apps/rent-ka`), not any laptop copy. Edits, builds, `pm2 restart`316and commits all happen on the node over SSH. The remote `origin` is317**spbgit** (Groupe KA's private git server, bare repos on the cluster318gateway; SSH alias `gitsrv`) — not GitHub. Pushes work during an SSH session319thanks to agent forwarding.320321## Expansion playbook322323The fastest way to add coverage is the platform registries: find property324managers whose sites run LiftSystem/RentCafe/Rentsync/Buildium/AppFolio325(signatures documented in `gestion-immobiliere-ontario.md` §10) and append326a client entry with its `province`. `docs/canada-sources.md` tracks the327national source inventory. Per-connector documentation lives in328`docs/connecteurs/`.329330## The ·KA ecosystem331332Rent-Ka is one of the Groupe KA aggregators — fully automated platforms where333hundreds of connectors read sources directly, normalize the data and resync334on their own:335336[Groupe KA](https://www.groupe-ka.com) ·337[Lou-Ka](https://www.lou-ka.com) (Québec rentals) ·338[Rent-Ka](https://www.rent-ka.com) (Canada rentals) ·339[Immo-Ka](https://www.immo-ka.com) (Québec real estate) ·340[House-Ka](https://www.house-ka.com) (Canada homes for sale) ·341[Vrai-Prix](https://www.vrai-prix.com) ·342[Auto-Ka](https://www.auto-ka.com) ·343[Fabri-Ka](https://www.fabri-ka.com) ·344[Food-Ka](https://www.food-ka.com) ·345[Resto-Ka](https://www.resto-ka.com) ·346[Sorti-Ka](https://www.sorti-ka.com) ·347[Créa-Ka](https://www.crea-ka.com) ·348[Trouve-Ka](https://www.trouve-ka.com) ·349[Job-Ka](https://www.job-ka.com) ·350[API-Ka](https://www.api-ka.com) ·351[KA-Stats](https://www.ka-stats.com)352353## Contact354355- **Projects, partnerships & data** — contact@groupe-ka.com356- **Media & general questions** — info@groupe-ka.com357- **Legal, privacy & Loi 25** — admin@groupe-ka.com358- Author: Simon-Pierre Boucher — contact@spboucher.ai359360© 2026 Groupe KA — Rent-Ka is an independent aggregator: every listing links361back to the original ad.362