01
The product
Dallal — the Arabic word for broker — is a real-estate marketplace for Kuwait. Buyers and renters search properties on a map, browse agents, compare listings, request valuations, and chat with brokers directly in the app. Brokers and agencies get the other side: listing management, leads, appointments, offers, and paid subscription plans. It ships as a web app, iOS and Android apps, and an admin panel that the operations team lives in.
Everything exists twice: the entire product runs in both Arabic and English, with full right-to-left layout in Arabic.
02
My role
I'm the Tech Lead on it at Metafic. That means owning three codebases — a React 19 + Vite web app, a React Native mobile app, and a Ruby on Rails API — plus the architecture decisions that keep them coherent. Day to day it's a mix of building features, reviewing everything that merges, managing releases across web and the app stores, and keeping the backend infrastructure (servers, jobs, storage) healthy.
03
The hard part
Bilingual isn't a translation file. The UI strings go through i18next on web and mobile, but the data itself — listing titles, descriptions, amenity names — also has to exist in both languages. On the Rails side that's model-level translations via Globalize, with a machine-translation pipeline (Google Cloud Translate) filling the gaps so a broker can post in one language and the listing still reads correctly in the other. RTL then touches every screen: layouts, icons, maps, even the chat UI flip.
The map is the product. Property search is map-driven, which meant two rendering stacks: Google Maps for the familiar consumer experience, and OpenLayers with Kuwait-specific parcel data for the deeper map views. On mobile, thousands of pins had to stay smooth, so listings are clustered with supercluster on top of react-native-maps. Getting search filters, the URL state, and the viewport to agree with each other across all of that took real care.
04
How it was built
The backend is a Rails 7 monolith on PostgreSQL: Devise + JWT for auth (email, phone OTP, Google and Apple sign-in), Pundit for authorization, fast JSON serializers for the API, and ActiveAdmin for the ops panel. Background work — notifications, exports, translation jobs, scheduled tasks — runs on Sidekiq with Redis. Media lives on S3, push goes through FCM, and payments for broker subscriptions run through Cybersource.
Chat and calls are CometChat: the SDK on web, and the React Native SDK with WebRTC and CallKeep on mobile so calls behave like real phone calls. The web client is React 19 with Redux Toolkit and MUI; state that must survive a refresh (auth, filters) persists via redux-persist.
05
Outcome
Dallal is live at dallal.com.kw and in both app stores, serving the Kuwaiti market in Arabic and English. It's the project where I do my most end-to-end work — the same feature often lands in Rails, React, and React Native in the same week, and I'm responsible for all three landings.