Case study · Real estate · Dubai

FairyHomes.ae

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.

RoleDesign & Full-stack — end to end
ServiceLaunchpad — MVP → Production
TanStack StartReact 19Neon Postgres + pgvectorDrizzle ORMOpenAICloudflare WorkersPropertyFinder APIPostHog
FairyHomes.ae home page — Find Your Ideal Space in Dubai
The brief

A property search that speaks human.

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.

Highlights

What makes it work.

FairyHomes listings — natural-language search for 'luxury villa with sea view under 5M'
01 — AI natural-language search

Describe it, don't filter it.

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.

luxury villa with sea view under 5M
  • GPT-4.1-mini parses queries into a strict JSON filter schema
  • 1,536-dim embeddings, HNSW cosine index for instant ranking
  • Degrades gracefully — ranks by embedding alone if parsing fails
FairyHomes property detail — full specs synced from PropertyFinder
02 — Always-fresh inventory

Synced from PropertyFinder, hands-off.

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.

  • Listings, agents, transactions & ratings kept in sync
  • Soft-deletes listings PropertyFinder no longer returns
  • RERA / BRN compliance fields carried through
FairyHomes admin portal — one-click PropertyFinder sync controls
03 — A real admin portal

The team runs it themselves.

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.

  • Dashboard of listings, agents & AED transaction volume
  • Contact-enquiry lifecycle: new → contacted → closed
  • Review moderation + shareable review-request links
FairyHomes admin portal — PropertyFinder webhook subscriptions
04 — Real-time by webhook

Webhook-driven, signed, instant.

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.

  • Subscribes to listing.published, unpublished & compliance events
  • HMAC-signed callbacks verified against a shared secret
  • Per-event live re-sync keeps the database current
Under the hood

Production-grade from day one.

Framework
TanStack Start
React 19 with file-based routing and server functions.
Data
Neon Postgres + pgvector
Relational data with a 1,536-dim HNSW vector index for semantic search.
ORM
Drizzle
Type-safe schema & migrations, end to end.
AI
OpenAI
Query parsing + text-embedding-3-small for listing vectors.
Runtime
Cloudflare Workers
Edge-rendered, deployed via Wrangler.
Integration
PropertyFinder Atlas
Scheduled sync + webhooks for live inventory.

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.

Outcome

Shipped, live, and self-running.

AED 8B
Total transactions
250++
Active listings
10+
Years in the Dubai market
4.6
Across 250+ reviews