SPB Git forge

spb/rent-ka

Public
8commits 1branches 0releases
7.4 MBsize
maindefault branch
19 days agolast push
Python 68.8% TypeScript 18.6% CSS 8.7% JavaScript 3.3% HTML 0.6%
15.9 KB

Rent-Ka — Apartments and homes for rent across Canada

# Rent-Ka

⚠️ 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. www.rent-ka.com — Apartments and homes for rent across Canada outside Québec (Ontario first, national expansion live). A Groupe KA service, sister site of Lou-Ka (Québec rentals) and House-Ka (Canadian homes for sale).

Rent-Ka continuously aggregates rental listings published by Canadian property managers, REITs, real-estate brokers and national portals: every listing keeps its photos, price, availability and a direct link to the original ad. Groupe KA is a content aggregator — we sell nothing, rent nothing and are not a party to any transaction.

Live snapshot (2026-08-28) · ~76,000 rentals indexed · 767 registered connectors · listings in 9 provinces + 2 territories (all of Canada except Québec) · average rent $2,180/month · ~1,800 cities covered · top markets: Toronto, Calgary, Edmonton, Ottawa, Hamilton, Vancouver, Mississauga, London, Winnipeg, Kitchener.


# Table of contents

  1. Guided tour (screenshots)
  2. Features
  3. Architecture
  4. Connectors & data sources
  5. API & routes
  6. Canonical unit types
  7. Run
  8. Tests
  9. Deployment
  10. Development workflow (remote-first)
  11. Expansion playbook
  12. The ·KA ecosystem
  13. Contact

# Guided tour

Ten screenshots of the production site (captured 2026-08-28, live at www.rent-ka.com).

# 1 — Home page

Home page

The landing page: live counters (rentals indexed, sources, last sync, average rent), a Browse by province grid covering every province and territory outside Québec (Ontario, Alberta, British Columbia, Manitoba, Saskatchewan, Nova Scotia, New Brunswick, PEI, Newfoundland and Labrador, NWT, Nunavut), a city search box, and the ticker of per-province listing counts. The cookie banner reflects the no-tracker policy: preferences live in localStorage only.

# 2 — Listing page (price analysis)

Listing page

A listing detail page (/listing/{uid}): photo gallery with thumbnails, advertised price, and the Rent-Ka price analysis panel — estimated fair value with a confidence range, deviation vs the market ("Above market +8 %"), a histogram of comparable listings, and the Listing history card (tracked since, days online, observed price changes). The fair-value estimate is computed continuously from comparable market listings.

# 3 — Rental market statistics

Stats dashboard

The /stats observatory: active listings, new/removed listings over the selected period, average and median rent, quality quarantine size, below-market listings, active connectors and covered cities — with period presets (today → all), gauge charts for data-quality KPIs (geocoded share, average record completeness…) and downloadable PDF reports (full report, themed reports, custom report builder).

# 4 — Aggregated sources registry

Sources registry

The public /sources page: every property manager and platform tracked by Rent-Ka, with connection status, active listing count and last sync time — REALTOR.ca broker listings, Cogir, CAPREIT, Minto, Realstar, Hazelview and hundreds more. Transparency is a core Groupe KA principle: each "connected" source is synced periodically by a dedicated connector.

# 5 — Privacy

Privacy page

"Your privacy, kept simple": no advertising pixel, no third-party cookies, no data resale. The only browser storage is localStorage for consent, search filters and list/map preference. Written in plain English with a Loi 25-compliant contact for the responsible person.

# 6 — Terms of use

Terms page

The /terms page states what Rent-Ka is (an independent aggregator that links back to the original ad) and what it is not (a landlord, a broker or a party to any rental transaction), plus indexing-robots transparency.

# 7 — Property manager profile

Manager profile

Public manager pages (/g/{source_id}, here Accommod8u): all active rentals by that manager with photos, prices and unit types — plus (see capture 8) an automatically matched Google Business profile with review statistics.

# 8 — Listing page (details & manager panel)

Listing details

Further down a listing page: normalized characteristics (unit type, availability date, pets, area), description with a link to the source's original text, amenities, practical details, the PDF listing sheet download, and the "Who manages this rental?" panel — manager profile matched to Google Maps with rating, review distribution and recent excerpts, including the confidence score of the automatic match.

# 9 — Map view (Ka Maps)

Map view

The split list/map view (/?view=map), powered by the shared @groupe-ka/ka-maps framework (Mapbox): clustered markers across the whole country, price labels, "search as I move the map", 3D toggle and drawing tools. The list panel stays in sync with the viewport.

# 10 — Contact

Contact page

