An app that feels at home on neither platform
It runs on iOS and Android, but the navigation ignores iOS conventions and the back button is missing on Android. Users on both sides can tell something is off.
With React Native or Flutter you ship one codebase to two stores, and neither store has to settle for a second-rate version. The platform details that cross-platform builds usually fumble are handled for you: navigation patterns, native modules, push notifications, biometrics, and in-app purchases.
The cross-platform tools we build with.
Cross-platform promises one codebase serving two stores. The danger is a product that feels native to neither. Your app avoids that through deliberate decisions about exactly where shared code stops and platform-specific code takes over.
It runs on iOS and Android, but the navigation ignores iOS conventions and the back button is missing on Android. Users on both sides can tell something is off.
It runs well on the developer's flagship phone. Then frame rates drop and scrolling stutters on the mid-range Androids that most of the Indonesian market actually uses.
The camera runs into memory issues on some devices. Push notifications quietly fail on iOS 17. Background location behaves differently on Android 14. None of it surfaced until real users started reporting it.
The team picked React Native because someone already knew React. Three months in, they're fighting the framework on a use case it was never meant for.
Each step has a clear deliverable and a written handoff, and we get your sign-off before moving to the next one.
We look at your team's skills, how complex the UI is, which integrations you need, and your performance budget. Then we recommend React Native or Flutter and put the reasoning in writing, rather than going on a hunch.
We work out the navigation structure, state management, module boundaries, and the platform abstraction layer before a single line of code gets written.
Shared business logic and UI components are built against the design system, with automated tests on the shared layer from the first day.
We build the native modules for camera, biometrics such as Face ID and fingerprint, push notifications, background processing, and in-app purchases, then test them on real iOS and Android devices.
We test on a matrix of real Android and iOS devices, not just simulators, spanning a range of OS versions, screen sizes, and performance tiers. The matrix is agreed at the start, and we report against it at the end.
Real deliverables you can point to and outcomes you can measure. Not a slide deck.
Business logic and UI components are shared, while navigation, native integrations, and platform conventions are handled correctly on each OS.
We test on mid-range Androids that reflect the Indonesian market, rather than the flagship phones sitting on the development team's desks.
We recommend React Native or Flutter based on your specific constraints, not on whichever one a developer happens to prefer this month.
Push notifications, biometrics, camera, and payments are all tested across OS versions and device models before the app goes to the stores.
React Native is a good fit when your team already knows JavaScript or TypeScript, you're sharing logic with a web app, or the UI is fairly standard. Flutter tends to win for custom UI, animation-heavy apps, and cases where startup speed on older Android matters. We'll tell you which one fits before you sign anything.
We agree a minimum supported Android version at the start of the project, test against it throughout, and flag anything that would need a newer version. Our default target is Android 10 and up, which covers more than 95% of active Indonesian Android devices.
For most cross-platform work we use React Native or Flutter, because the cost difference is meaningful and the result is hard to tell apart from native. When a project genuinely needs native performance, for example real-time audio, complex AR, or heavy GPU work, we'll say so and scope the native parts properly.
Go native when the app is built around something the platform does uniquely well: heavy real-time audio or video processing, advanced AR with ARKit or ARCore, sustained GPU or game-engine work, or deep system integration like custom keyboards or widgets. For most business apps, content apps, and commerce apps, React Native or Flutter gives you the same feel at a lower cost.
It depends on the app, but typically 85 to 95% of the code is shared: business logic, networking, state management, and most of the UI. The remaining slice is platform-specific work like native modules, store-specific behaviour, and the handful of places where iOS and Android conventions genuinely differ.
For the vast majority of apps, yes. Both React Native (with the new architecture and Hermes) and Flutter render smoothly on mid-range hardware when built properly. We set a performance budget up front and test on real mid-range Android devices, so we catch any heavy screens early rather than after launch.
We use well-maintained native modules where they exist and write custom native modules in Swift or Kotlin where they do not. Face ID and fingerprint, in-app purchases, camera, biometrics, and push are all wired to the real platform APIs and tested on physical iOS and Android devices, not just simulators.
Yes. Both React Native and Flutter let you drop down to native Swift or Kotlin through native modules or platform channels. We design the architecture with a clear boundary for this, so adding a native feature later does not mean rewriting the app.
Yes. We keep the framework and native toolchains current and support new OS releases, including new APIs, permission models, and design changes. We agree a minimum supported OS version at the start and test against both the oldest supported and the newest releases.
Expo speeds up React Native development and we use it where it fits, but it does not trap you. You can use custom native code through development builds and config plugins, and you can move to a bare workflow if the project ever needs it. We choose the setup based on your feature list, not on convenience.
Tell us where the project stands right now. Within one working day we'll come back with a straight read on scope, timeline, and cost. There's no commitment in asking.
Office
Surabaya, Indonesia
Starting price
From USD 4,000
Typical projects: USD 4,000–25,000