> ⚠️ **URL live hors fonction pour le moment.** L'application a été retirée du cluster MacLustr le 2026-09-04 (processus arrêtés, copie du nœud supprimée). Ce dépôt spbgit est désormais la seule source de vérité du projet. Ancienne URL : https://www.home-ka.com
Home·Ka
US real-estate aggregator — every home for sale, from direct feeds first.
www.home-ka.com · Groupe KA · US counterpart of Immo·Ka (Canada)
**Home-Ka** reuses the Immo-Ka architecture end to end — connectors, normalization, ingestion, property matching, deduplication, quality gate, search API, Ka Maps frontend — adapted to the US market: **RESO Data Dictionary** as the schema reference, USD/sq ft/USPS states, US Census geocoder, and a **brokerage partnership pipeline** designed to convert sources into direct feeds instead of crawling.
## Pipeline (same philosophy as Immo-Ka)
```
SOURCE → connector → raw ingestion → normalization → property matching
→ deduplication → canonical listing → search index → Home-Ka
```
- **PROPERTY ≠ LISTING** — a `Listing` is one publication by one source; a `Property` (`properties` table, keyed by APN or normalized address) is the physical asset and keeps existing after the listing goes off-market. Every listing is matched on ingest (`homeka/propertymatch.py`).
- **Change detection** — content hash per listing, price history (`price_log`), grace period (2 syncs) before deactivation, drift detection (volume/price collapse suspends removals).
- **Dedup** — precomputed (`dup_hidden`/`dup_of`): same MLS number across sources, or same property at ±1% price; most authoritative source wins (`sources.authority`: direct feed < partner API < site < classifieds).
- **Quality gate** — completeness score, quarantine below threshold (`published=0`).
- **Geocoding** — US Census batch geocoder (free, 5k/req) + budgeted Nominatim fallback, persistent cache.
## Connector families (`homeka/connectors/`)
| Family | Module | Use |
|---|---|---|
| `reso` | `reso/webapi.py` | **RESO Web API (OData)** — MLS Grid, Trestle, Bridge, Spark… the preferred feed |
| `rets` | `rets/client.py` | legacy RETS (login + DMQL2, COMPACT-DECODED) |
| `xml` | `xml/feed.py` | XML exports / syndication feeds |
| `json` | `json/feed.py` | JSON partner APIs, wp-json, internal search APIs |
| `jsonld` | `json/jsonld_site.py` | schema.org JSON-LD site crawler (bootstrap only) |
| `csv` | `csv/feed.py` | CSV exports |
| `sftp` | `sftp/drop.py` | SFTP drops (csv/xml), newest file by mtime |
| `arcgis` | `public_data/arcgis.py` | county assessor/GIS parcels → feeds **properties**, not listings |
| custom | `custom_broker/*.py` | one class per site when a family can't express it |
A new source of a known family = **one row in the `sources` table** (`config` JSON: URL, field mapping, `$ENV:NAME` credentials), zero code. Custom connectors auto-register via `source_id`, exactly like Immo-Ka. Anti-bot policy: direct requests first; auto-escalation chain (Oxylabs → Scrapfly ASP → Bright Data, `connectors/_resilient.py`) only when blocked.
## Brokerage pipeline (`/admin/brokerages`)
```
discover brokerage → inspect website → detect IDX/feed/provider
→ find public contacts → classify connector → score → admin
```
- Seed: **630 real US brokerages** (`data/brokerages_seed.json`, `python run.py seed`).
- `homeka/discovery.py` inspects each website (direct GET): IDX platform fingerprints (kvCORE, iHomefinder, IDX Broker, Sierra, REW, Delta Media, Ylopo…), RESO/RETS hints, MLS affiliations, contact/partnership emails; then scores `feed_probability_score` and `priority_score` (size × feed probability × coverage).
- Partnership statuses: prospect → to-contact → contacted → in-discussion → feed-received → **live** (linked to a `sources` row).
## Run
```bash
python run.py serve 8099 # API + frontend
python run.py sync [source ...] # one-shot ingestion
python run.py watch 60 # sync loop + geocode + img audit + discovery
python run.py seed # load brokerage seed
python run.py discover 25 # inspect next prospects
python run.py list | geocode | quality | dedup | rescore
```
Admin: `/admin` (overview), `/admin/sources`, `/admin/connectors`, `/admin/brokerages` — optional `HOMEKA_ADMIN_TOKEN` (.env) required as `X-Admin-Token`.
## Deployment
- Node **M4M36** (`~/apps/home-ka`), port **8099**, PM2 `home-ka-web` + `home-ka-sync` + `home-ka-ngrok` (`--url=www.home-ka.com`).
- Frontend: Vite build (`frontend/`, ka-maps vendored in `vendor/ka-maps`).
- Git: `origin` = spbgit (`gitsrv:srv/git/home-ka.git`).
## Adding a RESO feed (example)
```python
from homeka import db
con = db.connect()
db.upsert_source(con, "mlsgrid_actris", "MLS Grid — ACTRIS", "reso", config={
"base_url": "https://api.mlsgrid.com/v2",
"token": "$ENV:MLSGRID_TOKEN",
"filter": "StandardStatus eq 'Active'",
"expand": "Media", "originating_system": "ACTRIS",
}, authority=0, states=["TX"])
```