Problem
The platform required two fundamentally different experiences within the same ecosystem: a customer experience for discovering and requesting services, and an artisan experience for receiving requests and managing jobs. Building two completely separate applications would introduce significant code duplication and increase development and maintenance overhead. The platform also needed real-time capabilities such as messaging, location tracking, and request updates, while integrating maps, media handling, notifications, and identity verification.
Solution
**Merge Usta** was developed as a unified Flutter application combining both customer and artisan experiences within a single codebase. A GetX-powered App Switcher enables switching between Customer Mode and Artisan Mode while shared core utilities and services reduce code duplication. The solution integrates Socket.io for real-time messaging and tracking, Firebase for notifications, Google Maps and Geolocator for location services, Google ML Kit for face detection, and dedicated media handling for images, audio, and video.
Architecture
The project follows a **Feature-First Modular Architecture** with clear separation between Customer and Artisan functionality, supported by a shared application and core services layer. Each experience maintains its own Core, Data, and Feature modules, while reusable services and utilities are shared between both sides. GetX handles state management and routing, Dio manages REST API communication, Socket.io provides real-time connectivity, and Flutter Secure Storage and Shared Preferences handle local persistence. This structure allows two distinct application experiences to coexist within one codebase without unnecessarily coupling their features.
Challenges
The primary challenge was combining two fundamentally different experiences into a single application while keeping the architecture clean and preventing Customer and Artisan business logic from becoming tightly coupled. The real-time engine also had to continuously handle location updates, messaging, and service request states while maintaining reasonable application performance and resource usage. Supporting multiple media types, including images, audio, and video, alongside maps, face verification, and push notifications also required integrating several technologies into a cohesive mobile experience.
Results
The result is a unified mobile application capable of delivering two distinct experiences for customers and artisans within a single codebase. The modular architecture reduces duplication across shared components and services while making the platform easier to maintain and extend. The application provides an integrated marketplace experience covering service discovery, request management, real-time communication, live location tracking, artisan job management, notifications, media sharing, and identity verification, with full Arabic and English localization support.
Merge Usta is a comprehensive Flutter application for a home services marketplace connecting customers with professional artisans through a unified mobile platform.
Instead of maintaining two separate applications and codebases, the project combines both Customer and Artisan experiences into a single application using a GetX-powered App Switcher while sharing common core utilities and services.
The application uses a custom SocketManager powered by Socket.io to support:
Firebase Cloud Messaging is integrated for service requests, messages, and important platform updates.
Google Maps and Geolocator power location-based artisan discovery and real-time tracking during service execution.
The application includes secure local storage for sensitive information and a KYC workflow powered by Google ML Kit Face Detection.
Full Arabic and English localization with RTL support and dynamic language switching.
Merge Usta follows a Feature-First Modular Architecture, separating Customer and Artisan functionality while sharing common core services and utilities.
GetX is used for state management and routing, with dedicated Core, Data, and Feature layers for each application mode.
This architecture allows two distinct user experiences to coexist within a single codebase, reducing duplication while making the application easier to maintain and extend.
Flutter · Dart · GetX · Dio · Socket.io · Firebase · Google Maps · Google ML Kit · Geolocator · Flutter Secure Storage