1# House-Ka23**www.house-ka.com** — Homes-for-sale aggregator for Canada **outside Québec**,4Ontario first. A Groupe KA service, sister site of5[Immo-Ka](https://www.immo-ka.com) (Québec).67House-Ka continuously aggregates homes publicly listed by Canadian real-estate8brokerages and teams whose sites run the **RealtyPress** WordPress plugin on9the **CREA DDF** feed. Each site exposes its board's full inventory; a single10generic connector (`immoka/connectors/realtypress.py`) covers them all, and11cross-site duplicates are masked by DDF number (`external_id = ddf<id>`).1213## Architecture1415Forked from Immo-Ka on 2026-08-27 (the Ontario expansion paused there moved16here). The Python package keeps its historical name `immoka`.1718- **Backend** — FastAPI + SQLite (`data/immoka.db`), same pipeline as Immo-Ka:19 connectors → `ingest` → dedup → `quality` (relaxed publication rule: price +20 city; type/description enrich over time via detail passes) → API.21- **Frontend** — React/Vite, **English**, pine/cream/serif skin (deliberately22 different from Immo-Ka's cherry). Routes: `/`, `/property/{uid}[/{slug}]`,23 `/for-sale/{city}[/{type}]`, `/type/{type}`, `/rates`, `/agencies`, `/stats`.24 Map = Ka Maps (`@groupe-ka/ka-maps`, expected at `../../ka-maps`).25- **SEO** — `immoka/seo.py` renders server-side HTML (meta, JSON-LD, sitemaps)26 in English.27- **Mortgage engine** — shared with Immo-Ka (`immoka/mortgage/`), national28 Canadian rates. See `docs/mortgage-engine.md`.29- **Removed vs Immo-Ka** — everything Québec-only: Hydro-Québec estimates,30 BDZI flood, RSQAQ air, gazquebec, rental registry, quartier (census),31 Vrai-Prix, movers/inspectors directories, PDF listing sheets, all QC32 connectors.3334## Canonical property types (English)3536`House, Condo, Townhouse, Semi-detached, Duplex, Triplex, Multi-family,37Cottage, Mobile home, Land, Farm, Commercial, Parking` —38see `immoka/normalize.py`. DDF list cards carry no type: most listings get39their type when their detail page is fetched (`IMMOKA_RP_DETAIL_LIMIT` per40source per sync).4142## Run4344```bash45python run.py sync [source ...] # sync listings46python run.py watch [minutes] # sync loop (default 60 min)47python run.py serve [port] # API + frontend (default 8098)48python run.py list # registered connectors49python run.py geocode [n] # geocode listings missing coordinates50python run.py mortgage-sync # collect mortgage rates51```5253`.env`: `IMMOKA_BASE_URL=https://www.house-ka.com`,54`IMMOKA_RP_DETAIL_LIMIT=<n>` (detail pages fetched per source per sync).5556## Deployment5758M4M64b, `~/apps/house-ka`, PM2 (`house-ka-web` :8098, `house-ka-sync`,59`house-ka-ngrok` → www.house-ka.com). Remote-first: the repo on the node is60the source of truth, `origin` = spbgit (`gitsrv:house-ka.git`).6162## Adding sources (rest of Canada)6364RealtyPress sites exist across Canada. Census & instructions:65`docs/ontario-agencies.md` (method transposes to any province). Add the site66to `data/canada_agencies.json` + an entry in `data/sources.json`, then67`python run.py sync <id>`. The coordinate guard covers all of Canada.68