Web · Mobile · LLM assistant
Real Estate AI Platform
A Dubai property platform: listing search with an AI assistant that drives the map, a Flutter app for buyers and agents, and an SEO site of about 2,200 pages in 7 languages.
- LLM tool calling
- Flutter
- RTL i18n
- Programmatic SEO
- Stripe
- Push & calls

Product screens with sample data. Names and figures inside the screens are illustrative.
The problem
Buyers search across areas they may not know, on web and mobile, in seven languages. The assistant had to answer about real places and real listings, and the platform had to rank in search at scale.
- 2,200
- Programmatic SEO pages
- 7
- Languages, incl. RTL Arabic
- 11
- AI call sites migrated
What I built
An assistant that moves the map
A multi-persona assistant with tool calling and Google Places grounding. A structured tag protocol, [PLACE:poi_id:X], lets the model highlight places and listings on the map.
- 11 OpenAI call sites moved to the Responses API through one adapter
- Rollback stays a one-line change
- Documented in a 999-line system reference

A Flutter app that feels native
Backend-driven OTP login through the Firebase Admin SDK (MSG91 and Twilio) replaced a failing reCAPTCHA flow. Every screen works in English and right-to-left Arabic.

Calls that ring like a phone call
A full-screen incoming-call experience on Android (USE_FULL_SCREEN_INTENT, Play Console declaration, OEM battery handling) with iOS CallKit parity, plus OneSignal push over APNs and FCM.


Growth built in
Stripe subscriptions, promo codes and a referral-reward system on hardened webhooks, plus an embeddable lead-capture widget with phone OTP that shipped across 24 releases.
- Astro programmatic-SEO site of ~2,200 city and property pages on R2
- Recovered ~2,000 'Discovered, not indexed' pages with internal linking, hub pages and locale parity
Key decisions
One adapter, not eleven patches
Every caller talks to one interface; the adapter owns the API shape. Switching APIs, or back, is a single binding.
Structure the model's output
A tag protocol gives the model a safe, testable way to drive the interface without free-form parsing.
Treat indexation as priority, not a bug
The SEO problem was crawl budget and authority, so the fix was linking and hubs rather than more technical tweaks.
