Skip to content
Back to projects

Case study

Migrating a production taxi app to React Native

How we moved Entaxi's driver app from a hybrid web app to a native app, without stopping operations or rewriting the backend.

Role
Started and led the project
Users
~500 drivers (Rapitaxi)
Stack
React Native · TypeScript · Node
Status
In production, expanding to San Juan

The problem

The driver app was built with Framework7 and packaged with Capacitor: essentially a web page running inside the phone. For an app that stays open all day with GPS and a map, that was expensive.

It used a lot of RAM, felt slow on mid-range devices, and hardware access (background GPS, notifications, network state) went through intermediate layers.

The decision

We chose React Native with TypeScript: direct access to native APIs while staying in the JavaScript ecosystem the team already knew.

Crucially, we did not rewrite everything at once. The legacy PHP backend still served the web app in production, so the new app lives alongside the old one on the same data.

The architecture

The app never talks to PHP directly. A TypeScript Node backend acts as a proxy: it normalizes responses, manages the session and lets us replace legacy pieces one at a time.

React Native app
Node backend (proxy)
Legacy PHP
MySQL
Traccar · GPSFirebase · pushSocket · trips

What I built

  • Real-time map with MapLibre and background GPS tracking integrated with Traccar.
  • Full trip lifecycle: socket-based requests, tracking, payment and rating.
  • Offline mode with SQLite for taximeter mode, designed for towns without a dispatch center.
  • A single codebase with per-brand builds, one per client, published on Google Play.
  • Fee payments with Mercado Pago, commissions, statistics and a panic button.
  • Error monitoring with Sentry and per-release source maps.

What I learned

On the street, the network fails

A lost response doesn't mean the operation failed. We made trip state changes idempotent so a retry never leaves a driver stuck or charges them twice.

Migrate in pieces

The proxy let us ship the native app while the web app kept running, with no "big bang" release risking daily operations.

Start, hand over, keep leading

I took the project to an advanced stage and handed it to the team for maintenance, while still guiding technical decisions.