Skip to content
Vijay Gojiya
All work

Inara Consultancy Services, 2024

Built both applications end to end

Self Ride

Rider and driver in one app, from an empty folder: auth, payments, maps, location, push and deep links.

Shipped

The most technically broad app I have built from scratch. Two entirely different products live inside one binary — the rider and the driver — with their own navigation trees, their own screens and their own idea of what a trip is, resolved from the signed-in user’s role.

That role decision reaches further than the navigator. A push notification about a trip request means different things to the two sides, so deep link resolution reads the notification type and the current role together and routes to the right screen, whether the app was cold, backgrounded or already open. Getting that wrong sends a driver to a passenger screen that cannot exist.

Around that: Firebase authentication with email and password, Google and Apple; Stripe for payments; Google Maps with directions, Places autocomplete and route optimisation; and React Query over the REST API for every trip, preference and payment path. Every screen came out of a Figma file.

What it does

  • Two user experiences in one app: rider and driver, resolved by role
  • Email and password, Google and Apple sign-in
  • Trip search, request, accept and progress, with live map and route
  • Places autocomplete for pickup and destination, and optimised route drawing
  • In-app chat between rider and driver
  • Stripe payments tied to trip status
  • Push notifications that deep link to the right screen for the right role
  • Rider and driver preferences, ratings and trip history

Engineering notes

  • One binary, two products: role-resolved navigation trees rather than two codebases to keep in step
  • Deep link resolution driven by notification type and user role together, handling cold start, background and foreground alike
  • A platform-specific geolocation wrapper, because Android and iOS disagree about what a first position fix costs
  • React Query over REST for server state, Redux Toolkit with redux-persist for client state, MMKV for what has to be read synchronously at startup
  • Stripe payment flows and Firebase authentication both integrated from scratch
  • Built from a Figma file with no existing codebase to start from