The /contact page: Groupe KA addresses (projects & data partnerships, media, legal/privacy), the aggregator disclaimer, and links to the 16 sites of the ·KA ecosystem.


# Features

  • Search & browse — full-text search, facet filters (city, unit type, price range, availability), browse by province and by city, list or map view, sort by recency/price.
  • Map — Ka Maps (Mapbox GL) with clustering, price pins, viewport-synced list, polygon drawing and 3D buildings.
  • Listing pages — photo gallery, normalized attributes, description, amenities, direct link to the original ad, downloadable PDF sheet, SEO-friendly server-rendered fallback.
  • Fair rental value — continuous market-comparables model with range, deviation badge (above/below market) and confidence level.
  • Listing history & recycled-unit detection — first-seen date, price changes observed across syncs, re-listed unit detection.
  • Manager profiles — /g/{source_id} pages + automatic Google Business matching (rating, review histogram, recent excerpts, match confidence).
  • KA Scores — OSM-based Walk / Transit / Bike / Quiet / Services scores, plus a Canada-appropriate Winter Score.
  • Data quality — completeness scoring, publication gate, quarantine, photo audit (imgcheck), Québec-exclusion guard.
  • Statistics — public /stats dashboard with period selector, KPI gauges, and PDF report generation (full, themed, custom).
  • KA ID — optional Groupe KA single sign-on (email, Google, Apple) for saved favourites across the ecosystem; the site is fully usable signed out.
  • Privacy by design — no trackers, no third-party cookies, no ads.
  • SEO — server-side HTML rendering (meta, JSON-LD, breadcrumbs), robots and sitemap suite (sitemap.xml, pages/cities/listings sitemaps).

# Architecture

Forked from Lou-Ka on 2026-08-27 (the Ontario expansion paused there — 65 sources, ~5,850 listings — moved here and went live, with every Québec-only layer removed). The Python package is rentka/.

  • Backend — FastAPI + SQLite (data/rentka.db): connectors → ingest → geocoding (Nominatim) → dedup → quality (completeness score + publication gate + Québec exclusion) → API.
  • Connector pipeline — each source is a connector module under rentka/connectors/ (41 files) or a platform-registry entry (see below); run.py sync walks them, run.py watch loops every 60 minutes; every sync is journaled (found/added/updated/removed + null-rate stats) and surfaced on /sources and /stats.
  • Frontend — React/Vite (frontend/), English (en-CA), cobalt skin on the shared ka-ui tokens. Routes: /, /listing/{uid}, /city/{slug}[/{type}], /cities, /stats, /sources, /g/{source_id}, /privacy, /terms, /contact, /doc. Map = Ka Maps (@groupe-ka/ka-maps, expected at ../../ka-maps).
  • SEO — rentka/seo.py renders server-side HTML (meta, JSON-LD, sitemaps) in English.
  • Enrichment kept (Canada-wide, no Québec dependency): KA Scores (OSM Walk/Transit/Bike/Quiet/Services), fair rental value, building passport, listing history, re-listed-unit detection, Winter Score, photo audit, manager profiles (SerpApi).
  • Removed vs Lou-Ka — everything Québec-only: Hydro-Québec estimates, rent registry (registre des loyers), TAL history, BDZI flood, RSQAQ air, gazquebec, quartier (QC census), real-cost breakdown, movers directory, the whole short-term subsystem, and ~300 QC connectors.

# Connectors & data sources

