A production real-estate platform for a Dubai agency — where buyers describe what they want in plain language and an AI finds it across thousands of live listings.

Fairy Homes is an established Dubai agency — operating since 2015, with more than AED 8 billion in transactions and 1,200+ properties sold. Their listings already lived on PropertyFinder, but the portal experience was the same rigid grid of dropdowns every competitor used.
They wanted a site that felt like talking to a good agent: tell it "luxury villa with a sea view under 5M" and get the right homes back — not a form with twelve filters. And they needed it to run itself, staying in sync with their PropertyFinder inventory with zero manual upkeep.
We designed and built the whole thing — front of house, the AI search, the data pipeline, and a staff admin portal — and shipped it to production on Cloudflare's edge.

A query goes through two layers: an LLM parses intent into structured filters (type, beds, budget, emirate, furnishing), while the free-text "vibe" is matched against listing embeddings with a pgvector cosine search. Results rank on meaning, not keywords.

A scheduled pipeline mirrors the agency's PropertyFinder Atlas data — listings, agents, photos, and SuperAgent performance stats — into Postgres. Every sync is idempotent, so it's safe to re-run any time, and staff never re-enter a thing.

The agency's live numbers — properties sold, AED transaction volume, years active — stay current straight from the sync, surfaced on the site and managed from a secure staff portal: a stats dashboard, an enquiry pipeline, review moderation, and one-click sync controls.

Beyond the scheduled sync, PropertyFinder pushes events the moment they happen — a listing goes live, gets taken down, or hits a RERA/DLD compliance action — to a signed callback that updates the matching row in seconds. No waiting for the next sync cycle.
The hard part wasn't the UI — it was making search feel intelligent and stay honest. Structured filters guarantee correctness (a 3-bed budget cap is never "interpreted"), while embeddings handle the fuzzy human bits. Indexes are tuned for the exact hot paths, so it stays quick as the catalogue grows.