Skip to content
CipherCruCipherCru

Menu

Cross Platform Development

Cross Platform App Development Services

One codebase is a decision, not a default. We build with React Native and Flutter where they genuinely serve both platforms, and say so when they do not.

Typical duration
Four to ten months
Team shape
Two to four senior engineers
Starts with
A two-week platform assessment

One codebase, where one codebase is right

Sharing code saves money until the day it does not. The question worth answering first is which parts should be shared at all.

Cross-platform is sold as a way to halve the cost of a mobile product, and for a large class of applications that is exactly what it does. It stops being true at the point where the app needs something the framework does not reach, and by then the decision is usually three years old and nobody remembers making it. So we decide the boundary deliberately: what is shared, what stays native, and the conditions under which we would move a surface across that line.

A build running on a laptop beside the handset it is being tested on
The shared layer is only cheaper while your own team can still change it.

Where sharing a codebase stops paying

Cross-platform goes wrong when it is chosen as a default rather than decided.

What we are usually called in to fix

  • A shared codebase with two platform-specific forks growing quietly inside it
  • Native modules written once, by someone who has since left
  • An app that feels borrowed on both platforms and native on neither
  • A framework upgrade nobody dares run because the build is undocumented
  • Performance problems that only appear on the older half of the install base

How we work instead

  • Decide what is shared and what stays native before writing either
  • Keep the native layer small enough for your own team to own
  • Follow each platform's conventions, even where the code is common
  • Exercise the framework upgrade path rather than deferring it
  • Write down the conditions under which we would move a surface to native

What that involves

The engineering that decides whether a shared codebase is still cheaper in year three.

Shared interface engineering

One component layer that still respects each platform's navigation and gestures.

Native modules

Written where the framework runs out, and small enough for your team to maintain.

Shared backends

One API behind both stores, so a change lands once rather than twice.

Release engineering

Two store submissions from one pipeline, run by your engineers rather than ours.

Performance

Measured on the older half of your install base, where shared code shows first.

Exit routes

A written path to native for any surface that outgrows the shared layer.

What we build with

Chosen for how much can honestly be shared, and for what happens at the edge where it cannot.

  • React Native
  • Flutter
  • Expo
  • TypeScript
  • Dart

Where we have built this

Sectors where one codebase has carried a production product, and we know where the boundary fell.

A lecture room seen from the back, a laptop in the foreground playing a course video beside its numbered module list, the same course open on a phone

EdTech & eLearning

Learning platforms designed around engagement and scale.

From learner journeys and course delivery to assessments, administration, analytics, and integrations, we develop education platforms that make learning experiences easier to operate, evolve, and scale.

A clinician talking with a patient at the bedside while a monitor shows that patient's record - vitals, scans and recent reports - with the same case open on a phone

Healthcare

Technology that connects complex care and operational workflows.

We help build digital healthcare platforms, operational workflows, integrations, and data-driven applications designed around reliability, secure information handling, usability, and the realities of interconnected healthcare systems.

A banking hall desk where a laptop shows an account dashboard with a running balance, recent transactions and a monthly activity chart, a phone beside it

Fintech & BFSI

Secure, reliable systems for businesses built on trust.

We build and modernize financial platforms, workflows, integrations, and customer-facing applications where reliability, data integrity, auditability, security, and performance are fundamental to the business.

A gym floor with a phone showing the day's activity - steps against a goal, calories, distance and heart rate - beside a watch tracking a run in progress

Fitness

Digital products designed to turn engagement into progress.

We create fitness platforms supporting member experiences, scheduling, subscriptions, progress tracking, coaching workflows, administration, and integrations, with usability and continued engagement at the centre.

What you end up with

Stated from your side rather than ours.

  • One codebase, two stores

    A feature specified once, built once, and released to both platforms.

  • Native modules where they are needed

    The shared layer stops where it stops paying, and that line is written down.

  • A migration path if you outgrow it

    Any surface can move to native on its own, without rewriting the whole app.

  • A team that can run both releases

    Your engineers ship to both stores from one pipeline before we leave.

How a cross-platform engagement runs

The same five stages whichever of the services above does the work.

Diagnose

What the two platforms genuinely need to share, and what they never will.

Decide

React Native, Flutter or native, with the trade-offs written down. Sometimes it is two apps.

Prove

The hardest shared surface built on both platforms, on real handsets.

Deliver

Built in slices, each one submitted to both stores as it is finished.

Hand over

Your team runs it with us watching, then without us.

Questions about cross-platform development

The ones we are asked most often before a first conversation.

React Native or Flutter, which do you recommend?
It usually follows your team rather than the benchmark. If your engineers already write TypeScript, React Native keeps the mobile app inside a skill set you can hire for and review. If the interface has to look and behave identically on every platform, and you want the same codebase to reach the web, Flutter is the stronger choice. Both are capable of the same applications; the difference that matters is which one your team can still change in three years.
When would you tell us not to go cross-platform?
When the value of the app is in the parts the framework does not reach. Heavy camera or sensor work, background processing, tight platform integrations, or anything where you need a new OS capability the week it ships. In those cases the shared layer ends up so thin that you are maintaining a framework as well as two native apps.
Will the app actually feel native?
It can, but not for free. Shared code makes it very easy to ship one set of navigation, gestures and typography to both platforms, and users notice on whichever one it was not designed for. We follow each platform's own conventions even where the code is common, which costs a little more in the shared layer and is the difference between an app that feels made for the phone and one that feels ported to it.
What happens when the framework has a breaking release?
It is treated as scheduled work rather than an emergency. Both frameworks move fast enough that skipping upgrades for a year turns a routine change into a project, so we keep the upgrade path exercised while we are building and document what the app depends on. That way the decision to take an upgrade is about timing rather than risk.
Can we move to native later without starting again?
Yes, if the boundary was drawn deliberately at the start. Both frameworks can host native screens inside a shared app, so a surface that outgrows the shared layer can be replaced on its own while everything else keeps running. That is the whole reason we write down where the line sits.
What happens after launch?
Your engineers have been shipping to both stores alongside ours since the first slice, so the pipeline is already theirs by the time the app is public. What we agree separately is how much of our time you want afterwards, and that is a decision you make once you have seen it running.

Deciding whether one codebase is right?

Tell us what the two platforms have to do. We will tell you whether they should share a codebase.

Strictly necessaryEssential for the site to function: page navigation, security, session management, and remembering the cookie choices you make here.
Always on
FunctionalRemembers choices you make, such as language, region or display preferences, so the site opens the way you left it.
Performance and analyticsPerformance and analytics cookies show us how the Website is used: which pages are visited, how long is spent on them, where visitors came from, and what errors occur. They are set by Google Analytics and by HubSpot, whose cookies also link the pages you viewed to any enquiry you later send us.
Marketing and targetingTracks browsing activity to measure advertising and show relevant ads. We set none of these today, and will not without your opt-in.