767 registered connectors (2026-08-28), three families:

  • Platform generators — one JSON registry per rental platform in data/*_clients.json; adding a property manager anywhere in Canada = adding one client row (optional "province" key, default "ON"):
    • LiftSystem / Rentsync (lift_*) — 640 clients, the backbone of the manager coverage;
    • Buildium (bld_*) — 86 clients;
    • RentCafe (rc_*) — 26 clients;
    • Rentsync gateway (rsgw_*) — 7 clients (Fitzrovia, Drewlo, BGO…);
    • AppFolio (apf_*) — 2 clients.
  • National landlords & REITs (dedicated connectors): Boardwalk, CAPREIT, Centurion, Cogir, Hazelview, InterRent, MetCap, Minto, Morguard, Realstar, Akelius, Killam, Skyline, Starlight, Homestead, Medallion, Q Residential, Greenrock, KG Group, Sifton, Westdale, RioCan Living… — whole portfolio outside Québec (AB/SK/BC/MB/NS/NB included).
  • National portals & MLS: Rentals.ca, Zumper, Kijiji, Apartments.com, Facebook Marketplace, louer.ca — major metros in every province — plus REALTOR.ca broker listings (added 2026-08-28: CREA MLS rental listings via the internal PropertySearch API, recursive quad-split area scan, ~22,400 active rentals).

Data quality per sync is tracked (null-price rate, null-address rate, missed records) and gates publication; listings failing the completeness bar sit in quarantine instead of being published.

# API & routes

Public JSON API (same origin, no key required for read endpoints):

Endpoint Description
GET /api/listings paginated search (city, source, type, price, sort…)
GET /api/listings/{uid} one listing, full record
GET /api/listings/{uid}/historique price/availability history
GET /api/listings/{uid}/recyclees re-listed-unit detection
GET /api/listings/{uid}/pdf listing sheet PDF
GET /api/listings.geojson map payload (GeoJSON)
GET /api/search unified list+map search (viewport, polygon)
GET /api/facets facet counts for the filter bar
GET /api/fairvalue/{uid} fair rental value estimate
GET /api/kascores/stats KA Scores coverage stats
GET /api/immeuble building passport lookup
GET /api/managers/{source_id} manager profile (+ Google reviews)
GET /api/sources source registry with sync status
GET /api/stats · /api/stats/detailed · /api/stats/dashboard market statistics
GET /api/stats/rapport.pdf · /api/stats/report[/custom] PDF reports
GET /api/seo/cities · /api/seo/city/{slug} city directory data
GET /api/img image proxy/cache

Server-rendered HTML routes for SEO: /listing/{uid}, /city/{slug}[/{type}], /cities, /g/{source_id}, /sources, /stats, /privacy, /terms, /doc, robots.txt and the sitemap suite (sitemap.xml, sitemap-pages.xml, sitemap-cities.xml, sitemap-listings-{n}.xml).

# Canonical unit types (English)

Studio | 1 bedroom | 2 bedrooms | 3 bedrooms | 4 bedrooms | 5+ bedrooms | Loft | Penthouse | Condo | Townhouse | House | Room — see rentka/normalize.py. Québec «n½» input converts automatically (n½ = n−2 bedrooms), and a central FR→EN label funnel in schema.finalize() translates amenities/availability/price labels coming from fr-ca page templates — the DB is uniformly English.

# Run

bash
python run.py sync [source ...]   # sync listings
python run.py watch [minutes]     # sync loop (default 60 min)
python run.py serve [port]        # API + frontend (default 8125)
python run.py list                # registered connectors
python run.py geocode [n]         # geocode listings missing coordinates
python run.py quality             # recompute publication gate

Python dependencies: requirements.txt (use the repo's .venv). Frontend: cd frontend && npm install && npm run build (Ka Maps expected at ../../ka-maps).

# Tests

bash
python -m pytest tests/

Connector snapshot tests replay recorded fixtures (tests/fixtures/); re-record with python run.py record <source> after changing a connector.

# Deployment

Production runs on the MacLustr node M4M36 (Mac Studio), port 8125, under PM2:

PM2 process Role
rent-ka-web run.py serve 8125 — API + frontend
rent-ka-sync run.py watch 60 — connector sync loop
rent-ka-ngrok ngrok http --url=www.rent-ka.com 8125 — public tunnel

PM2 resurrection is wired into launchd, so the three processes survive a node reboot.

# Development workflow (remote-first)

The source of truth is the git repo on the deployment node (M4M36:~/apps/rent-ka), not any laptop copy. Edits, builds, pm2 restart and commits all happen on the node over SSH. The remote origin is spbgit (Groupe KA's private git server, bare repos on the cluster gateway; SSH alias gitsrv) — not GitHub. Pushes work during an SSH session thanks to agent forwarding.

# Expansion playbook

The fastest way to add coverage is the platform registries: find property managers whose sites run LiftSystem/RentCafe/Rentsync/Buildium/AppFolio (signatures documented in gestion-immobiliere-ontario.md §10) and append a client entry with its province. docs/canada-sources.md tracks the national source inventory. Per-connector documentation lives in docs/connecteurs/.

# The ·KA ecosystem

Rent-Ka is one of the Groupe KA aggregators — fully automated platforms where hundreds of connectors read sources directly, normalize the data and resync on their own:

Groupe KA · Lou-Ka (Québec rentals) · Rent-Ka (Canada rentals) · Immo-Ka (Québec real estate) · House-Ka (Canada homes for sale) · Vrai-Prix · Auto-Ka · Fabri-Ka · Food-Ka · Resto-Ka · Sorti-Ka · Créa-Ka · Trouve-Ka · Job-Ka · API-Ka · KA-Stats

# Contact

© 2026 Groupe KA — Rent-Ka is an independent aggregator: every listing links back to the original ad.