Jin Oh · Full-stack developerContact

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
Links
reoca.ca ↗App Store ↗Google Play ↗
FlutterDartReactTypeScriptPHP (WordPress REST)MySQLSupabase (Postgres, Edge Functions)CREA DDF / RETSMapboxGoogle MapsGemini APIFirebase Auth & FCMStripe

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

  1. 01Serves 100,000+ active Ontario property listings and manages 8,000,000+ metadata records.
  2. 02Interactive map loads and renders in under 1.2 seconds using viewport-bounded queries, zoom-aware server-side clustering and payload compression.
  3. 03Gemini-powered property intelligence combines Statistics Canada demographics and Google Places data into pros/cons summaries for buyers.
  4. 04Published natively to both the Apple App Store and Google Play from a single Flutter codebase.
  5. 05Available in English, French, Korean and Chinese.
  6. 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

FIG.Listings pipeline (v1 → v2)
pullgeocodeupsertqueryclustersclustersread/writeJSONinsightEXTCREA DDF feedRETS · digest authSVCSync functionsv2 · 4 Supabase Edge Fu…DBPostgresv2 · SupabaseSVCClustering RPCPL/pgSQL · bounds + zoomDEVICEFlutter appsiOS · AndroidEXTGeocodingMapbox / Google · cachedSVCREST APIv1 · PHP / WordPressAPPWeb appReact · TypeScriptDBMySQLv1AIGemini + dataGemini · StatCan · Plac…
  1. 01Listings flow in from the MLS feedCREA DDF feed → Sync functions → Geocoding · Sync functions → Postgres
  2. 02A map pan returns clusters, not 100k pinsPostgres → Clustering RPC → Flutter apps · Clustering RPC → Web app
  3. 03Users, professionals and forum (v1 API)REST API → MySQL · REST API → Web app
  4. 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

  1. C-01

    100,000 pins on a phone

    Problem

    Rendering every listing froze low-end phones and pushed megabytes over mobile data.

    Approach

    Query 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.

    Result

    Map loads and renders in under 1.2 seconds.

  2. C-02

    An MLS feed that only trusts fixed IPs

    Problem

    The CREA DDF feed whitelists IP addresses, but serverless Edge Functions egress from changing IPs; digest auth failed with 401s.

    Approach

    Wrote 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.

    Result

    Reliable incremental sync of properties, photos, rooms, agents and offices.

  3. C-03

    Migrating a live platform without a big bang

    Problem

    v1 runs on WordPress/PHP/MySQL and users are live on both stores; a rewrite-and-switch would risk everything.

    Approach

    Move 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.

    Result

    v2 data layer in production without downtime; the rest migrates feature by feature.

Screens

Reoca website home page with property search
reoca.ca
Reoca app listing on Google Play
Reoca — iOS & Android