Elevation through migration: BlueSG’s transition to Flutter
As Singapore’s leading electric vehicle car-sharing service, mobile is critical to BlueSG's technology strategy. Our customers interface with our core rental service primarily through mobile apps. BlueSG initially maintained two separate native apps, an iOS app written in Swift and an Android app written in Kotlin. Over a 1.5-year development period, the native app codebases changed hands many times, accumulating significant technical debt. Much of the code was written by vendors who no longer worked with the company. As a result, the apps became increasingly difficult to maintain, and even small code changes often introduced bugs. The lack of alignment between the iOS and Android code caused business logic to differ between platforms, creating confusion among customers and employees. Another major issue was the app store review time: a critical bug could take up to 48 hours to fix due to the lengthy review process. These challenges made it clear that we needed a solution that would allow for a unified codebase and a faster release schedule. That’s when we decided to migrate to a cross-platform framework.?
Beginnings?
We evaluated two popular industry cross-platform frameworks: Flutter (written in Dart) and React Native (written in Typescript). Both frameworks offered the ability to share code between iOS and Android, greatly reducing engineering effort. Our mobile team could ship features twice as fast compared to the native apps. Additionally, both Flutter and React Native enabled over-the-air (OTA) app updates via third-party platforms—Shorebird and Expo—eliminating our dependency on app store review for critical patches. Cycle time to patch bugs could be reduced from days to mere hours.?
After deliberation, we settled on Flutter as the better choice for our needs. It provides faster rendering, more native-looking UI components, and better developer experience through features like hot reload. There is also more availability of Flutter developers in Southeast Asia compared to React Native developers, making it easier to build a team. The main benefit of React Native was potential synergies with our TypeScript-based Node.js backend, but this wasn’t enough to outweigh all the other advantages Flutter offered.?
Before making the final decision, I built a prototype Flutter app to assess technical feasibility. Given BlueSG’s IOT hardware requirements, such as camera and GPS access, we needed to understand the framework's capabilities and limitations. Ultimately, Flutter met all of our requirements, and we proceeded with the migration. Especially reassuring was Flutter’s ability to communicate with platform-specific code using method channels, giving us an escape-hatch for complex features.?
?
Development?
Upon moving to Vietnam to spearhead the migration, I began assembling a team of senior Flutter developers. I interviewed over a dozen candidates and finalized a team of four. From the start, we emphasized the importance of careful planning. Significant time was spent architecting the new Flutter app before coding. We carefully evaluated state management frameworks (Riverpod, Bloc), networking libraries (Dio), and development tools (Fastlane). Having a solid foundation laid out beforehand was key to streamlining the development process. As we assessed each framework, we considered factors such as industry adoption, scalability in a large codebase, and learning curve to determine which best suited our needs.?
From the beginning, we knew the Flutter migration would slow our execution on our product roadmap. We needed to pause feature development on the legacy native apps to do the rewrite. Fortunately, the project had strong buy-in from senior management, who understood the business value a cross-platform app would bring to the company. During the rewrite, a skeleton crew handled maintenance on the native apps while the core mobile team focused entirely on Flutter development. To partially make up for the product roadmap delay, we used the opportunity to refresh the user interface with a new design system. We also added small new features like station-clustering. The final Flutter app was not a mere 1:1 rewrite, it was a substantial visual improvement over its predecessor.??
To increase productivity, the team divided work into major epics (e.g., rental, registration, design system) rather than assigning individual JIRA tasks. This approach gave each engineer significant ownership over their part of the project. The migration was completed in five months—significantly faster than the two years it took to build the original native apps. Our QA, Product, and Design teams played a critical role in the later phases. By managing JIRA tasks and performing rigorous testing, they allowed the engineers to focus primarily on shipping high-quality code.
New AI code-generation tools also helped speed up development quite a bit.?I personally used ChatGPT and Codeium to auto-generate countless lines of boilerplate code. Design tools like Figma can even directly convert design mocks into production-ready user interface code, saving huge amounts of time. No more long afternoons wasted adjusting pixels on screen. Mundane coding tasks that formerly took hours can now be finished in under 30 minutes with AI assistance.
?
领英推荐
Release?
The new Flutter app was released incrementally to minimize risk. We began with an internal release, followed by a beta phase with whitelisted testers, then finally public App Store and Play Store release. The public rollout started at 1% of users and gradually increased to 100% of users over the course of a week. During the release, our DevOps team proactively monitored core app metrics (sessions, crashes, exceptions) and flagged potential issues to the developers.?
Due to the strong efforts of the team, the release went exceptionally smoothly. No major bugs were encountered during the public launch. However, within one week of the full rollout, we encountered a critical issue with a third-party provider that required immediate mitigation on mobile. Thanks to Flutter’s unified codebase and Shorebird code push, we were able to ship the mitigation to production within four hours of detection—an impossibility with our old native apps. By migrating to Flutter, we were able to resolve long standing issues with our mobile apps, deliver a superior user experience, and build a foundation for future scalability—all in a fraction of the time and cost it took to develop our original native apps.?
?
Learnings?
1. Cross-Platform is the Future?
Cross-platform frameworks like Flutter and React Native are a game changer for frontend software development. These frameworks offer teams with limited engineering resources the ability to quickly scale products across Android, iOS, web, and desktop. In a competitive business landscape, speed is everything.?
2. Cross-Functional Collaboration is Essential to Success?
While the engineering team executed exceptionally well, the migration would not have succeeded without strong input from our Product, Design, and QA teams. These cross-functional partners resolved UX ambiguity, spotted hard-to-detect bugs, and kept the team aligned during an intense migration period. Most crucially, they helped manage scope by prioritizing which features needed to go into the MVP, and which features could be shipped later.??
3. Vietnam is a Hotbed for Software Engineering Talent?
Our experience building an engineering team in Vietnam was a huge success. The country offers an incredible pool of talented software engineers, and companies looking to build high-performance development teams should strongly consider Vietnam for their hiring needs.?
?
About the author?
Dan is the Lead Mobile Engineer at BlueSG based in Ho Chi Minh City, Vietnam. He manages the team responsible for developing and maintaining BlueSG’s mobile application. Dan has 10+ years of mobile app development experience using Swift, Kotlin, and Flutter. In his free time, Dan likes to learn new technologies and explore cities in Asia.
?
?
Senior Software Engineer
3 个月Inspiring