P-03 · Consumer platform · iOS + Android + Web
Reoca
AI-powered real-estate platform and professional network for Ontario — iOS, Android and web.
- Role
- Solo — product design, development, deployment, store release
- Timeline
- May 2024 — Feb 2025 (v1) · v2 migration ongoing
- Platforms
- iOS (App Store) · Android (Google Play) · Web
TL;DR
Reoca is a real-estate platform for Ontario that combines live MLS listings on a clustered map, AI property guidance, and a marketplace that matches buyers with realtors, mortgage specialists, lawyers and accountants. Jin Oh designed and built it alone — Flutter apps on the App Store and Google Play, a web app, a 60+ endpoint REST API over 100,000+ active listings and 8,000,000+ records — then began migrating the data layer to Supabase (v2).
Key facts
- 01Serves 100,000+ active Ontario property listings and manages 8,000,000+ metadata records.
- 02Interactive map loads and renders in under 1.2 seconds using viewport-bounded queries, zoom-aware server-side clustering and payload compression.
- 03Gemini-powered property intelligence combines Statistics Canada demographics and Google Places data into pros/cons summaries for buyers.
- 04Published natively to both the Apple App Store and Google Play from a single Flutter codebase.
- 05Available in English, French, Korean and Chinese.
- 06v2 moves listing ingestion to Supabase Edge Functions with a hand-written RETS client for the CREA DDF feed.
- 100,000+active listings
- 8M+metadata records
- <1.2smap load & render
- 60+REST endpoints
The problem
Buying a home in Ontario means juggling a listing portal, a realtor, a mortgage broker, a lawyer and an accountant — found separately, often in a second language.
Reoca puts the listings, the neighbourhood insight and the professionals in one app, in four languages.
Who it serves — and what they needed
- Home buyers & rentersFind a place, understand the neighbourhood, get help from people they can trust.
- Realtors, mortgage specialists, lawyers, accountantsQualified leads and a place to show reviews.
- The businessA multilingual audience the big portals under-serve, and subscription revenue from professionals.
How it fits together
- 01Listings flow in from the MLS feedCREA DDF feed → Sync functions → Geocoding · Sync functions → Postgres
- 02A map pan returns clusters, not 100k pinsPostgres → Clustering RPC → Flutter apps · Clustering RPC → Web app
- 03Users, professionals and forum (v1 API)REST API → MySQL · REST API → Web app
- 04AI turns data into adviceGemini + data → Web app
What’s inside
Map search
- Viewport-bounded queries and zoom-aware clustering
- Rental “/mo” markers and price bands per cluster
- Pre-construction projects on the same map
AI property intelligence
- Buy-vs-rent recommendation
- Natural-language property search
- Neighbourhood pros/cons from Statistics Canada and Google Places
- Real-estate Q&A chatbot
Professional network
- Inquiry wizards for realtors, mortgage, lawyers, accountants
- Matching with status lifecycle and document exchange (PDF viewer)
- Reviews with rating aggregation
Community
- Forum with posts, comments, likes, saves and reports
- Automatic translation to the reader’s language
- Notifications and user points
Accounts & revenue
- Google and Apple sign-in
- Professional portal and admin area
- Stripe subscriptions for professionals
Data platform (v2)
- Hand-written RETS client with MD5 digest auth
- Price-history rows written only on real price changes
- VOW listing lifecycle via terminated_date with RLS
Hard parts, solved
- C-01
100,000 pins on a phone
ProblemRendering every listing froze low-end phones and pushed megabytes over mobile data.
ApproachQuery only the visible bounds; cluster server-side in PL/pgSQL by rounding coordinates to a zoom-dependent precision; return counts and price ranges per cluster; compress payloads; expand clusters on the client.
ResultMap loads and renders in under 1.2 seconds.
- C-02
An MLS feed that only trusts fixed IPs
ProblemThe CREA DDF feed whitelists IP addresses, but serverless Edge Functions egress from changing IPs; digest auth failed with 401s.
ApproachWrote a RETS client from scratch with MD5 digest authentication, isolated the 401s to the IP whitelist, and designed a fixed-IP proxy route for the feed — with structured logging at every sync stage.
ResultReliable incremental sync of properties, photos, rooms, agents and offices.
- C-03
Migrating a live platform without a big bang
Problemv1 runs on WordPress/PHP/MySQL and users are live on both stores; a rewrite-and-switch would risk everything.
ApproachMove one layer at a time: listing ingestion and map queries to Supabase first, while the web and apps keep calling the proven v1 API for everything else.
Resultv2 data layer in production without downtime; the rest migrates feature by feature.
Screens

